SpringMVC 介绍
什么是SpringMVC
Spring MVC和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来
SpringMVC与Struts2的区别
对比点 | SpringMVC | Struts2 |
---|---|---|
程序入口 | 一个Servlet即前端控制器 | 一个Filter过虑器 |
接受参数 | 使用局部变量。用完就会消失,是线程安全的。 | 使用模型驱动:设置全局变量来接受参数。Action只能设计为多例,是线程不安全的。 |
开发模式 | 基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例)。 | 基于类开发,传递参数是通过类的属性,只能设计为多例。 |
相应数据 | 通过参数解析器,将request域请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。 | 采用值栈存储请求和响应的数据,通过OGNL存取数据。 |
SpringMVC的处理流程
SpringMVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是DispatcherServlet,它是一个Servlet,顶层是实现的Servlet接口。
跟踪SpringMVC的请求
- 当请求离开浏览器时❶,会带有用户请求与内容的信息,还可能带有其他信息,例如用户提交的表单信息。
- 第一站是Spring的DispatcherServlet(前端控制器)。与大多数java的Web框架一样,SpringMvc的所以请求都会通过一个前段控制器。前段控制器是常用的Web应用程序模式,在这里一个实例的Servlet将请求委托给应用程序的其他组件来执行实际的处理。
- DispatcherServlet(前端控制器)的任务是将请求发给SpringMvc的Controller(控制器)。Controller(控制器)是一个用于处理请求的Spring的组件。在经典的应用程序中可能会有多个控制器,DispatcherServlet(前端控制器)需要知道应该讲请求发送给那一个Controller(控制器)。所以DispatcherServlet(前端控制器)会查询一个或多个HandlerMapping(处理器映射器)❷来确定请求的下一站在哪里。DispatcherServlet(前端控制器)会根据请求所携带的URL信息来进行决策。
- 一旦选择了合适的控制器,DispatcherServlet(前端控制器)会将请求发送给选中的Controller(控制器)❸。到了控制器,请求会卸下其负载(用户提交的信息),并耐心等待Controller(控制器)处理这些信息。(实际上,良好设计的控制器本身只处理很少甚至不处理工作,而是将业务逻辑委托给一个或多个服务对象进行处理)
- Controller(控制器)在完成业务逻辑后,通常会产生生一些信息,这些信息需要返回给用户并在浏览器上显示。这些信息被称为Model(模型)。不过仅仅给用户返回原始的信息是不够的,这些信息需要用户友好的方式进行格式化,一版会是HTML。所以,信息需要发送给一个View(视图),通常是JSP。
- 控制器所做的最后一件事就是将模型数据打包,并表示出用于渲染的视图名。他接下来回将请求与连同ModelAndView(模型和视图)名发送回DispatcherServlet(前端控制器)❹。
- 这样,控制器就不会与特定的视图相耦合,传递给DispatcherServlet(前端控制器)的视图名并不直接表示某个特定的JSP。实际上,它甚至并不能确定视图就是JSP。相反,他仅仅传递了一个逻辑名称,这个名字将会用来查找产生的真正视图。DispatcherServlet(前端控制器)将会使用ViewResolver(视图解析器)❺来将逻辑视图名匹配为一个特定的视图实现。
- 既然DispatcherServlet(前端控制器)已经知道由哪一个视图渲染结果,那请求的任务基本上也就完成了。他最后的一站是View(视图)的实现❻,在这里他交付Model(模型)数据,请求的任务就完成了。视图将使用模型数据渲染输出,这个输出会通过相应对象传递给客户端(浏览器)❼。
- 可以看到请求经过很多的步骤,最终才能形成返回给客户端的相应。大多数是在Spring框架内部完成的,我们只需要配置相应的组件。
总结出来就是以下几点:
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle),通过xml配置或者注解进行查找
第三步:找到以后处理器映射器向前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器调用处理器适配器(HandlerAdapter)
第五步:处理器适配器去执行处理器
第六步:处理器执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器向前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果
SpringMVC的几个重要组件
- 前端控制器(DispatcherServlet):它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。相当于电脑的CPU。
- 处理器映射器(HandlerMapping):HandlerMapping负责根据用户请求找到Handler,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- 处理器(Handler):Handler 是继DispatcherServlet的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler,相当于Controller。
- 处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,相当于各种转换线。
- 视图解析器(ViewResovler):View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
- 视图(View) :SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
源码分析:深入了解SpringMVC
在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
Spring MVC包的结构
Spring 基础环境配置
在web.xml中添加DispatcherServlet(前端控制器)的配置
<!-- 前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 如果没有指定springMvc核心配置文件那么默认会去找/WEB-INF/+ <servlet-name>中的内容 + -servlet.xml配置文件 -->
<!-- 指定springMvc核心配置文件位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- tomcat启动的时候就加载这个servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- *.action 代表拦截后缀名为.action结尾的 -->
<!-- / 拦截所有但是不包括.jsp -->
<!-- /* 拦截所有包括.jsp -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
核心SpringMVC配置文件
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="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"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 组件扫描 扫描 com.lsy.controller 下的@Controller注解的类 -->
<context:component-scanbase-package="com.lsy.controller"/>
</beans>
测试程序
SpringMVCTest是一个普通的java类,不需要实现任何接口。只需要在方法上添加@Controller注解即可。
@Controller
public class SpringMVCTest{
@RequestMapping("/itemList")
public String itemList() {
System.out.printf("控制台输出SpringMVC");
return "/WEB-INF/jsp/itemList.jsp";
}
}
配置文件详解
Post请求乱码
- 在web.xml中添加DispatcherServlet(前端控制器)的配置
<!-- 配置Post请求乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Get请求乱码
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.
这就意味着,从tomcat8.0开始,get请求中的中文参数,不需要特殊处理了。而如果是tomcat8之前的项目要迁移到tomcat8上面来,则也需要特殊注意这个问题,可能要删减代码中响应乱码的处理模块了。
组件扫描器
- 使用组件扫描器,省去在Spring容器配置每个Controller类的繁琐。使用
<context:component-scan>
自动扫描标记@controller的控制器类。
<!-- 扫描controller注解,多个包中间使用半角逗号分隔 -->
<context:component-scanbase-package="com.lsy.controller"/>
处理器映射器和处理器适配器
- RequestMappingHandlerMapping:对类中标记@ResquestMapping的方法进行映射。根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。
<!--注解映射器 不推荐 -->
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
- RequestMappingHandlerAdapter:对类中标记@ResquestMapping的方法进行适配。
<!--注解适配器 不推荐 -->
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
- SpringMVC中使用
<mvc:annotation-driven>
自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可在springmvc.xml配置文件中使用<mvc:annotation-driven>
替代注解处理器和适配器的配置。
<!-- 注解驱动 : 自动加载处理器映射器和处理器适配器 -->
<mvc:annotation-driven />
视图解析器(Spring自带13种视图解析器)
- FreeMakerViewResolver:将视图解析为FreeMaker模板。
- ThymeleafViewResolver:用来替代JSP的新技术,Spring提供了其原生模板协作的视图解析器
- InternalResourceViewResolver:将视图解析为Web应用的内部资源(一般为JSP)。
- 配置InternalResourceViewResolver
- ViewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包。此属性可以不设置,默认为JstlView。
- prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:前缀+逻辑视图名+后缀.
- 逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”
<!-- InternalResourceViewResolver:支持JSP视图解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 真正的页面路径 = 前缀 + 去掉后缀名的页面名称 + 后缀 -->
<propertyname="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!-- 前缀 -->
<propertyname="prefix"value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<propertyname="suffix"value=".jsp"/>
</bean>
转换器Converter
- 自定义参数绑定
- 自定义转换器原本应配置在处理器适配器中,因为使用了
<mvc:annotation-driven>
自懂加载替换了原本的处理器适配器,故应配置在注解驱动中。
<!-- 加载注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 配置自定义转换器 -->
<!-- 注意: 一定要将自定义的转换器配置到注解驱动上 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<propertyname="converters">
<set>
<!-- 指定自定义转换器的全路径名称 -->
<beanclass="com.lsy.convert.DateConverter"/>
</set>
</property>
</bean>
SpringMVC 参数绑定
SpringMVC默认支持的类型
- HttpServletRequest :通过request对象获取请求信息
- HttpServletResponse:通过response处理响应信息
- HttpSession:通过session对象得到session中存放的对象
- Model/ModelMap:ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据
Items item = itemService.findItemById(id);
model.addAttribute("item", item);
//页面通过${item.xxx}获取item对象的属性值.
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。
绑定简单数据类型
- 当请求的参数名称和处理器形参名称一致时,会将请求参数与形参进行绑定。可以进一步简化从Request取参数的方式。
public String login(Model model,Integer id,Boolean status,String user){
}
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。
- @RequestParam:常用于处理简单类型的绑定
- value:参数名字,即传入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
如果请求参数中没有item_id:HTTP Status 500 - Required Integer parameter ‘item_id’ is not present - required:是否必须,默认是true,表示请求中一定要有相应的参数,如果没有:TTP Status 400 - Required Integer parameter ‘XXXX’ is not present
- defaultValue:默认值,表示如果请求中没有同名参数时的默认值
- value:参数名字,即传入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
//形参名称为id,但是这里使用value="item_id"限定请求的参数名为item_id。
public String login(@RequestParam(value="item_id",required=true) String id) {
}
绑定pojo类型
要求pojo对象中的属性名和表单中input的name属性一致。
注意:提交的表单中不要有日期类型的数据,否则会报400错误。原因:String类型无法转换成Date类型。
如果想提交日期类型的数据需要后面的自定义参数绑定的内容。
public String updateItem(Items items) {
}
绑定VO类型(包装的pojo)
如果是VO类型
public String queryItem(QueryVo queryVo) {
//页面定义<input type="text" name="items.name" />
//页面定义<input type="text" name="items.price" />
System.out.println(queryVo.getItems().getName());
System.out.println(queryVo.getItems().getPrice());
return null;
}
自定义参数绑定
- 在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式。
- 由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。
- 在SpringMVC这可以在处理器适配器上自定义Converter进行参数绑定。如果使用
<mvc:annotation-driven/>
可以在此标签上进行扩展。
/**
* Converter<S,T>
* S - source:源
* T - target:目标
*/
publicclass DateConverter implements Converter<String, Date> {
//需要继承Converter类
@Override
public Date convert(String source) {
try {
//自定义转换规则
Date date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(source);
return date;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
- 配置自定转换器(上文有提及 在配置文件详情中)
- 显示的配置自定义转换器(了解):自定义转换器配置在处理器适配器中。
<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<propertyname="converters">
<set>
<beanclass="cn.itcast.springmvc.convert.DateConverter"/>
</set>
</property>
</bean>
<!-- 自定义webBinder -->
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<propertyname="conversionService"ref="conversionService"/>
</bean>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<propertyname="webBindingInitializer"ref="customBinder"></property>
</bean>
<!-- 注解处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
绑定list
- jsp中的代码
<c:forEach items="${itemList }" var="item">
<tr>
<td><input name="ids" value="${item.id}" type="checkbox"></td>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
- Controller中代码
//Controller方法中可以用String[]接收,或者pojo的String[]属性接收。以下是String[]接受。
public String delItem(QueryVo queryVo, Integer[] ids) {
System.out.println(queryVo.getItems().getName());
System.out.println(queryVo.getItems().getPrice());
System.out.println(ids.toString());
return null;
}
SpringMVC 注解
@RequestMapping:
- 通过RequestMapping注解可以定义不同的处理器映射规则
- URL路径映射
@RequestMapping(value="/item")或@RequestMapping("/item)
value的值是数组,可以将多个url映射到同一个方法
- 窄化请求映射
在Class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
- 请求方法限定
限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported
限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘GET’ not supported
GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
SpringMVC 表单验证
SpringMVC 返回值
ModelAndView
modelAndView.addObject(“itemList”, list); 指定返回页面的数据
modelAndView.setViewName(“itemList”); 指定返回的页面
String(推荐使用)
返回普通字符串,就是页面去掉扩展名的名称, 返回给页面数据通过Model来完成
返回的字符串以forward:开头为请求转发
返回的字符串以redirect:开头为重定向
void(破坏了springMvc的结构,所以不建议使用)
- 如果controller返回值为void则不走springMvc的组件,所以要写页面的完整路径名称
使用request.setAttribut( ) 来给页面返回数据
request.getRequestDispatcher(“页面路径”).forward(request, response); 实现请求转发
response.sendRedirect(“url”); 实现重定向
全局异常处理
- 为了防止项目上线后给用户抛异常信息,所以需要在架构级别上整体处理全局异常
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理
- 自定义全局异常处理器:实现HandlerExceptionResolver接口
//自定义全局异常处理
public class CustomGlobalExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception exc) {
//输出异常
ex.printStackTrace();
//保存异常信息
String msg = "";
//判断异常类型
if(exc instanceof CustomException){
//处理业务级别异常
msg = ((CustomException)exc).getMessage();
} else {
//处理运行时异常
msg = "系统异常, 亲,对不起, 请及时联系管理员哦!";
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", msg);
modelAndView.setViewName("error");
return modelAndView;
}
}
- 在spirngMvc.xml中配置生效
<!-- 配置全局异常 -->
<bean id="handlerExceptionResolver" class="com.lsy.controller.exceptionResolver.CustomExceptionResolver"/>
文件上传
- 配置解析器
<!-- 定义文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
- JSP
- Controller
@Controller
public class PictureController {
@Value("${IMAGE_SERVER_URL}")
private String IMAGE_SERVER_URL;
@RequestMapping("/pic/upload")
@ResponseBody
public Map fileUpload(MultipartFile uploadFile) {
try {
//1、取文件的扩展名
String originalFilename = uploadFile.getOriginalFilename();
String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//2、创建一个FastDFS的客户端
FastDFSClient fastDFSClient = new FastDFSClient("classpath:resource/client.conf");
//3、执行上传处理
String path = fastDFSClient.uploadFile(uploadFile.getBytes(), extName);
//4、拼接返回的url和ip地址,拼装成完整的url
String url = IMAGE_SERVER_URL + path;
//5、返回map
Map result = new HashMap<>();
result.put("error", 0);
result.put("url", url);
return result;
} catch (Exception e) {
e.printStackTrace();
//5、返回map
Map result = new HashMap<>();
result.put("error", 1);
result.put("message", "图片上传失败");
return result;
/**
* // 1. 获取图片完整名称
* String fileStr = pictureFile.getOriginalFilename();
* //2. 使用随机生成的字符串+源图片扩展名组成新的图片名称,防止图片重名
* String newfileName = UUID.randomUUID().toString() + fileStr.substring(fileStr.lastIndexOf("."));
* //3. 将图片保存到硬盘
* pictureFile.transferTo(new File("E:\\image\\" + newfileName));
* //4.将图片名称保存到数据库
* items.setPic(newfileName);
* itmesService.updateItems(items);
* //返回数据
* return "redirect:itemEdit/"+items.getId();
*/
}
}
}
JSON交互
-
@Requestbody
- @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
- @RequestBody注解实现接收http请求的json数据,将页面传到controller中的json格式字符串自动转换成java的pojo对象
-
@ResponseBody
- 该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
- @ResponseBody注解实现将controller方法中java的pojo对象自动转换成json格式字符串转换为json响应给客户端
//@RequestBody,让spirngMvc将json格式字符串自动转换成java中的pojo
//页面json的key要等于java中pojo的属性名称
/Controller方法返回pojo类型的对象并且用@ResponseBody注解,SpringMVC会自动将pojo对象转换成json格式字符串
@RequestMapping("/sendJson")
@ResponseBody
public Items json(@RequestBody Items items) throws Exception{
System.out.println(items);
return items;
}
restful规范
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格,是对http协议的诠释。
资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。没有参数
Url格式:http://blog.csdn.net/beat_the_world/article/details/45621673
资源操作:使用put、delete、post、get,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。一般使用时还是post和get。
@RequestMapping(value="/ viewItems/{id}"):{×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
//页面跳转
@RequestMapping("/page/{topage}")
public String topage(@PathVariable("topage") String page) {
return page;
}
SpringMVC 拦截器
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
- 拦截器定义
实现HandlerInterceptor接口
Public class login implements HandlerInterceptor{
/**
* controller执行前调用此方法
* 返回true表示继续执行,返回false中止执行
* 这里可以加入登录校验、权限拦截等
*/
@Override
Public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
Return false;
}
/**
* controller执行后但未返回视图前调用此方法
* 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
*/
@Override
Public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
/**
* controller执行后且视图返回后调用此方法
* 这里可得到执行controller时的异常信息
* 这里可记录操作日志,资源清理等
*/
@Override
Public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {
// TODO Auto-generated method stub
}
}
- springmvc.xml配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器的执行顺序等于springMvc.xml中的配置顺序 -->
<mvc:interceptor>
<!-- 拦截请求的路径 要拦截所有必需配置成/** -->
<mvc:mapping path="/**"/>
<!-- 指定拦截器的位置 -->
<bean class="com.lsy.interceptor.login "></bean>
</mvc:interceptor>
</mvc:interceptors>
- 静态资源拦截
如果在DispatcherServlet中设置<url-pattern>/</url-pattern>
则必须对静态资源进行访问处理。
spring mvc 的<mvc:resources mapping="" location="">
实现对静态资源进行映射访问。
例如:<mvc:resources location="/js/" mapping="/js/**"/>