2011-11-27 12 views
9

Ho cercato di ottenere un controller/visualizzazione incredibilmente semplice e non riesco a farlo funzionare. Nel mio web.xml, ho definito uno <servlet> chiamato servlet-context.xml, che è in esecuzione ok. In servlet-context.xml, ho impostato:Spring 3.0.6 MVC @PathVariable e @RequestParam vuoto/vuoto nella vista JSP

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 

<...other stuff in here... /> 

<mvc:annotation-driven /> 

tra le altre cose. La mia comprensione è che questo è tutto ciò che è necessario per utilizzare le annotazioni @.

Nel mio controller, ho:

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET) 
public String adminStudent(@PathVariable String username, @RequestParam String studentid) { 
    return "student"; 
} 

E nella mia student.jsp vista, ho:

<p>This is the page where you would edit the stuff for ${username}.</p> 
<p>The URL parameter <code>studentid</code> is set to ${studentid}.</p> 

Quando faccio una richiesta di http://localhost:8080/application/student/xyz123/?studentid=456, ho la vista mi aspetto, ma tutte le variabili sono vuote o nulle:

<p>This is the page where you would edit the stuff for .</p> 
<p>The URL parameter <code>studentid</code> is set to .</p> 

Ho il sospetto che sia un problema con il modo in cui sono impostati il ​​mio web.xml o servlet-context.xml, ma non riesco a trovare il colpevole da nessuna parte. Non c'è nulla che appare in nessun registro, per quanto posso vedere.


Aggiornamento: stavo basando il mio codice fuori questa parte del spring-mvc-showcase:

@RequestMapping(value="pathVariables/{foo}/{fruit}", method=RequestMethod.GET) 
public String pathVars(@PathVariable String foo, @PathVariable String fruit) { 
    // No need to add @PathVariables "foo" and "fruit" to the model 
    // They will be merged in the model before rendering 
    return "views/html"; 
} 

... che funziona bene per me. Non riesco a capire perché questo esempio funzioni, ma il mio no. È perché sono doing something different con servlet-context.xml?

<annotation-driven conversion-service="conversionService"> 
    <argument-resolvers> 
     <beans:bean class="org.springframework.samples.mvc.data.custom.CustomArgumentResolver"/> 
    </argument-resolvers> 
</annotation-driven> 

risposta

7

Aha! Capito, finalmente.

spring-mvc-showcase utilizza Spring 3.1, che esporterà automaticamente @PathVariable s al modello, in base a SPR-7543.

Come sottolineato da @duffymo e @JB Nizet, l'aggiunta al modello con model.put() è la cosa da fare per le versioni di Spring precedenti alla 3.1.

Ted Young mi ha indirizzato nella giusta direzione con Spring: Expose @PathVariables To The Model.

+1

Devi accettare la tua risposta, poiché è quella giusta. –

15

creare una mappa per modello e aggiungere tali parametri coppie nome/valore ad esso:

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET) 
public String adminStudent(@PathVariable String username, @RequestParam String studentid, Model model) { 
    model.put("username", username); 
    model.put("studentid", studentid); 

    return "student"; 
} 
+0

Grazie mille o la risposta! Ho aggiunto un esempio agli sviluppatori Spring: lo apprezzerei molto se potessi spiegare perché funziona. – alexmuller

4

@PathVariable significa che l'argomento metodo annotato deve essere estratto dal percorso del URL invocato. @RequestParam significa che l'argomento del metodo annotato deve essere estratto dai parametri della richiesta. Nessuna di queste annotazioni causa l'inserimento degli argomenti annotati nella richiesta, nella sessione o nell'ambito dell'applicazione.

${username} significa "scrivere il valore dell'attributo nome utente (trovato nella pagina, o richiesta, sessione o ambito applicazione) nella risposta". Poiché non hai incluso alcun attributo username in nessuno di questi ambiti, non scrive nulla.

Il codice funzionerebbe se il metodo restituiva un oggetto ModelAndView e il modello conteneva un attributo username e un attributo studentid.

+0

Grazie mille per la risposta! Ho aggiunto un esempio agli sviluppatori Spring: lo apprezzerei molto se potessi spiegare perché funziona. – alexmuller

+0

Forse ho sbagliato, quindi, e Spring aggiunge automaticamente variabili di percorso al modello. Il documento di riferimento dice che tali variabili di percorso funzionano solo se cebugging è abilitato durante la compilazione. Vedi http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-requestmapping-uri-templates. Prova con @PathVariable ("username") e @PathVariable ("studentid") –

1

Assumere questo URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 (per ottenere le fatture per l'utente 1234 per oggi)

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET) 
public List<Invoice> listUsersInvoices(
      @PathVariable("userId") int user, 
      @RequestParam(value = "date", required = false) Date dateOrNull) { 
     model.put("userId", user); 
     model.put("date", dateOrNull); 

} 
Problemi correlati