1. 程式人生 > >Strust2升級SpringMVC的一些心得

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()