不错Springmvc注解文档
- 格式:doc
- 大小:133.50 KB
- 文档页数:22
SpringMVC-GetMapping-RequestMapping注解总结SpringMVC-GetMapping注解总结@GetMapping是⼀个组合注解,是@RequestMapping(method= RequestMethod.GET)的缩写。
该注解将HTTP Get 映射到特定的处理⽅法上。
所以此处个⼈的理解,@GetMapping可以算是@RequestMapping的⼦集,可能该说法不是很严谨,但是我个⼈暂时是这么理解的。
Spirng与Web集成 1.1 ApplicationContext应⽤上下⽂获取⽅式# 应⽤上下⽂对象是通过new ClasspathXmlApplicationContext(spring配置⽂件) ⽅式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置⽂件) ,这样的弊端是配置⽂件加载多次,应⽤上下⽂对象创建多次。
在Web项⽬中,可以使⽤ServletContextListener监听Web应⽤的启动,我们可以在Web应⽤启动时,就加载Spring的配置⽂件,创建应⽤上下⽂对象ApplicationContext,在将其存储到最⼤的域servletContext域中,这样就可以在任意位置从域中获得应⽤上下⽂ApplicationContext对象了。
1.2 Spring提供获取应⽤上下⽂的⼯具# 上⾯的分析不⽤⼿动实现,Spring提供了⼀个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置⽂件,创建应⽤上下⽂对象,并存储到ServletContext域中,提供了⼀个客户端⼯具WebApplicationContextUtils供使⽤者获得应⽤上下⽂对象。
所以我们需要做的只有两件事:在web.xml中配置ContextLoaderListener监听器(导⼊spring-web坐标)使⽤WebApplicationContextUtils获得应⽤上下⽂对象ApplicationContext1. 哪⼀些情况下,浏览器会发送get请求a. 直接在浏览器地址栏输⼊某个地址b. 点击链接c. 表单默认的提交⽅式2.特点:a. 请求参数会添加到请求资源路劲的后⾯,只能添加少量参数b. 请求参数会显⽰在浏览器地址栏,路由器会记录请求地址5:@PostMapping1. 哪⼀些情况下,浏览器会发送post请求a. 设置表单method = "post"2.特点:a. 请求参数添加到实体内容⾥⾯,可以添加⼤量的参数(也解释了为什么不能发送post请求,在地址栏⾥我们只能填写URL,并不能进⼊到Http包的实体当中)b. 相对安全,但是,post请求不会对请求参数进⾏加密处理(可以使⽤https协议来保证数据安全)。
spring mvc学习教程(一)-入门实例引言1.MVC:Model-View-Control框架性质的C层要完成的主要工作:封装web请求为一个数据对象、调用业务逻辑层来处理数据对象、返回处理数据结果及相应的视图给用户。
2.简要概述springmvcSpring C 层框架的核心是DispatcherServlet,它的作用是将请求分发给不同的后端处理器,也即使用了一种被称为Front Controller 的模式(后面对此模式有简要说明)。
Spring 的C 层框架使用了后端控制器来、映射处理器和视图解析器来共同完成C 层框架的主要工作。
并且spring 的C 层框架还真正地把业务层处理的数据结果和相应的视图拼成一个对象,即我们后面会经常用到的ModelAndView 对象。
一、入门实例1. 搭建环境在spring的官方API文档中,给出所有包的作用概述,现列举常用的包及相关作用:org.springframework.aop-3.0.5.RELEASE.jar:与Aop编程相关的包org.springframework.beans-3.0.5.RELEASE.jar:提供了简捷操作bean的接口org.springframework.context-3.0.5.RELEASE.jar:构建在beans包基础上,用来处理资源文件及国际化。
org.springframework.core-3.0.5.RELEASE.jar:spring核心包org.springframework.web-3.0.5.RELEASE.jar:web核心包,提供了web层接口org.springframework.web.servlet-3.0.5.RELEASE.jar:web 层的一个具体实包,DispatcherServlet也位于此包中。
后文全部在spring3.0 版本中进行,为了方便,建议在搭建环境中导入spring3.0 的所有jar 包(所有jar 包位于dist 目录下)。
Spring注解验证-关于@Valid在我们做spring mvc项⽬的时候,经常要对Controller中传⼊实体内容进⾏验证,费时还费⼒,SO,spring mvc 验证参数注解@Valid注解,更⽅便了我们专注于业务的处理官⽅参考地址,⼤家clone下来的时候记得改下地址(附上阿⾥⼤法地址)repositories {maven{url "/nexus/content/groups/public/"}}官⽅⽂档 http://spring.io/guides/gs/validating-form-input/⼤家主要看PersonForm类,模版⾥提供的类中多了3个注解,其中@NotNull 是针对下⾯的参数不能为空,如果为空,会抛出 javax.validation.constraints.NotNull.message⽽@Size 很容易理解,就是参数⼤⼩,/*** @return size the element must be higher or equal to*/int min() default 0;/*** @return size the element must be lower or equal to*/int max() default Integer.MAX_VALUE;⾥⾯有min() 和max()在我们的controller中,要验证的实体记得⼀定要加@Valid 使我们的注解⽣效在验证我们的参数的时候,如果不加 BindingResult bindingResult会抛出异常,我们可以根据 BindingResult 来处理我们的提⽰错误等很容易上⼿,@Null 限制只能为null@NotNull 限制必须不为null@AssertFalse 限制必须为false@AssertTrue 限制必须为true@DecimalMax(value) 限制必须为⼀个不⼤于指定值的数字@DecimalMin(value) 限制必须为⼀个不⼩于指定值的数字@Digits(integer,fraction) 限制必须为⼀个⼩数,且整数部分的位数不能超过integer,⼩数部分的位数不能超过fraction @Future 限制必须是⼀个将来的⽇期@Max(value) 限制必须为⼀个不⼤于指定值的数字@Min(value) 限制必须为⼀个不⼩于指定值的数字@Past 限制必须是⼀个过去的⽇期@Pattern(value) 限制必须符合指定的正则表达式@Size(max,min) 限制字符长度必须在min到max之间这是 javax.validation 包下的,⼤家还要注意的是我们还可以⽤到Hibernate下的验证@NotBlank(message =) 验证字符串⾮null,且长度必须⼤于0 很适合String 参数验证@Email 被注释的元素必须是电⼦邮箱地址@Length(min=,max=) 被注释的字符串的⼤⼩必须在指定的范围内@NotEmpty 被注释的字符串的必须⾮空@Range(min=,max=,message=) 被注释的元素必须在合适的范围内。
springmvc对参数接收的两个注解@RequestParam和
@RequestBody
@RequestParam
作⽤:将请求参数绑定到控制器的⽅法参数上,主要⽤于接收⼏班类型参数
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表⽰该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,⾃动为false,如果没有传该参数,就使⽤默认值
@RequestBody
@RequestBody主要⽤来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET⽅式⽆请求体,所以使⽤@RequestBody 接收数据时,前端不能使⽤GET⽅式提交数据,⽽是⽤POST⽅式进⾏提交。
在后端的同⼀个接收⽅法⾥,@RequestBody与
@RequestParam()可以同时使⽤,@RequestBody最多只能有⼀个,⽽@RequestParam()可以有多个。
本文主要介绍使用注解方式配置的spring mvc,包括数据访问层的实现web.xml配置:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="http:// /xml/ns/javaee" xmlns:web="/xml/ns/javaee/web-ap p_2_5.xsd" xsi:schemaLocation="/xml/ns/javaee http://java.su /xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>s3h3</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</l istener-class></listener><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servle t-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name> <!-- 这里在配成spring,下边也要写一个名为spring-servlet.xml的文件,主要用来配置它的controller --><url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>spring-servlet,主要配置controller的信息<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="http:// /schema/p"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans http://www. /schema/beans/spring-beans-3.0.xsd/schema/aop http://www.springframework.o rg/schema/aop/spring-aop-3.0.xsd/schema/tx http://www.springframework.or g/schema/tx/spring-tx-3.0.xsd/schema/context http://www.springframewo /schema/context/spring-context-3.0.xsd"><context:annotation-config /><!-- 把标记了@Controller注解的类转换为bean --><context:component-scan base-package="com.mvc.controller"/> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --><bean class="org.springframework.web.servlet.mvc.annotation.AnnotationM ethodHandlerAdapter"/><!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --><bean class="org.springframework.web.servlet.view.InternalResourceView Resolver"p:prefix="/WEB-INF/view/" p:suffix=".jsp"/><bean id="multipartResolver"class="monsMultipartRe solver"p:defaultEncoding="utf-8"/></beans>applicationContext.xml代码<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:aop="/schema/aop" xmlns:context="http:// /schema/context"xmlns:p="/schema/p" xmlns:tx="http://www.sprin /schema/tx"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans http://www.springframewo /schema/beans/spring-beans-3.0.xsd/schema/context http://www.springframework.o rg/schema/context/spring-context-3.0.xsd/schema/aop /s chema/aop/spring-aop-3.0.xsd/schema/tx /sc hema/tx/spring-tx-3.0.xsd"><context:annotation-config /><context:component-scan base-package="com.mvc"/><!-- 自动扫描所有注解该路径 --><context:property-placeholder location="classpath:/hibernate.properties "/><bean id="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFacto ryBean"><property name="dataSource" ref="dataSource"/><property name="hibernateProperties"><props><prop key="hibernate.dialect">${dataSource.dialect}</prop><prop key="hibernate.hbm2ddl.auto">${dataSource.hbm2ddl.auto}</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><property name="packagesToScan"><list><value>com.mvc.entity</value><!-- 扫描实体类,也就是平时所说的model --></list></property></bean><bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/><property name="dataSource" ref="dataSource"/></bean><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${dataSource.driverClassName} "/><property name="url" value="${dataSource.url}"/><property name="username" value="${ername}"/><property name="password" value="${dataSource.password}"/></bean><!-- Dao的实现 --><bean id="entityDao" class="com.mvc.dao.EntityDaoImpl"><property name="sessionFactory" ref="sessionFactory"/></bean><tx:annotation-driven transaction-manager="transactionManager"/><tx:annotation-driven mode="aspectj"/><aop:aspectj-autoproxy/></beans>hibernate.properties数据库连接配置dataSource.password=123ername=rootdataSource.databaseName=testdataSource.driverClassName=com.mysql.jdbc.DriverdataSource.dialect=org.hibernate.dialect.MySQL5DialectdataSource.serverName=localhost:3306dataSource.url=jdbc:mysql://localhost:3306/testdataSource.properties=user=${ername};databaseName=${dataSource.d atabaseName};serverName=${dataSource.serverName};password=${dataSource.passwor d}dataSource.hbm2ddl.auto=update配置已经完成,下面开始例子先在数据库建表,例子用的是mysql数据库CREATE TABLE `test`.`student` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL,`psw` varchar(45) NOT NULL,PRIMARY KEY (`id`))建好表后,生成实体类package com.mvc.entity;import java.io.Serializable;import javax.persistence.Basic;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "student")public class Student implements Serializable {private static final long serialVersionUID = 1L;@Id@Basic(optional = false)@GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false)private Integer id;@Column(name = "name")private String user;@Column(name = "psw")private String psw;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUser() {return user;}public void setUser(String user) {er = user;}public String getPsw() {return psw;}public void setPsw(String psw) {this.psw = psw;}}Dao层实现package com.mvc.dao;import java.util.List;public interface EntityDao {public List<Object> createQuery(final String queryString);public Object save(final Object model);public void update(final Object model);public void delete(final Object model);}package com.mvc.dao;import java.util.List;import org.hibernate.Query;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class EntityDaoImpl extends HibernateDaoSupport implements EntityDao {public List<Object> createQuery(final String queryString) { return (List<Object>) getHibernateTemplate().execute(new HibernateCallback<Object>() {public Object doInHibernate(org.hibernate.Session sessio n)throws org.hibernate.HibernateException {Query query = session.createQuery(queryString);List<Object> rows = query.list();return rows;}});}public Object save(final Object model) {return getHibernateTemplate().execute(new HibernateCallback<Object>() {public Object doInHibernate(org.hibernate.Session sessio n)throws org.hibernate.HibernateException {session.save(model);return null;}});}public void update(final Object model) {getHibernateTemplate().execute(new HibernateCallback<Object>() { public Object doInHibernate(org.hibernate.Session session)throws org.hibernate.HibernateException {session.update(model);return null;}});}public void delete(final Object model) {getHibernateTemplate().execute(new HibernateCallback<Object>() { public Object doInHibernate(org.hibernate.Session session)throws org.hibernate.HibernateException {session.delete(model);return null;}});}}Dao在applicationContext.xml注入<bean id="entityDao" class="com.mvc.dao.EntityDaoImpl"><property name="sessionFactory" ref="sessionFactory"/></bean>Dao只有一个类的实现,直接供其它service层调用,如果你想更换为其它的Dao实现,也只需修改这里的配置就行了。
SpringMVC框架知识点详解官⽅的下载⽹址是:⼀、Spring MVC简介1.1Spring MVC⼯作流程映射器:主要是根据浏览器上输⼊的url来映射所有满⾜要求的Handle(控制器类)适配器:主要是决定调⽤哪个Handler来实现具体的业务逻辑1.2Spring MVC VS Struts21)springmvc的⼊⼝是⼀个servlet,即前端控制器;struts2⼊⼝是⼀个filter过虑器,即前端过滤器,2)springmvc是基于⽅法开发(控制器类是单例的,不可能维护实体变量),传递参数是通过⽅法形参,可以设计为单例;struts2是基于类开发(维护⼀个实体变量),传递参数是通过类的属性,只能设计为多例3)springmvc通过参数解析器是将request对象内容进⾏解析成⽅法形参,将响应数据和页⾯封装成ModelAndView对象,最后⼜将模型数据通过request对象传输到页⾯;struts采⽤值栈存储请求和响应的数据,通过OGNL存取数据4)springmvc开发运⾏速度快于struts2⼆、Spring MVC⼯程搭建(xml)2.1导⼊springioc,springweb , springmvc相关的jar包2.2在/WEB-INF/ web.xml⽂件配置SpringMVC的前端控制器DispatcherServlet(前端控制器)<!-- 注册springmvc核⼼控制器 --><servlet><!-- servlet-name名字随便写 --><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 通知DispatcherServlet去指定的⽬录下加载springmvc.xml配置⽂件classpath:是在⼯程的src路径下寻找如果不配置init-param的话,控制器会⾃动寻找/WEB-INF/<servlet-name>-servlet.xml⽂件--><init-param><!-- 值是固定的,相当于键值对 --><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>*.action</url-pattern>//拦截请求</servlet-mapping>注:在默认情况下:springmvc框架的配置⽂件必须叫<servlet-name>-servlet.xml且必须放在/WEB-INF/⽬录下,我们可以在web.xml⽂件中,为DispatcherServlet配置⼀个初始化参数,让它去我们指定的⽬录下加载springmvc.xml配置⽂件2.3配置springmvc.xml注:该配置⽂件的命名规则遵循web.xml⽂件中核⼼控制器配置。
SpringMVC--@RequestMapping注解以及SpringMVC获取请求参数三、@RequestMapping注解1、@RequestMapping注解的功能@RequestMapping注解的作⽤就是将请求和处理请求的控制器⽅法关联起来,建⽴映射关系。
SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器⽅法来处理这个请求。
注意:在使⽤@RequestMapping注解的时候,要保证在所有的控制器中所能匹配到的请求地址是唯⼀的;2、@RequestMapping注解的位置@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息注意:如果类和⽅法上都有路径信息,那么要先访问初始信息在访问具体信息,HTML路径要两个都写(⼀般⽤于不同模块同名请求路径的处理)3、@RequestMapping注解的value属性@RequestMapping注解的value属性通过请求的请求地址匹配请求映射@RequestMapping注解的value属性是⼀个字符串类型的数组,表⽰该请求映射能够匹配多个请求地址所对应的请求@RequestMapping注解的value属性必须设置,⾄少通过请求地址匹配请求映射4、@RequestMapping注解的method属性@RequestMapping注解的method属性通过请求的请求⽅式(get或post)匹配请求映射@RequestMapping注解的method属性是⼀个RequestMethod类型的数组,表⽰该请求映射能够匹配多种请求⽅式的请求若当前请求的请求地址满⾜请求映射的value属性,但是请求⽅式不满⾜method属性,则浏览器报错 405:Request method 'POST' not supported,设置多个参数不必同时满⾜!注意:1、对于处理指定请求⽅式的控制器⽅法,SpringMVC中提供了@RequestMapping的派⽣注解处理get请求的映射-->@GetMapping处理post请求的映射-->@PostMapping处理put请求的映射-->@PutMapping处理delete请求的映射-->@DeleteMapping可以直接使⽤以上注解代替method参数!2、常⽤的请求⽅式有get,post,put,delete但是⽬前浏览器只⽀持get和post,若在form表单提交时,为method设置了其他请求⽅式的字符串(put或delete),则按照默认的请求⽅式get处理若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter,在 RESTful部分会讲到,设置多个参数不必同时满⾜!5、@RequestMapping注解的params属性(了解)@RequestMapping注解的params属性通过请求的请求参数匹配请求映射@RequestMapping注解的params属性是⼀个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系"param":要求请求映射所匹配的请求必须携带param请求参数"!param":要求请求映射所匹配的请求必须不能携带param请求参数"param=value":要求请求映射所匹配的请求必须携带param请求参数且param=value"param!=value":要求请求映射所匹配的请求必须携带param请求参数但是param!=value注:若当前请求满⾜@RequestMapping注解的value和method属性,但是不满⾜params属性,此时页⾯回报错400:Parameter conditions "username, password!=123456" not met for actual request parameters: username={admin}, password={123456},设置多个参数必须同时满⾜!6、@RequestMapping注解的headers属性(了解)@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射@RequestMapping注解的headers属性是⼀个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系"header":要求请求映射所匹配的请求必须携带header请求头信息"!header":要求请求映射所匹配的请求必须不能携带header请求头信息"header=value":要求请求映射所匹配的请求必须携带header请求头信息且header=value"header!=value":要求请求映射所匹配的请求必须携带header请求头信息且header!=value若当前请求满⾜@RequestMapping注解的value和method属性,但是不满⾜headers属性,此时页⾯显⽰404错误,即资源未找到,设置多个参数必须同时满⾜!7、SpringMVC⽀持ant风格的路径(模糊匹配):表⽰任意的单个字符(/ ? 不写都不可以)*:表⽰任意的0个或多个字符**:表⽰任意的⼀层或多层⽬录注意:在使⽤**时,只能使⽤/**/xxx的⽅式8、SpringMVC⽀持路径中的占位符(重点)原始⽅式:/deleteUser?id=1rest⽅式:/deleteUser/1SpringMVC路径中的占位符常⽤于RESTful风格中,当请求路径中将某些数据通过路径的⽅式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表⽰传输的数据,在通过@PathVariable注解,将占位符所表⽰的数据赋值给控制器⽅法的形参四、SpringMVC获取请求参数1、通过ServletAPI获取将HttpServletRequest作为控制器⽅法的形参,此时HttpServletRequest类型的参数表⽰封装了当前请求的请求报⽂的对象2、通过控制器⽅法的形参获取请求参数在控制器⽅法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在 DispatcherServlet中就会将请求参数赋值给相应的形参注:若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器⽅法的形参中设置字符串、数组或者字符串类型的形参接收此请求参数若使⽤字符串数组类型的形参,此参数的数组中包含了每⼀个数据若使⽤字符串类型的形参,此参数的值为每个数据中间使⽤逗号拼接的结果3、@RequestParam@RequestParam是将请求参数和控制器⽅法的形参创建映射关系@RequestParam注解⼀共有三个属性:value:指定为形参赋值的请求参数的参数名required:设置是否必须传输此请求参数,默认值为true若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue属性,则页⾯报错400:Required String parameter 'xxx' is not present;若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 nulldefaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使⽤默认值为形参赋值4、@RequestHeader@RequestHeader是将请求头信息和控制器⽅法的形参创建映射关系@RequestHeader注解⼀共有三个属性:value、required、defaultValue,⽤法同@RequestParam5、@CookieValue@CookieValue是将cookie数据和控制器⽅法的形参创建映射关系@CookieValue注解⼀共有三个属性:value、required、defaultValue,⽤法同@RequestParam6、通过POJO获取请求参数可以在控制器⽅法的形参位置设置⼀个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名⼀致,那么请求参数就会为此属性赋值 7、解决获取请求参数的乱码问题解决获取请求参数的乱码问题,可以使⽤SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进⾏注册注: SpringMVC中处理编码的过滤器⼀定要配置到其他过滤器之前,否则⽆效。
springMVC配置(XML配置详解)原⽂出⾃:web.xml配置:servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><description>加载/WEB-INF/spring-mvc/⽬录下的所有XML作为Spring MVC的配置⽂件</description><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc/*.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.htm</url-pattern></servlet-mapping>这样,所有的.htm的请求,都会被DispatcherServlet处理;初始化 DispatcherServlet 时,该框架在 web 应⽤程序WEB-INF ⽬录中寻找⼀个名为[servlet-名称]-servlet.xml的⽂件,并在那⾥定义相关的Beans,重写在全局中定义的任何Beans,像上⾯的web.xml中的代码,对应的是dispatcher-servlet.xml;当然也可以使⽤<init-param>元素,⼿动指定配置⽂件的路径;dispatcher-servlet.xml 配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:mvc="/schema/mvc"xmlns:p="/schema/p"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd/schema/aop/schema/aop/spring-aop-3.0.xsd/schema/tx/schema/tx/spring-tx-3.0.xsd/schema/mvc/schema/mvc/spring-mvc-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd"><!--使Spring⽀持⾃动检测组件,如注解的Controller--><context:component-scan base-package="com.minx.crm.web.controller"/><bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"p:prefix="/WEB-INF/jsp/"p:suffix=".jsp" /></beans>第⼀个Controller:package com.minx.crm.web.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class IndexController {@RequestMapping("/index")public String index() {return "index";}}@Controller注解标识⼀个控制器,@RequestMapping注解标记⼀个访问的路径(/index.htm),return "index"标记返回视图(index.jsp);注:如果@RequestMapping注解在类级别上,则表⽰⼀相对路径,在⽅法级别上,则标记访问的路径;从@RequestMapping注解标记的访问路径中获取参数:Spring MVC ⽀持RESTful风格的URL参数,如:@Controllerpublic class IndexController {@RequestMapping("/index/{username}")public String index(@PathVariable("username") String username) {System.out.print(username);return "index";}}在@RequestMapping中定义访问页⾯的URL模版,使⽤{}传⼊页⾯参数,使⽤@PathVariable 获取传⼊参数,即可通过地址:http://localhost:8080/crm/index/tanqimin.htm 访问;根据不同的Web请求⽅法,映射到不同的处理⽅法:使⽤登陆页⾯作⽰例,定义两个⽅法分辨对使⽤GET请求和使⽤POST请求访问login.htm时的响应。
0.提示1) Spring发行版本附带了PetClinic 示例,它是一个在简单的表单处理的上下文中,利用了本节中说明的注解支持的Web应用程序。
可以在“samples/petclinic ”目录中找到PetClinic 应用程序。
2) 另外一个建立在基于注解的Web MVC上的示例应用程序,请见imagedb 。
这个示例集中在无状态的multi-action控制器,包括多段文件上传的处理。
可以在“samples/imagedb ”目录找到imagedb 应用程序。
1.建立dispatcher实现注解支持只有对应的HandlerMapping(为了实现类型级别的注解)和/ 或HandlerAdapter(为了实现方法级别的注解)出现在 dispatcher中时, @RequestMapping 才会被处理。
这在DispatcherServlet 和DispatcherPortlet 中都是缺省的行为。
然而,如果是在定义自己的HandlerMappings或HandlerAdapters,就需要确保一个对应的自定义的DefaultAnnotation HandlerMapping和 /或AnnotationMethod HandlerAdapter同样被定义——假设想要使用@RequestMapping 。
例1:雁联zfpt-servlet.xml例2:web.xml2.1 webAppRootKey2.3 log4jConfigLocation2.4 contextConfigLocation2.5 springSecurityFilterChain2.6 Log4jConfigListener2.7 ContextLoaderListener2.8 DispatcherServlet2.9 exception.java例3:雁联web.xml如果你想要自定义映射策略,显式的定义一个DefaultAnnotationHandlerMapping和 /或AnnotationMethodHandlerAdapter也有实际意义。
使用 Spring 2.5 基于注解驱动的 Spring MVC2009-07-16 作者:陈雄华来源:IBM本文内容包括:∙概述∙一个简单的基于注解的 Controller∙清单 3. annomvc-servlet.xml∙让一个 Controller 处理多个 URL 请求∙清单 3. 每个请求处理参数对应一个 URL∙处理方法入参如何绑定 URL 参数∙清单 5. 按参数名匹配进行绑定∙清单 8. 通过 @RequestParam 注解指定∙清单 11. 使模型对象的特定属性具有 Session范围的作用域∙请求处理方法的签名规约∙注册自己的属性编辑器∙如何准备数据∙小结∙参考资料基于注解的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,为 Spring MVC 提供了完全基于注解的配置。
本文将介绍 Spring 2.5 新增的 Sping MVC 注解功能,讲述如何使用注解配置替换传统的基于 XML 的 Spring MVC 配置。
概述继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能。
现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和 Controller 的映射关系,仅仅使用注解就可以让一个POJO 具有 Controller 的绝大部分功能——Spring MVC 框架的易用性得到了进一步的增强.在框架灵活性、易用性和扩展性上,Spring MVC 已经全面超越了其它的 MVC 框架,伴随着 Spring 一路高唱猛进,可以预见 Spring MVC 在 MVC 市场上的吸引力将越来越不可抗拒。
本文将介绍 Spring 2.5 新增的 Sping MVC 注解功能,讲述如何使用注解配置替换传统的基于 XML 的 Spring MVC 配置。
一个简单的基于注解的 Controller使用过低版本 Spring MVC 的读者都知道:当创建一个 Controller 时,我们需要直接或间接地实现 org.springframework.web.servlet.mvc.Controller 接口。
一般情况下,我们是通过继承 SimpleFormController 或MultiActionController 来定义自己的 Controller 的。
在定义 Controller 后,一个重要的事件是在 Spring MVC 的配置文件中通过 HandlerMapping 定义请求和控制器的映射关系,以便将两者关联起来。
来看一下基于注解的 Controller 是如何定义做到这一点的,下面是使用注解的BbtForumController:清单 1. BbtForumController.javapackage com.baobaotao.web;import com.baobaotao.service.BbtForumService;importorg.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.ModelAttribute;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;import java.util.Collection;@Controller //<——①@RequestMapping("/forum.do")public class BbtForumController {@Autowiredprivate BbtForumService bbtForumService;@RequestMapping //<——②public String listAllBoard() {bbtForumService.getAllBoard();System.out.println("call listAllBoard method.");return "listBoard";}}从上面代码中,我们可以看出 BbtForumController 和一般的类并没有区别,它没有实现任何特殊的接口,因而是一个地道的 POJO。
让这个 POJO 与众不同的魔棒就是 Spring MVC 的注解!在① 处使用了两个注解,分别是 @Controller 和 @RequestMapping。
在“使用 Spring 2.5 基于注解驱动的 IoC”这篇文章里,笔者曾经指出过@Controller、@Service 以及 @Repository 和 @Component 注解的作用是等价的:将一个类成为 Spring 容器的 Bean。
由于 Spring MVC 的 Controller 必须事先是一个 Bean,所以 @Controller 注解是不可缺少的。
真正让 BbtForumController 具备 Spring MVC Controller 功能的是@RequestMapping 这个注解。
@RequestMapping 可以标注在类定义处,将Controller 和特定请求关联起来;还可以标注在方法签名处,以便进一步对请求进行分流。
在① 处,我们让 BbtForumController 关联“/forum.do”的请求,而② 处,我们具体地指定 listAllBoard() 方法来处理请求。
所以在类声明处标注的 @RequestMapping 相当于让 POJO 实现了 Controller 接口,而在方法定义处的 @RequestMapping 相当于让 POJO 扩展 Spring 预定义的Controller(如 SimpleFormController 等)。
为了让基于注解的 Spring MVC 真正工作起来,需要在 Spring MVC 对应的xxx-servlet.xml 配置文件中做一些手脚。
在此之前,还是先来看一下 web.xml 的配置吧:清单 2. web.xml:启用 Spring 容器和 Spring MVC 框架<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>Spring Annotation MVC Sample</display-name><!-- Spring 服务层的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value> </context-param><!-- Spring 容器启动监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener </listener-class></listener><!-- Spring MVC 的Servlet,它将加载WEB-INF/annomvc-servlet.xml 的配置文件,以启动Spring MVC模块--><servlet><servlet-name>annomvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>annomvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping></web-app>web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。
annomvc-servlet.xml 的配置内容如下所示:清单 3. annomvc-servlet.xml<?xml version="1.0" encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd /schema/context/schema/context/spring-context-2.5.xsd" ><!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 --><context:component-scan base-package="com.baobaotao.web"/><!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/><!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResol ver"p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/></beans>因为 Spring 所有功能都在 Bean 的基础上演化而来,所以必须事先将Controller 变成 Bean,这是通过在类中标注 @Controller 并在annomvc-servlet.xml 中启用组件扫描机制来完成的,如① 所示。