Rückkehr java.util.Liste aus einem Spring MVC controller via AJAX mit Jackson
Basierend auf meine Frage gepostet vor ein paar Tagen, ich erkannte, dass SimpleFormController
ist ungeeignet für die Handhabung von Ajax-Anfragen. Deshalb bin ich die Migration meiner Anwendung hin zu kommentierten Controller.
Ich versuche, um wieder eine java.util.List
aus der Oracle-Datenbank mithilfe von Spring MVC 3.0.2 mit Hibernate via Ajax mit Jackson 1.9.8 (download Seite), aber ich habe noch nicht gearbeitet, JSON, in jeder Technologie. Ich Las einige tutorials/Artikeln, aber ich konnte nicht die Idee, wie die Rückgabe solcher komplexen Datenstrukturen und analysieren diese mithilfe von JSON im Frühjahr. Ich versuche zu lernen JSON-Konzepte wie den ersten.
Was im Grunde versuche ich, ist, wenn ein Land ausgewählt ist, die aus einem Land wählen Sie das Feld, die Staaten entsprechend, das Land sollte aufgefüllt werden aus der Datenbank per Ajax. Ich habe keine genaue Vorstellung darüber, wie die Rückgabe eines java.util.List
über eine Ajax-Antwort, wie Sie analysiert werden, und wieder verwenden es in Java-code. Ich bin nur bis zu dem folgenden Niveau.
JS-code.
function getStates(countryId)
{
$.ajax({
datatype:"json",
type: "POST",
url: "/wagafashion/ajax/TempAjax.htm",
data: "countryId=" + countryId,
success: function(response)
{
$('#msg').html(response);
$('#stateList').val('');
},
error: function(e)
{
alert('Error: ' + e);
}
});
}
Die Methode in der Spring-controller-Klasse, die aufgerufen wird, wenn der Ajax-request wird auf der onchange
Ereignis des Landes, select-box.
@RequestMapping(method=RequestMethod.POST, value="ajax/TempAjax")
public @ResponseBody List<StateTable> getStateList(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response)
{
Session session=NewHibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<StateTable>list=session.createQuery("from StateTable where country.countryId=:countryId order by stateId").setParameter("countryId", new BigDecimal(request.getParameter("countryId"))).list();
session.flush();
session.getTransaction().commit();
return list;
}
Den Staat select-box, die ich brauche zu füllen mit der Liste der Staaten, zurück durch die Ajax-Antwort mit einem <c:forEach></c:forEach>
loop EL.
<form:select path="cmbState" class="validate[required] text-input tooltip" title="Mandatory select field.">
<form:option value="">Select</form:option>
<c:forEach items="${stateList}" var="row">
<c:choose>
<c:when test="${row.stateId==param['stateId'] and deselectCombo!=1}">
<form:option value="${row.stateId}" selected="selected">${row.stateName}</form:option>
</c:when>
<c:otherwise>
<form:option value="${row.stateId}">${row.stateName}</form:option>
</c:otherwise>
</c:choose>
</c:forEach>
</form:select>
<font style="color: red"><form:errors path="stateId"/></font><br/>
Könnte ich nur Ajax-request und-response erfolgreich. Nichts mehr ich könnte verstehen, von denen tutorials über das internet gefunden. Genauer gesagt, wie kann ich die Ajax-Antwort in der items
Attribut des vorhergehenden <c:forEach><c:forEach>
Schleife wie items="${stateList}"
?
Könnten Sie mir einige Tipp/Idee, wie kann ich wieder eine Liste mit Daten und verwenden Sie es in der vorhergehenden Schleife zum füllen der Staat select-box? Könnten Sie bitte führe mich einige Schritte weiter von hier aus?
Ich verwende NetBeans 6.9.1 (nicht Eclipse). In einigen tutorials über Marvan Projekte in Eclipse, es wurde erwähnt, dass die pom.xml
- Datei ist erforderlich, zu konfigurieren, zu zählen <dependencies></dependencies>
(Jackson Abhängigkeit). Es gibt keine solche Sache wie pom.xml
in mein Projekt in NetBeans. Ist es erforderlich, konfigurieren Sie irgendwo in irgendeiner xml-Datei in NetBeans wie die genannten hier?
- Ich bin mir nicht sicher, ob ich die Frage verstehe. die
<c:forEach>
ist ein JSP-tag, und daher führt serverside. Wenn das gerenderte HTML wird der browser des Clients (wo einem AJAX-request gemacht werden würden) wird der code bereits ausgeführt haben. - Recht. Die Auswahl einer Option aus einem select-Feld und basierend auf dem übergebenen Wert durch eine Ajax-Anfrage füllen seine Nachfolger select-box ist eine sehr einfache und sehr übliche Sache. Ich bin andere zu Fragen, wie machen die solche Sachen in Spring MVC. Es bedeutet nicht, dass das, was geschehen soll, nur in einer Weise, die ich zeige hier. Es ist die Sache, die mir einfiel und meine Annahmen vielleicht falsch. Ich könnte die XML-Antwort des Ajax-aber hier, denke ich, das Ding ist nicht geschehen, weil ein controller zugeordnet werden, der mit einer JSP-Seite, die zurückkehren konnten, komplexe Datenstrukturen
- bitte schauen Sie auf hyness die Antwort von unten. Müssen Sie ändern die HTML mit jquery anstelle von server-seitigen code. Eine alternative wäre die Rückkehr html-Code anstelle von json (ajax), aber ich würde es vorziehen, den ehemaligen Ansatz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Strategie, die Sie verwenden sollten, ist, den AJAX-Aufruf von jQuery, nehmen Sie die JSON-Antwort, und es verwenden, um aktualisieren Sie das Formular dynamisch von jQuery java nicht. Die einzige Verwendung kann ich sehen, für die JSP-tags wäre zum Rendern der Seite, wenn es lädt. Hier ist, wie würde ich diesen Ansatz...
Ändern, Ihren controller zu verwenden, der einen GET statt POST. Zum einen, es ist falsch, in RUHE zu nutzen, einen BEITRAG hier (Sie sind nur das abrufen von Daten, die nicht verändert wird). Aber noch wichtiger ist, es macht es einfacher für Sie zum testen des Controllers, indem Sie die URL in einen browser, um die JSON-Antwort. Mit der
@ResponseBody
annotation und darunter Jackson auf der classpath sollte einen JSON-Antwort (es sei denn, Sie haben einige Hibernate lazy loading issues).Sobald Sie überprüfen, ob der controller kehrt JSON, aktualisieren Sie Ihre jQuery-Erfolgs-handler dynamisch füllen Sie das dropdown-Menü. Dies sollte relativ einfach sein. Testen Sie diese im browser.
Schreiben, einen neuen controller zu handhaben diese form der Unterwerfung. In diesem controller ist, dass es nur eine Methode zum zurückgeben der Liste und kommentieren Sie es als
@ModelAttribute("stateList")
. Damit wird die Liste für die Verwendung in Ihrem<c:forEach>
loop Rendern der Seite geladen. Haben Sie eine andere Methode, um die tatsächliche form der Einreichung in der gleichen Steuerung.Andere Sache zu prüfen ist, um eine bessere Trennung der Anliegen, indem er die Datenbank-code in seine eigene service-oder repository. Es ist eine schlechte Praxis zu tun, Daten-Zugriff in einem controller in einer MVC-Architektur. Als bonus, werden Sie nicht brauchen, um doppelten code für das laden der Liste in zwei verschiedenen Controllern.
Sehen Sie sich auch in den Frühling ist
@Transactional
deklarative Transaktions-handling. So brauchen Sie sich nicht zu schreiben code für die Transaktion behandeln. Sie können auch einfach injizieren dieSessionFactory
statt zu schreiben Ihre eigenenHibernateUtils
.Hoffe, das hilft
Edit : In RUHE an, hier sind die HTTP-Methoden abgebildet in Ihre entsprechenden CRUD-Aktionen.
POST
Methode beim ändern von Daten in einem RESTful-controller (oder kommentierte controller), während der DurchführungINSERT
,UPDATE
oderDELETE
als Beispiel? Und was ist mit dem Abruf von Daten (mitSELECT
)? Ist nur dieGET
Methode geeignet? Sollte nicht werden Sie (GET
undPOST
) Synonym verwendet? Übrigens, ich habe das schon gelungen, bei der Umsetzung der Aufgabe in der Frage genannten. Danke.sollten Sie versuchen, Ihre option Liste in der ajax-Antwort anstelle von json wie unter einem
dann sollten Sie es hinzufügen, um Ihre select-box liek, unter einem
oder können Sie erstellen, json auf Server-Side-wie unter einem
in javascript-code