Ci sono diversi modi per risolvere questo problema. Ho bisogno di alcune risposte alle domande prima che possa darti una guida solida.
Avete una preferenza per XML vs JSON per richieste Ajax?
Una cosa da notare - non c'è nulla di specifico di jquery su ciò che sto per dirti di fare. È necessario inviare una risposta alla richiesta asincrona jquery in un modulo utile per jquery (XML o json, idealmente), ma sul lato server, sembra proprio una richiesta normale che si verifica quando utilizza una vista che rende XML o JSON invece di HTML. La mia preferenza personale è quella di usare JSON, soprattutto perché il pacchetto spring-json funziona molto bene ed è facile da usare una volta capito come funziona. Raccomando il pacchetto Spring-Json disponibile da http://spring-json.sourceforge.net/ Leggi tutta la documentazione e dovresti avere una buona idea di come funziona.
Nella forma più semplice, la soluzione deve effettuare le seguenti operazioni:
Configurare una vista che utilizza noe dei punti di vista primavera-JSON. Preferisco sojoView per la maggior parte dei casi.
effettuare una richiesta asincrona al server, che restituirà l'elenco degli utenti. Se le sole informazioni necessarie per fornire il set di utenti sono il valore selezionato del menu a discesa, sarebbe piuttosto semplice pubblicare una richiesta GET con il dominio selezionato nella stringa di query. Sul lato server, è necessario un controller che verrà mappato alla richiesta in arrivo e che invierà json o xml per essere elaborato da jquery. Fondamentalmente puoi scrivere un controller totalmente normale, accessibile tramite GET o metodo POST, e aggiungere il tuo elenco di utenti al modello prima di restituire il nome della tua vista JSON. I 3 tipi di vista JSON forniti da Spring-Json renderanno i bean nella tua lista in una struttura JSON e li invieranno al client. È possibile utilizzare tutte le funzionalità standard di DataBinder per analizzare/convertire i parametri in ingresso e qualsiasi errore di convalida genererà messaggi di errore globali o di campo nella risposta JSON che il codice lato client può presentare all'utente.
Nel caso più semplice, il mio codice sarà simile a questo (questo è tutto primavera 2.5. Utilizza annotazioni ma è possibile fare le stesse cose con la configurazione xml nel contesto dell'app.):
@Controller
public class AjaxController {
@RequestMapping("/some/path/selectDomain.json", method=RequestMethod.GET)
public ModelAndView processDomainSelection(@RequestParam(value="domain", required="true") String selectedDomain) {
List<User> users = service.loadUsersForDomain(selectedDomain);
ModelAndView mv = new ModelAndView("sojoView", "users", users);
return mv;
}
}
Se voglio elaborare tramite una richiesta POST, e voglio caricare un oggetto di dominio reale dalla domainValue che viene inviato, posso fare somethign come questo
@Controller
@RequestMapping("/some/path/selectDomain.json")
public class SelectDomainController {
public class FormBean {
protected Domain domain;
public Domain getDomain() {
return domain;
}
public void setDomain(Domain domain) {
this.domain = domain;
}
}
@ModelAttribute("command")
public FormBean getCommand() {
return new FormBean();
}
@InitBinder
public void initBinder(WebDataBinder binder, WebRequest request) {
// this custom editor knows how to load a Domain object from the domainValue string
// if it fails to convert, it can throw an exception, which will result in
// an error being logged against the "domain" field
binder.registerCustomEditor(Domain.class, "domain", new DomainLookupEditor(domainService));
}
@RequestMapping(method=RequestMethod.POST)
public String selectedDomain(@ModelAttribute("command") FormBean command,
BindingResult result,
Model model,
HttpServletRequest request) {
if (result.hasErrors()) {
return "sojoView";
}
Domain domain = command.getDomain();
List<User> users = domain.getUsers();
model.addAttribute("users", users);
return "sojoView";
}
}
Per l'emissione la richiesta Ajax, è possibile utilizzare il modulo jQuery ajaxForm. Supponendo che si dispone di un modulo con ID "selectDomainForm" è necessario js che sembra qualcosa di simile:
function selectDomainSuccessHandler(json) {
// it is possible to send back a 200 response after failing to process the request,
// in which case, the sojoView will have set success=false in the json
if (json.success == true) {
// parse json here and render it into html in your document
} else {
// get field error and global error from json and present to user
}
}
function(selectDomainErrorHandler(xhr, returnCode) {
// do something based on the return code
}
var options = {
success: selectDomainSuccessHandler,
error: selectDomainErrorHandler,
dataType: 'json'
};
$('selectDomainForm').ajaxForm(options);
si può google la documentazione per il modulo ajaxForm al fine di imparare a inviare invece di arrivare e di inviare Grab solo determinati campi e inviarli a un URL che non è l'url del modulo.
Per visualizzare l'elenco di utenti nella pagina, si avrà un div nel codice con un ID come "lista utenti" e si può scorrere gli utenti nel file restituito, creando html per ciascun utente. Basta aggiungere quell'html al div "userList" e apparirà nel browser.