Spring MVC 从 2.5 到 3.0

Posted

技术标签:

【中文标题】Spring MVC 从 2.5 到 3.0【英文标题】:Spring MVC from 2.5 to 3.0 【发布时间】:2011-01-31 19:00:50 【问题描述】:

我们正在将我们的 Web 应用程序从 Spring 2.5 迁移到 Spring 3.0.5。看起来所有控制器类(org.springframework.web.servlet.mvc 包中的类:BaseCommandController、AbstractCommandController、SimpleFormController 等)已被弃用。我们在应用程序中大量使用了这些类。这些类已被 @Controller 注解取代。

我有几个关于 Spring 3.0.x 控制器配置的问题...

    我们使用以下 XML 在 Spring 2.5 中创建了一个 Controller bean。如果使用 来创建 Controller bean,那么我如何连接依赖项?如果可能的话,我想避免自动接线。

<bean id="photosetViewController" class="com.xyz.web.PhotosetViewController"
    p:photosetManager-ref="photosetManager"
    p:photoManager-ref="photoManager" />
    我们创建了 3 个拦截器。我们使用 SimpleUrlHandlerMapping 将这些拦截器映射到不同的请求 URL,并将 URL 映射到控制器。我们如何在 Spring 3.0.x 中实现相同的目标?

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="alwaysUseFullPath" value="true" />      
       <property name="interceptors">
           <list>
               <ref bean="httpRedirectInterceptor"/>
               <ref bean="loginInterceptor"/>
           </list>
       </property>      
        <property name="mappings">
            <value>             
                /abc.html=abcLookupController
                /photoupload.html=photoUploadController
          </value>
        </property>
</bean>

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="alwaysUseFullPath" value="true" />      
       <property name="interceptors">
           <list>
               <ref bean="httpRedirectInterceptor"/>
               <ref bean="loginInterceptor"/>
               <ref bean="userMenuInterceptor" />
           </list>
       </property>      
        <property name="mappings">
            <value>
                /index.html=homepageController
                /success.html=simpleController
            </value>
        </property>
</bean>
    对于 SimpleFormController,我们使用了不同的方法,例如 initBinder、referenceData、formBackingObject。我们还使用了命令对象和验证类。我们如何在 Spring 3.0.x 中实现相同的目标?

<bean id="photosetAddController" class="com.xyz.web.PhotosetAddController"
    p:photosetManager-ref="photosetManager"
    p:photosetTypeManager-ref="photosetTypeManager"
    p:stateManager-ref="stateManager" >
    <property name="validator">
    <bean class="com.xyz.form.PhotosetAddValidator" />
    </property>
    <property name="formView" value="photosetadd" />
    <property name="successView" value="redirect:/photoset" /> 
</bean>

非常感谢任何指针。

【问题讨论】:

请分别提出单独的问题。当然,它们是相关的,但也可以更好地独立回答。 以上所有内容在 Spring 3 中都可以正常工作(已弃用!= 已删除)。这只是意味着现在有一种更好的方法来做这些事情,但你不需要一次性完成所有事情。 skaffman,我听到 Arjen Poutsma(SpringSource 开发人员)的演讲,在未来的版本中将删除不推荐使用的功能。虽然我知道我的应用会在 Spring 3.0 中得到支持,但我觉得我们应该现在而不是以后进行这些更改。 【参考方案1】:

正如 skaffman 所说 - 您的代码无需任何修改即可正常工作。我会简短地回答你的问题:

    您可以使用@Resource(name="beanName") 进行基于名称的注入。但自动装配也是一个不错的选择。 @Autowired@javax.inject.Inject。请注意,您可以使用@Qualifier("name") 来区分具有相同接口/基类的bean。您甚至可以使用 javax.inject 限定符(在文档中阅读所有这些内容)

    拦截器映射可以保持不变

    @InitBinder,表示initBinder方法。另一个我不知道。

【讨论】:

感谢博卓的快速回答!尽管支持已弃用的功能,但根据 Arjen Poutsma 的说法,它们将在未来的版本中被删除。 感谢您将我指向@Resource 注释。将与@Autowired 的组合一起使用。如果通过 而不是像 是的,它们仅通过@Controller 和组件扫描声明。关于映射 - 只需从处理程序中删除 url 映射并仅保留拦截器。 非常感谢,博卓!可能我会使用 mvc:interceptors 标签。这回答了前两个问题。稍后我会弄清楚如何使用注解来获得 SimpleFormController 功能。 &lt;mvc:interceptors&gt; 很好,但我实际上正在使用您的方式(使用处理程序),因为&lt;mvc: 在我的案例中出现了一些问题。记住这一点。

以上是关于Spring MVC 从 2.5 到 3.0的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc配置文件出现红叉

Spring 3.0 MVC:重定向而不将参数添加到我的网址

springmvc 3.0啥时间发部

Spring 3.0 MVC 绑定枚举大小写敏感

关于spring mvc 3.0注解,注入失败的问题

《Spring Data JPA从入门到精通》内容简介前言