SpringMVC
来源:互联网 发布:网络打假工作总结 编辑:程序博客网 时间:2024/04/29 21:20
转自 http://zhanghouyin-hotmail-com.iteye.com/blog/1101935
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里
- SpringMVC
- springmvc
- SpringMVC
- SpringMVC
- springMvc
- springMVC
- springmvc
- springMVC
- springMVC
- springmvc
- SpringMVC
- SpringMVC
- springMvc
- springmvc
- springmvc
- SpringMVC
- Springmvc
- springmvc
- JS 滚动到页面顶部 兼容 IE6/8、FF及webkit
- linux下安装Sqlite
- android - ListView的使用。
- UML那些事儿:六类UML图
- 屏蔽Qt的qWarning() qDebug()语句输出
- SpringMVC
- 怎样成为一个PS高手
- extjs4 tree struts2 json
- asp.net js 提交到后台特定按钮事件
- UML类图关系大全
- Camera Sensor相关资料
- java序列化Serializable
- tomcat 中遇到的错误(一)
- asp.net 记录用户打开和关闭页面的时间