Strust2升级SpringMVC的一些心得

Strust2升级为SpringMVC,建议先不要删除Strust2的相关内容,而是应该在Strust2的基础上加入SpringMVC的相关内容,确保SpringMVC可以完全运行起来后,再删除Strust2相关内容及配置。框架改造的步骤大致如下:
一、引入SpringMVC
1、在 resources 目录下,创建 SpringMVC 的配置文件 springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

    <!-- 自动扫描包,实现支持注解的IOC,这里只扫描Controller和ControllerAdvice -->
    <context:component-scan base-package="com.steven" use-default-filters="false">
        <context:include-filter type="annotation" 
            expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" 
            expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>

    <!-- Spring MVC不处理静态资源 -->
    <mvc:default-servlet-handler />

    <!-- 支持mvc注解驱动 -->
    <mvc:annotation-driven />
	
	<!-- SpringMVC上传文件时,需配置MultipartResolver处理器 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 指定所上传文件的总大小不能超过5M......注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
		<property name="maxUploadSize" value="5000000"/>
	</bean>
	
    <!-- 视图解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

2、在 web.xml 中加入如下配置

	<!-- springmvc配置 -->
	<servlet>
        <!--名称 -->
        <servlet-name>springmvc</servlet-name>
        <!-- Servlet类 -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 启动顺序,数字越小,启动越早 -->
        <load-on-startup>1</load-on-startup>
        <init-param>
            <!--SpringMVC配置参数文件的位置 -->
            <param-name>contextConfigLocation</param-name>
            <!--默认名称为ServletName-servlet.xml -->
            <param-value>classpath*:springmvc-servlet.xml</param-value>
        </init-param>
    </servlet>
    <!--所有请求都会被springmvc拦截 -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3、在 pom.xml 中引入jar包(前提是已经引入 spring 的相关依赖,这里只引入 springMVC 的依赖)

		<!-- springmvc依赖包 -->
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

二、修改与 Strust2 有关的文件
1、新建 controller 包,将 action 修改为 controller。
(1)、action 中的 @Namespace 注解与 controller 中 @RequestMapping 相对应;
controller 参数要跟在方法中;
前端标签只要 name 属性与定义接收的实体类(ageIOrder)中属性一致,则可以直接用实体类对象接收参数

    @RequestMapping("queryAgeIOrder")
	@ResponseBody
	public ViewPage queryAgeIOrder(@RequestParam Map<String, Object> params, AgeIOrder ageIOrder)

(2)、在 controller 需要返回 json ,只需在方法上加上 @ResponseBody 并引入相应的 json 的jar包即可

    @RequestMapping("queryAgeIOrder")
	@ResponseBody
	public ViewPage queryAgeIOrder(@RequestParam Map<String, Object> params, AgeIOrder ageIOrder)

(3)、controller 中如果既需要返回 json 数据给前端,又需要指定跳转的页面,可以使用 ModelAndView (modelAndView.addObject 是设置需要返回的数据,modelAndView.setViewName 是设置需要跳转到的页面)

	@RequestMapping(value="preUpdateAgeIOrder/{id}", method=RequestMethod.GET)
	public ModelAndView preUpdateAgeIOrder(@PathVariable("id") Long id) {
		ModelAndView modelAndView = new ModelAndView();
		AgeIOrder findById = ageIOrderService.selectById(id);
		
		modelAndView.addObject("ageIOrder", findById);
		modelAndView.setViewName(EDITPAGE);
		return modelAndView;
	}

2、修改前端页面(这里使用的是 jsp,主要是修改国际化相关)
(1)、spring 的配置文件 applicationContext.xml 中增加国际化的配置

    <context:property-placeholder location="classpath*:*.properties"/>
	<!-- 国际化 -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="message"></property>
	</bean>

(2)、将 Strust2 的国际化标签替换为 jsp 自带的 fmt 标签

-- 引入标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<fmt:message key="button.close" />

(3)、如果是不经过 springmvc 的页面,需要使用如下的标签

<fmt:bundle basename="message"><fmt:message key="common.error" /></fmt:bundle>

至此,Strust2 应该可以和 SpringMVC 共同运行!

三、删除 Strust2.xml 配置文件,并在 web.xml 及 pom.xml 中删除与 Strust2 有关的配置。中间可能会碰到如下一些问题:
1、一些工具类中使用了 new ActionSupport().getText(errorCode) 进行国际化,应改为如下的形式

new ActionSupport().getText(errorCode)
改为如下:
((MessageSource)SpringBeanUtil.getBean("messageSource")).getMessage(errorCode, null, null)

注意:((MessageSource)SpringBeanUtil.getBean(“messageSource”)) 不能定义成静态成员变量,因为类加载会比 spring 容器先初始化,所以会报无法创建 bean 的错误

2、使用 ServletActionContext.getRequest() 获取 request 和 response 的,应改为如下的形式

ServletActionContext.getRequest()
改为如下:
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()

3、获取当前 Locale

LocaleContextHolder.getLocale().toString()

猜你喜欢

转载自blog.csdn.net/crazy_0000/article/details/83623941