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