Qual è il modo corretto per passare i parametri in un sistema MVC?

4

Sto cercando di imparare java servlet / jsp con il concetto MVC e ho creato la più semplice applicazione MVC. Ora voglio dare maggiori dettagli per migliorare la mia comprensione.

Se dovessi registrare una nuova riga in una tabella nel database, come dovremmo passare il diverso valore della colonna nel sistema?

Ad esempio, l'utente potrebbe voler registrare un nuovo evento nel suo pianificatore e il dettaglio dell'evento coinvolge "dove", "quando", "chi", "dettagli", ecc. Dovrebbe passare tutto questo lungo valore dal parametro servlet, ovvero: http link?

String accNo = request.getParameter("account_number");
String a = request.getParameter("...");
String b = request.getParameter("...");
String c = request.getParameter("...");
String d = request.getParameter("...");

Per illustrare il mio punto di vista, è davvero poco professionale mostrare tutti i parametri sul link:

http://localhost:8080/domain1/servlet1?param1=55555555555555&param2=666666666666666666666666666666666666666666666666666666666666&param3='Some random detail written by user.........................'

C'è un altro modo per superarli?

    
posta lamwaiman1988 14.05.2012 - 05:15
fonte

2 risposte

2

Passaggio dei parametri a più livelli:

Ad esempio, Spring MVC esegue il binding dei parametri di richiesta con nome simile (parametri post body o parametri stringa query url) ai parametri del metodo controller. Questo interrompe i parametri dalla loro rappresentazione nella richiesta HTTP e li rende ragionevoli parametri Java per un metodo. Se stai trasmettendo dati ai servizi nel tuo modello dal controller, ci sono tre modi di pensare.

Il primo è passare gli oggetti del modello che si riempiono dai dati dei parametri e passarli ai propri servizi. Dato che probabilmente stai usando una sorta di mappatore O / R come JPA o Hibernate, dovrai unire questi oggetti nella sessione di ibernazione o nel contesto di persistenza jpa. Tuttavia, hai i tuoi modelli più strettamente accoppiati ai tuoi controller.

In secondo luogo è di passare semplici tipi di Java per mantenere i vostri servizi e i vostri controller più strettamente accoppiati. Per oggetti complessi con diversi campi, questo è un dolore. Inoltre, quando hai diversi parametri int di una riga, la possibilità di capovolgerne due per errore è piuttosto buona.

La terza opzione consiste nel definire un oggetto di trasferimento dati che viene passato al metodo di servizio, che a sua volta manipola il modello. Il DTO potrebbe contenere campi che è possibile associare a due o più oggetti nel modello, ma ora la logica del controller è solo accoppiata al DTO e si potrebbe comunque evolvere il modello indipendentemente dal Controller.

Okay, in modo tale che i dati da HTTP passino attraverso il controller al modello. Questo è l'attuale modo "migliore pratica" per creare applicazioni Java, ma potrebbe non essere il migliore per la tua applicazione. (Tuttavia, probabilmente è perché funziona per la maggior parte delle applicazioni).

Per quanto riguarda dove collocare quei valori (corpo o parametri richiesti) potrebbe essere utile pensare in termini di REST. In genere, quando hai un modulo per aggiungere nuovi dati o per aggiornare i dati, invierai i parametri nel corpo del post. Puoi pensare che le operazioni siano "pericolose" (alterano lo stato della tua applicazione) o "sicure" (non cambiano nulla). (Si noti che le modifiche accidentali come la registrazione non contano.) Le operazioni possono anche essere idempotenti, ovvero possono essere eseguite più volte e lo stato del sistema è uguale a quello che era dopo la prima chiamata.

Le operazioni pericolose e non identi che dovrebbero essere POST. Le operazioni pericolose ma idempotenti dovrebbero essere un DELETE o PUT. (Si noti che alcuni browser supportano solo i POST, quindi è sufficiente attenersi al POST). I parametri dovrebbero essere codificati nel corpo del POST. In genere non utilizzeresti i parametri della stringa di query.

Le operazioni sicure e idempotenti dovrebbero essere un GET. È perfettamente accettabile codificare parametri aggiuntivi nella stringa dell'URL per facilitare il funzionamento di GET. Ad esempio, se si ricerca con il nome utente, aggiungere? Username = the + user come parametro di query va bene. O per distinguere i record? Id = 23. Alcune persone credono che gli URL possano essere riposanti solo se includono il componente identificativo come parte del percorso del documento / utenti / 23, ma non credo sia corretto dal momento che / utenti? Id = 23 è unico come / users / 23 . (E non lo ricordo dalla dissertazione di Fielding - ma ho una memoria schifosa).

    
risposta data 20.03.2013 - 05:44
fonte
0

Bene, non mescolare concetti.

Da un lato ...

MVC è un modello architettonico del software . Può essere applicato anche alle app desktop, dove HTTP non è necessariamente coinvolto.

Nell'altro lato ...

HTTP è un protocollo di comunicazione. Come dice Wikipedia:

is an application protocol for distributed, collaborative, hypermedia information systems

Quindi, stai chiedendo se HTTP supporta un altro modo per passare l'informazione (parametrizzata) alternativa alle stringhe di query

Richiesta

Le comunicazioni HTTP sono fatte in termini di Richieste e Risposte

In ogni richiesta viene anche indicato un METODO . È solo un'istruzione all'applicazione lato server per dire a cosa ci aspettiamo che il server debba fare con le informazioni che inviamo . Ma non è un meccanismo per passare le informazioni . È un'istruzione aggiuntiva, non di più né meno.

Accanto ai metodi , qui abbiamo 3 possibili modi per passare parametri al server

1. Stringa di query

Metodo coinvolto: RICEVI

L'informazione viene informata (parametrizzata) nell'URL. Questo è l'esempio che hai esposto

http://localhost:8080/domain1/servlet1?param1=X&param2=X&param3='X'

La sua capacità è limitata a 64Kb (se la memoria serve). Questo è il modo base

2. BODY

Metodi coinvolti: POST | PUT

Un messaggio è previsto nel corpo della Richiesta . Questo messaggio è noto come payload , forma , corpo ma può anche essere binari. Il formato del messaggio può essere xml , testo semplice , json , ....

Tuttavia, siamo ancora in grado di passare informazioni tramite stringa di query nella stessa richiesta. Quindi parte delle informazioni sarà nell'URL e un'altra parte sarà nel corpo della richiesta

Le informazioni qui vengono crittografate se stiamo lavorando in ambiente SSL.

Per informazioni di base ed esercitazioni, consulta questo link W3Schools - Html Forms . Prendilo come esempio di come inviare informazioni tramite moduli da un modulo html.

3. INTESTAZIONE

Metodi coinvolti: Qualsiasi

Qualsiasi richiesta da A a B (essendo B il lato server) ha un'intestazione . Le informazioni qui non sono destinate ad essere elaborate dall'attività della tua app. Non sono dati correlati alla tua attività. Tuttavia puoi inserire informazioni comunque. È il luogo in cui vengono informati i token di sicurezza tra un cliente e qualsiasi resto API protetto. Inoltre alcuni altri parametri relativi all'ambiente e alcuni parametri indirizzati al web server. Informa anche il tipo di contenuto previsto nella risposta e anche il tipo di contenuto delle informazioni inviate (xml, json, binary, multipart, ecc.)

Quindi ci sono altri modi per informare i parametri sul server. Ma il modo di implementare tali modi dipende dalla tua piattaforma . Ci sono molte piattaforme e framework orientati a rendere questo compito facile. A questo punto avremmo bisogno di sapere su quale piattaforma è in esecuzione il tuo progetto. Su quale linguaggio di programmazione si sta costruendo.

Infine vorrei sottolineare che Rest non può essere descritto come un meccanismo supportato dal protocollo HTTP per passare informazioni. È uno stile architettonico del software.

Utilizza il sintassi dell'URL per passare informazioni, mettiamola È una convenzione, non un meccanismo del protocollo

Alla tua risposta

If I would need to register a new row in a table in the database, how should we pass the various value of column into the system?

Il modo migliore sarà: POST , usando moduli html . Consulta W3schools - Moduli HTML

Un altro modo può essere: POST , usando Ajax . In questo modo ha più complessità. Ma ti consente di inviare una serie di modifiche in una singola richiesta. Per farlo tramite il modulo Html è un po 'più complicato.

Sarebbe bello sapere quali librerie o quadri stai usando nel tuo progetto.

Nota : è inteso in questo post per fare un'introduzione breve, non tecnica a HTTP. Qualsiasi soluzione o modo migliore per dire quello che ho cercato di spiegare è il benvenuto.

    
risposta data 26.04.2016 - 18:08
fonte

Leggi altre domande sui tag