3 Stimmen

Spring-Integration mit Struts 1 - Injizieren von Abhängigkeiten in die ActionForm

Wir erweitern ein altes Struts 1-Projekt, um es mit Spring zu managen - dennoch möchten wir den Code und den Ablauf so wenig wie möglich ändern. Wir haben uns daher entschieden, Struts die Verwaltung der Anfragen zu überlassen und die Aktionen über die org.springframework.web.struts.DelegatingActionProxy Klasse.

Beispiel:

Die Datei struts-config.xml enthält:

<action name="InvalidSession" 
        path="/pages/InvalidSession"
     type="org.springframework.web.struts.DelegatingActionProxy" 
        scope="request">
    <forward name="success" path="/pages/Startup.do" />
</action>

Die Datei action-servlet.xml enthält:

<bean name="/pages/InvalidSession"
      class="com.xxx.actions.InvalidSessionAction" />

Jetzt wird die Sache komplizierter :

Normale Spring Beans wurden in der applicationContext.xml definiert. Ein Beispiel:

<bean id="parserUtils" class="com.xxx.el.parser.ParserUtils" >
    <property name="parserFactory" ref="parserFactory"/>
</bean>

Ich möchte nun (nicht automatisch - aber das ist kein Problem) die parserUtils Bohne an eine ActionForm .

Hätte ich es mit einem Aktion Ich würde einfach das Folgende in der action-servlet.xml definieren:

<bean name="/pages/CaseUpdate"
      class="com.xxx.actions.CaseUpdateAction" >
   <property name="parserUtils" ref="parserUtils" />
</bean>

wobei in der struts-config.xml folgendes steht:

<action path="/pages/CaseUpdate" 
        name="CaseUpdateForm"
     type="org.springframework.web.struts.DelegatingActionProxy" 
        scope="request">
   <forward name="success" path="/pages/SwitchView.do" />
</action>

Die stuts-config enthält aber auch Folgendes ActionForm Definition:

<form-bean name="CaseUpdateForm"
           type="com.xxx.forms.CaseUpdateForm" />

und ich möchte die parserUtils Bean an die Klasse CaseUpdateForm.

Was muss ich tun?

Vielen Dank an alle!

1voto

Yaneeve Punkte 4671

Es scheint, dass ich eine Lösung gefunden habe:

In der Datei struts-config.xml habe ich geändert:

<form-bean name="CaseUpdateForm"
           type="com.xxx.forms.CaseUpdateForm" />

zu:

<form-bean name="CaseUpdateForm"
           type="org.springframework.web.struts.SpringBindingActionForm" />

Ich habe der Datei action-servlet.xml Folgendes hinzugefügt:

<bean name="CaseUpdateForm" 
      class="com.xxx.forms.CaseUpdateForm" >
   <property name="parserUtils" ref="parserUtils" />
</bean>

Und:

<bean name="/pages/CaseUpdate" 
      class="com.xxx.actions.CaseUpdateAction" >
   <property name="caseUpdateForm" ref="CaseUpdateForm" />
</bean>

Ich habe der Klassendatei CaseUpdateForm.java das Folgende hinzugefügt:

private ParserUtils parserUtils;

public void setParserUtils(ParserUtils parserUtils) {
    this.parserUtils = parserUtils;
}

Und das Folgende in der Klassendatei CaseUpdateAction.java:

private CaseUpdateForm caseUpdateForm;

public void setCaseUpdateForm(CaseUpdateForm caseUpdateForm) {
    this.caseUpdateForm = caseUpdateForm;
}

Schließlich die Methode:

public ActionForward execute(ActionMapping mapping,
                     ActionForm form,
                 HttpServletRequest request,
                 HttpServletResponse response) 
                throws Exception 

wurden die folgenden Codezeilen eingefügt:

SpringBindingActionForm springBindingActionForm = (SpringBindingActionForm) form;
ServletRequestDataBinder binder = 
    new ServletRequestDataBinder(caseUpdateForm, "CaseUpdateForm");

binder.bind(request);
springBindingActionForm.expose(binder.getBindingResult(), request);

Außerdem musste ich die folgende Jar-Datei in den Klassenpfad aufnehmen:

spring-webmvc.jar

Dies ist auf die Verwendung der Klasse zurückzuführen: ServletRequestDataBinder

0voto

skaffman Punkte 389758

Sie haben immer die Möglichkeit, die parserFactory Bohne aus dem Spring-Kontext.

Der Frühling DispatcherServlet "veröffentlicht" den Anwendungskontext des Servlets als Sitzungsattribut. Sie können den Anwendungskontext von dort abrufen und manuell Ihre parserFactory aus diesem Kontext.

Etwas für den Anfang:

public Object getBean(ServletContext servletContext, String servletName, String beanName) {
    String attrName = FrameworkServlet.SERVLET_CONTEXT_PREFIX + servletName;
    BeanFactory beanFactory = (BeanFactory) servletContext.getAttribute(attrName);
    return beanFactory.getBean(beanName);
}

Wie Sie sehen können, benötigen Sie Zugang zum ServletContext Objekt (das Ihr ActionForm bekommen können, indem sie getServlet().getServletContext() ), plus den Namen des Spring-Servlets (wie in web.xml definiert), plus den Namen der Bean im Spring-Anwendungskontext, die Sie abrufen müssen.

Es ist ziemlich hässlich, aber es sollte funktionieren, wenn Sie Zugang zu den oben genannten Informationen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X