Spring Mvc学习笔记

    xiaoxiao2022-07-02  103

    SpringMVC 介绍

    什么是SpringMVC Spring MVC和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来 SpringMVC与Struts2的区别

    对比点SpringMVCStruts2程序入口一个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请求乱码

    Tomcat8官方文档

    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)。 配置InternalResourceViewResolverViewClass: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 presentrequired:是否必须,默认是true,表示请求中一定要有相应的参数,如果没有:TTP Status 400 - Required Integer parameter ‘XXXX’ is not presentdefaultValue:默认值,表示如果请求中没有同名参数时的默认值 //形参名称为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> JSPController @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/**"/>
    最新回复(0)