2009-04-17 11 views
1

Ich verwende Spring SimpleFormController für die Formularverarbeitung. In meinem Fall kann die Bearbeitungsansicht (JSP) variieren, je nachdem, was bearbeitet wird. SimpleFormController 's formView ist ein Feld (Klassenvariable), was bedeutet, dass es von allen Threads geteilt wird, die die Instanz verwenden. Daher ist es nicht sicher (und nicht angemessen), das FormularView (über setFormView) in formBackingObject zu setzen. Meine Frage ist, ist es möglich, SimpleFormController mit verschiedenen Bearbeitungsansichten basierend auf einigen Kontext verwenden?Verschiedene Ansichten mit Spring SimpleFormController

Folgen up: Nach dem an der Quelle suchen scheint es, dass ich showForm(HttpServletRequest req, HttpServletResponse resp, BindException errors) und rufen außer Kraft setzen kann showForm(HttpServletRequest req, BindException errors, String viewName) mit dem, was Ansicht ich will.

+0

Verdammt, ich tippte und beantwortete Ihre eigene Frage schneller :) Viel Glück für Sie. Es ist einfach zu verwenden, sobald Sie es zurück nach oben verfolgen - aber ich wünschte, es wäre besser. Ich hatte jedoch kein Glück mit dem Annotationsansatz - es verwirrt mich nur, ich würde lieber meinen eigenen Controller mit der Controller-Schnittstelle programmieren. – MetroidFan2002

+0

Ich sollte darauf hinweisen, dass ich im Frühling viel mehr Zeit hatte, die Annotation Controller zu lernen und zu benutzen, und sie sind erstaunlich. Der Konvertierungsdienst benötigt jedoch mehr Arbeit für die Verarbeitung generischer Typen (z. B. Listeninstanzen mit bestimmten beschränkten Typen). – MetroidFan2002

Antwort

3

Ich glaube, SimpleFormController bietet zwei "ShowForm" geschützte Methoden. Diese können überschrieben werden, und die BindException wird verwendet, um das "Ziel", das Ihr Formularobjekt ist, abzurufen. Sie können dann eine ModelAndView basierend auf einer gebundenen Formularobjekteigenschaft zurückgeben. Sie sollten sich auch processFormSubmission ansehen, es gibt vor, welche Methoden wirklich aufgerufen werden. Eine weitere Methode ist "isFormChangeRequest", die festlegt, ob sich Ihr Formular ändern soll - Sie können dies verwenden, um dies auf "true" zu setzen, und dann showForm mit der Anfrage, der Antwort usw. aufrufen und die Anfrage erneut prüfen.

Die einzige Möglichkeit, wie Sie diese Hierarchie verwenden können, besteht darin, sie zu untersuchen. Es ist nicht sehr gut - es bietet viele Dinge, aber nicht sehr gut. Spring MVC muss normalerweise erweitert werden, damit es sehr nützlich ist.

+0

Ich würde gerne mehr darüber erfahren, was die gepackten Controller in Spring MVC "nicht sehr gut" machen. Persönlich finde ich sie als Ausgangspunkt sehr nützlich –

+0

Sie sind groß als Ausgangspunkt, aber sie bieten zu viele geschützte Methoden, die Sie dann zurück zu der Quelle von wo es aufgerufen werden müssen. Auch wenn Sie ihren Controller auf eine andere Art und Weise verwenden möchten, ist es schwierig, den Nebeneffekt zu finden. Ich hatte zum Beispiel einen Formular-Controller, den ich das Formular-Objekt speichern musste, so dass es auf einen anderen Controller umleiten konnte, der das Objekt aus der Sitzung verwendete, um die Daten anzuzeigen - aber unknonston entfernt die Formular-Controller das Objekt – MetroidFan2002

+0

.. . Nun, es sagt dies auf der Javadoc für einige Methoden, aber es gibt so viele geschützte Methoden, es ist schwierig zu finden, welche tatsächlich verwendet werden müssen. Die Hierarchie ist einfach zu komplex - eine Klasse mit "Simple" in ihrem Namen erweitert sechs Klassen (ignoriert die Object-Erweiterung) und hat wahrscheinlich etwa 50 Methoden, ist lächerlich und ist ein Schlüsselindikator für schlechtes Design. Zu viel Erweiterung, nicht genug Gebrauch. – MetroidFan2002

0

Ich glaube nicht, dass es mit SimpleFormController machbar ist.

Sie könnten versuchen, die Controller-Hierarchie-Klassen, die ohnehin veraltet sind, nicht mehr zu verwenden, und werfen Sie einen Blick auf mit Spring 2.5 eingeführte annotierungsbasierte Controller. Sie ermöglichen eine viel flexiblere Handhabung der Formulare. Lassen Sie sich nicht abschrecken, wenn Sie die Autoinjektion nicht mögen. Obwohl keines der Beispiele es wirklich offensichtlich macht, können Sie annotierungsgesteuerte Controller verwenden und alle Beans in einem XML-Inhalt definieren.

Verwandte Themen