springmvc 學習筆記

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


<!-- Spring ApplicationContext配置文件的路徑
此參數用於後面的Spring-Context loader -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>

<!--Spring ApplicationContext 載入 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>


springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
修改說明:
1.修改<context:component-scan以確定要加載的controller,默認爲com.**.controller
2.修改class=ControllerClassNameHandlerMapping節點的pathPrefix以確定要生成的前綴
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
>
<!--
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<context:component-scan base-package="com.**.controller"/>
<bean class="cn.org.rapid_framework.spring.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/pages"/>
<property name="suffix" value=".jsp"></property>
</bean>
-->
<!-- it's ok;-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="test.do">testController</prop>
<prop key="testExtends.do">testExtendsController</prop>
<prop key="login.do">loginController</prop>
<prop key="login2.do">login2Controller</prop>
</props>
</property>
</bean>
<!-- 直接直向頁面/WEB-INF/login.jsp -->
<bean id="loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="login"></property>
</bean>
<!-- login2Controller會指向 prop key='login2.do'裏的login2頁面+前後綴 -->
<bean id="login2Controller" class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
</bean>
<bean id="testController" class="com.company.project.controller.TestController"></bean>
<bean id="testExtendsController" class="com.company.project.controller.TestExtendsController"></bean>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>


能封裝表單參數的 AbstractCommandController,CommondController、 FormController

web-inf/add_dept.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<form action="" method="post">
name:<input type="text" name="name"><br>
createDate:<input type="text" name="createDate"><br>
<input type="submit" value="add">
</form>
</body>
</html>

springmvc-servlet.xml

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="add_dept.do">addDeptController</prop>
</props>
</property>
</bean>
<bean id="addDeptController" class="com.company.project.controller.DeptController">
<property name="commandClass" value="com.company.project.model.Department"></property>
</bean>

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

會正常轉換 整型及字符串,如果輸入的不是一個整數,就會爲0;
spring mvc 默認提供了一些屬性編輯器:int,float,double,long,string,class,url

DeptController

package com.company.project.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
import com.company.project.model.Department;
public class DeptController extends AbstractCommandController{
//數據綁定 到model裏。
@Override
protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception {
Department dept = (Department)arg2;
return null;
}
}


自定義屬性編輯器:

package com.company.project.controller;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;

import com.company.project.MyConverter;
import com.company.project.model.Department;
public class DeptController extends AbstractCommandController{
//數據綁定 到model裏。
@Override
protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception {
Department dept = (Department)arg2;
return null;
}

@Override
protected void initBinder(HttpServletRequest arg0, ServletRequestDataBinder binder) throws Exception {
//這是一種做法
//binder.registerCustomEditor(Date.class, new MyConverter());
// 日期類型提供了半成品的一個屬性編輯器 true:表示可以不輸入這個日期,也就是說這個日期可以爲空
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}
}

MultiActionController
package com.company.project.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.company.project.model.Department;

public class MultController extends MultiActionController{
//方法必須要有request,response,可選參數session,Model
public ModelAndView toAdd(HttpServletRequest request,HttpServletResponse response){
//ModelAndView mav = new ModelAndView("add_dept",model);
ModelAndView mav = new ModelAndView();
Map<String, Object> depts = new HashMap<String, Object>();
//設置視圖名稱
mav.setViewName("add_dept");
//設置模型
mav.addAllObjects(depts);
return mav;
}

public ModelAndView toList(HttpServletRequest request,HttpServletResponse response,HttpSession session,Department dept){
System.out.println(dept);
//return "success";
return new ModelAndView("success");
}
public Map xxx(HttpServletRequest request,HttpServletResponse response){

}
}


<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="add_dept.do">addDeptController</prop>
<prop key="list_dept.do">addDeptController</prop>
</props>
</property>
</bean>
<!-- 只有MultiActionController -->
<bean id="addDeptController"
class="com.company.project.controller.MultController">
<property name="commandClass" value="addDept.do"></property>
<!-- 方法名解析器 -->
<property name="methodNameResolver">
<!-- 按路徑名解析,如prop key=list_dept.do,會執行list_dept方法,所以請求需跟方法名一致
<bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean>
-->
<!-- 按參數解析 -->
<bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<!-- 參數名需要有fun,然後根據fun的值,執行該方法,如:?fun=to_add,會執行to_add方法 -->
<property name="paramName" value="fun"></property>
</bean>
</property>
</bean>
<bean
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView">
</property>
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>


簡化URL映射關係
HanderMapping:

ControllerClassNameHanderMapping:按類名映射

<!-- 如果訪問的URL爲dept.do,會去找名稱爲DeptController類,id,name不重要
如果是MultController,如果是按路徑名(InternalPathMethodNameResolver)解析器,可以用
mult/to_add.do:會執行MultController裏的to_add方法
-->
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
</bean>
<bean id="xxx" class="test.DeptController"></bean>
<!-- 只有MultiActionController -->
<bean id="addDeptController"
class="com.company.project.controller.MultController">
<property name="commandClass" value="addDept.do"></property>
<!-- 方法名解析器 -->
<property name="methodNameResolver">
<!-- 按路徑名解析,如prop key=list_dept.do,會執行list_dept方法,所以請求需跟方法名一致 -->
<bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean>
<!-- 按參數解析
<bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
參數名需要有fun,然後根據fun的值,執行該方法,如:?fun=to_add,會執行to_add方法
<property name="paramName" value="fun"></property>
</bean>
-->
</property>
</bean>
<bean
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView">
</property>
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>


<!--BeanNameUrlHandlerMapping:會根據bean的url進行攔截 這種對MultController沒辦法使用-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
</bean>
<bean name="/test.do" class="com.company.project.controller.TestController"></bean>



annotation註解方式實現

controller類:
package test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {
@RequestMapping("/start")
public String start(){
return "start";
}
}

web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Spring ApplicationContext配置文件的路徑,可使用通配符,多個路徑用1,號分隔
此參數用於後面的Spring-Context loader -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
<!-- 手動指定配置文件位置及名稱
<param-value>/WEB-INF/classes/springmvc-servlet.xml</param-value>
<param-value>/WEB-INF/classes/*.xml</param-value>
在spring包下的所有xml文件
<param-value>/WEB-INF/classes/spring/*.xml</param-value>
<param-value>classpath*:spring/*.xml</param-value>
-->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>

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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 基於註解的方式 -->
<context:component-scan base-package="test.controller"/>
<!-- InternalResourceViewResolver:是在基於url的基礎之上,加入了JSP,JSTL的視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/pages"/>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>

訪問:http://localhost:8080/springmvc/start.do
會直接跳轉到/pages/start.jsp

@RequestMapping:可以修飾類,及類裏面的方法
如果在類級別定義了@RequestMapping,相當於定義了一個相對路徑
如下:
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/start")
public String start(){
return "start";
}
}

如果需要訪問start方法,則應該是 localhost:8080/springmvc/test/start.do

如果沒有類級別的@RequestMapping,則訪問方法start方法,則應該是localhost:8080/springmvc/start.do, /:相當於根路徑,處理求的方法必須要有@RequestMapping註解
處理以後請求,資源文件與上面相同,只是controller上不一樣

http://localhost:8080/springmvc/start.do?name=zhangsan
package test.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {
@RequestMapping("/start")
//可以只加一個request,也可以根據需要添加response,session,model等參數
public String start(HttpServletRequest request){
//傳統的處理方法,
String name= request.getParameter("name");
return "start";
}
}

spring3.0引入了一種restful風格的模式:基於url參數的形式進行請求,如下:
http://localhost:8080/springmvc/start.do?name=zhangsan
http://localhost:8080/springmvc/start.do?name=lisi

處理形式:restful風格,請求的參數作爲url一部分存在
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do

支持restful風格需要有一個參數PathVariable,定義url模板,指定可變部分:

例子:處理
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do
配置文件以之前一樣,Controller類裏:
----------------------------------------------------
package test.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {
//{name}:表示可變部分,/start/{name}就是URL模板
@RequestMapping("/start/{name}")
//可以只加一個request,也可以根據需要添加response,session,model等參數
public String start(@PathVariable("name") String name){
//@PathVariable String name:路徑變量;用於取URL模板裏可變部分的值,2個name須一致
System.out.println(name);
return "start";
}
}

如果是多個可變參數:
@Controller
public class TestController {
@RequestMapping("/start/{name}/{age}")
public String start(@PathVariable("name") String name,@PathVariable("age") int nianling){
System.out.println(name);
System.out.println(nianling);
return "start";
}
}

如URL請求爲:
http://localhost:8080/springmvc/start/zhangsan/20.do
===========================================================
@RequestMapping:可以根據不同的請求方法,映射到不同的處理方法,與之前的formcontroller相似,請求方法:post,get
package test.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class TestController {
//處理get請求,如直接在地址欄輸入 http://localhost:8080/springmvc/start.do
@RequestMapping(value="/start",method=RequestMethod.GET)
public String start(){
return "start_get";
}
//處理post請求, form以post方式提交,http://localhost:8080/springmvc/start.do
@RequestMapping(value="/start",method=RequestMethod.POST)
public String startPost(){
//跳轉到start_post.jsp頁面
return "start_post";
}
}

http://localhost:8080/springmvc/test/1986-07-06.do
package test.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.config.CustomEditorConfigurer;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.support.WebRequestDataBinder;
@Controller
@RequestMapping("/test")
public class TestController {
//如果方法上沒指定映射的value,則會映射到類級別/test
@RequestMapping(value="{test}",method=RequestMethod.GET)
public String startPost(@PathVariable("test") Date test){
System.out.println(test);
return "success";
}
@InitBinder
//參數可以有request,response,session,webrequestdatabinder(綁定數據)
public String initBinder(WebRequestDataBinder binder){
//所有日期類型都會進行轉換,且不能不空
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),false));
}
}

@Controller
@RequestMapping("/test")
public class TestController {
//如果方法上沒指定映射的value,則會映射到類級別/test
@RequestMapping(value="{test}",method=RequestMethod.GET)
public String startPost(@PathVariable("test") Date test){
System.out.println(test);
return "success";
}
@InitBinder
//參數可以有request,response,session,webrequestdatabinder(綁定數據)
public String initBinder(WebRequestDataBinder binder){
//所有日期類型都會進行轉換,且不能不空
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),false));
}
@RequestMapping("/testRequest")
public void testRequest(@RequestParam int id,@CookieValue anytype cookieName,@RequestHeader("content-type") anyType abc ){
//@RequestParam int id 類型可以是任何類型,參數名必須與請求的參數名一樣
//@RequestHeader:從請求頭裏取,@RequestHeader("user-Agent"):瀏覽器類型
//@CookieValue:從cookie裏取
//http://localhost:8080/springmvc/testRequest.do?id=xxx
System.out.println(id);
}
}

@RequestMapping("/testOut")
public String testOut(PrintWriter out,Map model){
//這裏的out相當於 response.getWriter();
out.println("hello ");
//這裏的model相當於ModelAndView對象,會直接初始化
model.put("key", "value");
return "viewName";
}

自動封裝屬性
http://localhost:8080/springmvc/testMethod.do?name=xxx&pass=xxx

User類裏有name,pass屬性:

Controller類裏的方法:
@RequestMapping("/testMethod")
public void testMethod(User user){
//這裏會自動給user的name,pass賦值
//User:爲commend對象,領域模型
System.out.println(user);
}

@RequestMapping("/testMethod")
public void testMethod(User user,BindingResult result){
//BindingResult:用於驗證對象綁定結果,把綁定過程出錯的地方用在result裏。如果不想處理錯誤綁定,則不需要指定
System.out.println(user);
}

基於配置文件的SpringMVC處理請求的方法定義總結:
public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession] [,AnyObject]);

參數類型:
1.HttpServletRequest(必須有)
2. HttpServletRespons(必須有)
3。HttpSession(可選)
4.AnyObject(可選)
備註:如果object與session都有,則session應爲第三個參數

返回值類型:
1,ModelAndView
2.Map
3.String
4.void

基於註解的MVC,能夠處理請求的方法定義總結:

參數類型:對數量及順序是沒有要求的
1,可以沒有();
2,可以是HttpServletRequest
3,可以是HttpServletResponse
4,可以是HttpSession
5,可以是路徑變量@PathVariable
6,可以是@RequestParam
7,可以是@CookieValue
8,可以是@RequestHeader
9,可以是PrintWriter
10,可以是Map model
11,可以是領域模型對象

備註:HttpSessiond需要有一個前提條件,那就是當前請求的session可用:即在這之前session已經被初始化:也就是說在這之前調用了request.getSession()或者session.setAttribute(),直接進入jsp頁面,也會初始化session

返回值類型:
1,ModelAndView
2.Map
3.String:代表了viewName,model也會自動返回
4.void:一般使用out方法輸出之後就用void
5.AnyType:返回任意類型的對象
6.List
@RequestMapping("/xxx")
public void testVoid(){
//如果沒有使用out對象,則會隱含默認生成一個viewName--:是按請求路徑解析出來的
//如:請求路徑爲:http://localhost:8080/springmvc/test/xxx.do,則生成的視圖名爲test/xxx
// /WEB-INF/page/test/xxx.jsp
System.out.println("...");
}

//返回任意對象

@RequestMapping("/xxx")
public User test(){//相當於model裏添加了一個 model.put("key","value"),key:爲默認類名(user),value爲返回的對象
return null;
//視圖名與void時一樣:則會隱含默認生成一個viewName--:是按請求路徑解析出來的
//如:請求路徑爲:http://localhost:8080/springmvc/test/xxx.do,則生成的視圖名爲test/xxx
// /WEB-INF/page/test/xxx.jsp


返回List

@RequestMapping("/xxx")
public List<User> query(){
return null;
//list也會加入到model裏,默認key是實際成員的名+List如:model("userList",user).

可以使用EL表達式取裏面的值:${userList},也可以request.getAttribute("userList")
##############annotation註解方式實現 結束###################

Spring MVC 常用 ViewResolver & View
@、 InternalResourceViewResolver、 UrlBasedViewResolver
@、Redirect 重定向視圖 (redirect:)
@、XmlViewResovler
@、視圖鏈
@、JstlView, ExcelView及自定義view (JsperReport, Pdf, Excel)


重定向視圖:
防止重複提交,可以使用重定向

@RequestMapping(method=RequestMethod.POST)
public String addUser(User user){
return "redirect:/add_success";
}


#######攔截器,視圖國際化,驗證############################
攔截器:inteceptor
全局日誌,權限管理

1.定義攔截器:
package test.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MyInteceptor implements HandlerInterceptor{

public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {

}
//控制器已經執行完,生成視圖之前可以做的操作,通常是向模型中加入一些公共成員
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
}

public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object handler) throws Exception {
//handler:指的是下一個對象的引用,如果是有兩個攔截器,這就是指第二個攔截器對象,最後一個就是Controller
return false;
//return true:表示繼續執行,false:表示直接中斷,不會再執行之後的操作
}
}

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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 基於註解的方式 -->
<context:component-scan base-package="test.controller"/>
<!-- InternalResourceViewResolver:是在基於url的基礎之上,加入了JSP,JSTL的視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/pages"/>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:inteceptors>
<mvc:inteceptor>
<!-- path如果不指定,則對所有的請求都攔截
<mvc:mapping path=""/>-->
<!-- 表示符合/user/*這樣的模式才攔截 -->
<mvc:mapping path="/user/*"/>
<bean class="test.web.MyInteceptor"></bean>
</mvc:inteceptor>
<!-- 可以定義多個inteceptor,按順序執行 -->
</mvc:inteceptors>
</beans>

國際化ResourceMessage

在根路徑下建立資源文件:
mess.properties
mess_en_US.properties
mess_zh_CN.properties
分別定義如下:
welcome="welcome"
welcome="(US)welcome"
welcome="歡迎你!"


jsp頁面裏,使用<spring:message/>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body><!-- 國際化的key爲welcome -->
<spring:message code="welcome"/><br>
</body>
</html>


加載國際化資源文件,需要在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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 基於註解的方式 -->
<context:component-scan base-package="test.controller"/>
<!-- InternalResourceViewResolver:是在基於url的基礎之上,加入了JSP,JSTL的視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/pages"/>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 加載國際化配置,這裏定義的id名必須爲 messageSource-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 根名稱:去掉多語言後的名稱,如這裏的 mess,爲在當前classpath裏去找mess國際化配置文件 -->
<property name="basename" value="mess"></property>
<!-- 如果有多組國際化文件,可以指定basenames,它是一個list,配置如下 -->
<property name="basenames">
<list>
<value>mess1</value>
<value>mess2</value>
<value>....</value>
</list>
</property>
</bean>
</beans>



JSR-303 validate bean 驗證
如:User類裏
public class User {
@NotEmpty
private String name;
@Size(max=20,min=6)
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}

然後在Controller裏
@RequestMapping("/testMethod")
public void testMethod(@Valid User user,BindingResult result){
if(result.hasErrors()){
return "error";
}
System.out.println(user);
}

在參數里加@Valid註解,就會當這個user進行綁定的時候,就驗證,驗證的規則定義在User類裏,如果驗證過程出錯,就會把錯誤信息放在BindingResult裏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章