【问题标题】:Spring integration with Struts 1 - injecting dependencies to the ActionFormSpring 与 Struts 1 的集成 - 将依赖项注入到 ActionForm
【发布时间】:2010-12-14 08:30:10
【问题描述】:

我们正在扩展一个旧的 Struts 1 项目以由 Spring 管理 - 但我们希望尽可能少地更改代码和流程。因此,我们决定让 Struts 来管理请求,并通过 org.springframework.web.struts.DelegatingActionProxy 类委派操作。

例子:

struts-config.xml 包含:

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

action-servlet.xml 包含:

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

现在剧情变厚了

普通 Spring bean 已在 applicationContext.xml 中定义。一个例子:

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

我现在希望将parserUtils bean 连接(不是自动 - 但这不是问题)到 ActionForm

如果我想将其连接到 Action,我只需在 action-servlet.xml 中定义以下内容:

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

struts-config.xml 中有以下内容:

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

但 stuts-config 还包含以下 ActionForm 定义:

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

我希望将parserUtils bean 连接到 CaseUpdateForm 类。

我必须做什么?

谢谢大家!

【问题讨论】:

标签: java spring spring-mvc struts


【解决方案1】:

我好像找到了解决办法:

在 struts-config.xml 文件中我已更改:

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

到:

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

我在 action-servlet.xml 文件中添加了以下内容:

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

还有:

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

我在 CaseUpdateForm.java 类文件中添加了以下内容:

private ParserUtils parserUtils;

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

CaseUpdateAction.java 类文件如下:

private CaseUpdateForm caseUpdateForm;

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

最后的方法:

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

将以下代码行插入其中:

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

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

我还必须在类路径中包含以下 jar:

spring-webmvc.jar

那是由于类的用法:ServletRequestDataBinder

【讨论】:

    【解决方案2】:

    您始终可以选择以编程方式从 Spring 上下文中获取 parserFactory bean。

    Spring 的 DispatcherServlet 将 servlet 的应用程序上下文作为会话属性“发布”。您可以从那里检索应用程序上下文,并从该上下文中手动获取您的parserFactory

    让你开始的东西:

    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);
    }
    

    如您所见,您需要访问ServletContext 对象(您的ActionForm 应该能够使用getServlet().getServletContext() 获得),以及Spring servlet 的名称(如web.xml 中定义的),加上您需要检索的 Spring 应用程序上下文中 bean 的名称。

    这很丑陋,但如果您可以访问上述信息,它应该可以工作。

    【讨论】:

    • 我试图避免所有这些,并以某种方式“神奇地”配置所有这些:)
    • Struts 没有什么神奇之处。由于您的 Struts 对象不是 Spring 管理的(只是委托),因此 Spring 对它们的构造或配置没有发言权。
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2012-08-22
    相关资源
    最近更新 更多