• SpringMVC


    目录

    1.什么是MVC

    2.SpringMVC搭建

    3.数据提交方式

    单字段提交

    对象封装提交

    路径占位符提交数据

    请求参数名称和形参名称不一致

    HttpServletRequest获取数据

    4.中文乱码解决方案

    5.SpringMVC的四种跳转方式

    请求转发到页面(默认)

    随便转发到任何页面(可以不再ViewResolver的前后限制)

    请求转发到其他action

    重定向到页面

    重定向到其他action

    6.SpringMVC默认携带得参数

    7.@ResponseBody

    8.日期处理

    日期提交处理

    单个日期处理

    类中全局日期处理

    日期的显示

    JSON中的日期显示

    JSP页面日期显示

    需要jstl标签库依赖

    9. mvc:annotation-driven

    10.资源在WEB-INF目录下

    11.SpringMVC拦截器

    12.过滤器

     13.跨域访问


    1.什么是MVC

      它是一种开发模式,它是模型视图控制器的简称.所有的web应用都是基于MVC开发.
      M:模型层,包含实体类,业务逻辑层,数据访问层
      V:视图层,html,javaScript,vue等都是视图层,用来显现数据
      C:控制器,它是用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是组件

    2.SpringMVC搭建

    步骤:

    1.新建maven_web项目

     2.修改目录,添加缺失的test,java,resources(两套),并修改目录属性

    3.添加依赖

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-webmvcartifactId>
    4. <version>5.2.5.RELEASEversion>
    5. dependency>
    6. <dependency>
    7. <groupId>javax.servletgroupId>
    8. <artifactId>javax.servlet-apiartifactId>
    9. <version>3.1.0version>
    10. dependency>

    4.添加springmvc.xml配置文件,指定包扫描,添加视图解释器

    1. <context:component-scan base-package="com.bjpowernode.controller">context:component-scan>
    2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    3. <property name="prefix" value="/admin/">property>
    4. <property name="suffix" value=".jsp">property>
    5. bean>

    5.删除web.xml,自动生成的web.xml版本过低,重新添加web.xml

     6.在web.xml文件中注册springMVC框架(所有的web请求都是基于servlet的)

    1. <servlet>
    2. <servlet-name>springmvcservlet-name>
    3. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    4. <init-param>
    5. <param-name>contextConfigLocationparam-name>
    6. <param-value>classpath:springmvc.xmlparam-value>
    7. init-param>
    8. servlet>
    9. <servlet-mapping>
    10. <servlet-name>springmvcservlet-name>
    11. <url-pattern>/url-pattern>
    12. servlet-mapping>

    3.数据提交方式

    单字段提交

    对象封装提交

    在方法中声明一个自定义的实体类参数,框架调用实体类中相应的setter方法注入属性值,只要保证实体类中成员变量的名称与提交请求的name属性值一致即可。

    路径占位符提交数据

    使用框架提供的一个注解@PathVariable,将请求url中的值作为参数进行提取

    请求参数名称和形参名称不一致

    请求与形参中的名字不对应,可以使用

    @RequestParam(value="name1",required=true)String namea来进行参数名称绑定。

    HttpServletRequest获取数据

    1. /**
    2. * 姓名:
    3. * 年龄:
    4. */
    5. @RequestMapping("/five")
    6. public String five(HttpServletRequest request){
    7. String name = request.getParameter("name");
    8. int age = Integer.parseInt(request.getParameter("age"));
    9. System.out.println("name="+name+",age="+(age+100));
    10. return "main";
    11. }

    4.中文乱码解决方案

    pring 对于请求参数中的中文乱码问题,给出了专门的字符集过滤器: spring-web-5.2.5.RELEASE.jar 的org.springframework.web.filter 包下的 CharacterEncodingFilter 类。

    在 web.xml 中注册字符集过滤器,即可解决 Spring 的请求参数的中文乱码问题。不过,最好将该过滤器注册在其它过滤器之前。因为过滤器的执行是按照其注册顺序进行的。

    1. <filter>
    2. <filter-name>encodefilter-name>
    3. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    4. <init-param>
    5. <param-name>encodingparam-name>
    6. <param-value>UTF-8param-value>
    7. init-param>
    8. <init-param>
    9. <param-name>forceRequestEncodingparam-name>
    10. <param-value>trueparam-value>
    11. init-param>
    12. <init-param>
    13. <param-name>forceResponseEncodingparam-name>
    14. <param-value>trueparam-value>
    15. init-param>
    16. filter>
    17. <filter-mapping>
    18. <filter-name>encodefilter-name>
    19. <url-pattern>/*url-pattern>
    20. filter-mapping>

    5.SpringMVC的四种跳转方式

    默认的跳转是请求转发,直接跳转到jsp页面展示,还可以使用框架提供的关键字redirect:,进行一个重定向操作,包括重定向页面和重定向action,使用框架提供的关键字forward:,进行服务器内部转发操作,包括转发页面和转发action。当使用redirect:和forward:关键字时,视图解析器中前缀后缀的拼接就无效了。

    请求转发到页面(默认)

    1. @RequestMapping("/one")
    2. public String one(){
    3. System.out.println("这是请求转发页面跳转.........");
    4. return "main"; //默认是请求转发,使用视图解析器拼接前缀后缀进行页面跳转
    5. }

    随便转发到任何页面(可以不再ViewResolver的前后限制)

    1. @RequestMapping("/five")
    2. public String five(){
    3. System.out.println("这是随便跳.......");
    4. //ViewResolver设置的prefix为/admin,这里可以跳转到其他folder下的页面
    5. return "forward:/fore/login.jsp";
    6. }

    请求转发到其他action

    1. @RequestMapping("/two")
    2. public String two(){
    3. System.out.println("这是请求转发action跳转.........");
    4. //forward: 这组字符串可以屏蔽前缀和后缀的拼接.实现请求转发跳转
    5. return "forward:/other.action";
    6. }

    重定向到页面

    1. @RequestMapping("/three")
    2. public String three(){
    3. System.out.println("这是重定向页面.......");
    4. //redirect: 这组字符串可以屏蔽前缀和后缀的拼接.实现重定向跳转
    5. return "redirect:/admin/main.jsp";
    6. }

    重定向到其他action

    1. @RequestMapping("/four")
    2. public String four(){
    3. System.out.println("这是重定向action.......");
    4. //redirect: 这组字符串可以屏蔽前缀和后缀的拼接.实现重定向跳转
    5. return "redirect:/other.action";
    6. }

    6.SpringMVC默认携带得参数

      不需要去创建,直接拿来使用即可.
      1)HttpServletRequest
      2)HttpServletResponse
      3)HttpSession
      4)Model
      5)Map
      6)ModelMap

    1. //做一个数据,传到main.jsp页面上
    2. Users u = new Users("张三",22);
    3. //传递数据
    4. request.setAttribute("requestUsers",u);
    5. session.setAttribute("sessionUsers",u);
    6. model.addAttribute("modelUsers",u);
    7. map.put("mapUsers",u);
    8. modelMap.addAttribute("modelMapUsers",u);

    注意:Map,Model,ModelMap和request一样,都使用请求作用域进行数据传递.所以服务器端的跳转必须是请求转发.

    7.@ResponseBody

    在springmvc.xml文件中添加注解驱动,它用来解析@ResponseBody注解

      <mvc:annotation-driven>mvc:annotation-driven>
    

    @ResponseBody返回json格式

    使用的jackson工具进行转换,必须要添加jackson依赖

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.coregroupId>
    3. <artifactId>jackson-databindartifactId>
    4. <version>2.9.8version>
    5. dependency>
    1. @Controller
    2. public class AjaxAction {
    3. //处理ajax请求,一定要加@ResponseBody
    4. @ResponseBody
    5. @RequestMapping("/ajax")
    6. public List ajax(){
    7. Student stu1 = new Student("张三",22);
    8. Student stu2 = new Student("李四",24);
    9. Student stu3 = new Student("王五",23);
    10. List list = new ArrayList<>();
    11. list.add(stu1);
    12. list.add(stu2);
    13. list.add(stu3);
    14. //调用json转换工具ObjectMapper进行转换
    15. return list; //===>springmvc负责转换成json
    16. }
    17. }

    8.日期处理

    日期提交处理

    单个日期处理

    日期类型不能自动注入到方法的参数中。需要单独做转换处理。使用@DateTimeFormat注解,需要在springmvc.xml文件中添加<mvc:annotation-driven/>标签。

    1. @RequestMapping("/submitone")
    2. public String submitdateone(
    3. @DateTimeFormat(pattern="yyyy-MM-dd")
    4. Date mydate){
    5. System.out.println(mydate);
    6. return "dateShow";
    7. }

    或者

    在类的成员setXXX()方法上使用@DateTimeFormat注解

    1. @DateTimeFormat(pattern="yyyy-MM-dd")
    2. public void setDate(Date date) {
    3. this.date = date;
    4. }

    类中全局日期处理

    注册一个注解,用来解析本类中所有的日期类型,自动转换.

    1. @InitBinder
    2. public void initBinder(WebDataBinder dataBinder){
    3. dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(sf,true));
    4. }

    日期的显示

    JSON中的日期显示

    需要在类中的成员变量的getXXX方法上加注解.

    1. @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    2. public Date getDate() {
    3. return date;
    4. }

    JSP页面日期显示

    需要jstl标签库依赖

    1. <dependency>
    2. <groupId>jstlgroupId>
    3. <artifactId>jstlartifactId>
    4. <version>1.2version>
    5. dependency>

    在页面上导入标签库

    1.     <%--导入jstl核心标签库--%>
    2.     <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3.     <%--导入jstl格式化标签库--%>
    4.     <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    1. <table width="800px" border="1">
    2. <tr>
    3. <th>姓名th>
    4. <th>生日th>
    5. tr>
    6. <c:forEach items="${list}" var="stu">
    7. <tr>
    8. <td>${stu.name}td>
    9. <fmt:formatDate value="${stu.birthday}" pattern="yyyy-MM-dd">fmt:formatDate>td>
    10. tr>
    11. c:forEach>
    12. table>

    9. mvc:annotation-driven

    会自动注册两个bean:

    分别为DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter

    是springmvc为@controller分发请求所必须的。除了注册了这两个bean,还提供了很多支持。

    1)支持使用ConversionService 实例对表单参数进行类型转换;

     2)支持使用 @NumberFormat 、@DateTimeFormat;

     3)注解完成数据类型的格式化;

     4)支持使用 @RequestBody 和 @ResponseBody 注解;

     5)静态资源的分流也使用这个标签;

    10.资源在WEB-INF目录下

    很多企业会将动态资源放在WEB-INF目录下,这样可以保证资源的安全性。在WEB-INF目录下的动态资源不可以直接访问,必须要通过请求转发的方式进行访问。这样避免了通过地址栏直接对资源的访问。重定向也无法访问动态资源。

    修改视图解析器的配置

    1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    2. <property name="prefix" value="/WEB-INF/jsp">property>
    3. <property name="suffix" value=".jsp">property>
    4. bean>

    11.SpringMVC拦截器

    SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。

      1)preHandle():在请求被处理之前进行操作

      2)postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果

      3)afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源

    拦截器实现的两种方式

      1)继承HandlerInterceptorAdapter的父类

      2)实现HandlerInterceptor接口,实现的接口,推荐使用实现接口的方式

     在springmvc.xml文件中注册拦截器

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <mvc:exclude-mapping path="/showLogin">mvc:exclude-mapping>
    5. <mvc:exclude-mapping path="/login">mvc:exclude-mapping>
    6. <bean class="com.bjpowernode.interceptor.LoginInterceptor">bean>
    7. mvc:interceptor>
    8. mvc:interceptors>

    12.过滤器

    过滤器和拦截器的执行顺序

    1. public class TestFilter1 extends Filter {
    2. @Override
    3. protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    4. //在DispatcherServlet之前执行
    5. System.out.println("############TestFilter1 doFilterInternal executed############");
    6. filterChain.doFilter(request, response);
    7. //在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后
    8. System.out.println("############TestFilter1 doFilter after############");
    9. }
    10. }
    11. public class TestFilter2 extends Filter {
    12. @Override
    13. protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    14. //在DispatcherServlet之前执行
    15. System.out.println("############TestFilter2 doFilterInternal executed############");
    16. filterChain.doFilter(request, response);
    17. //在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后
    18. System.out.println("############TestFilter2 doFilter after############");
    19. }
    20. }

    注册拦截器

    1. <filter>
    2. <filter-name>testFilter1filter-name>
    3. <filter-class>com.scorpios.filter.TestFilter1filter-class>
    4. filter>
    5. <filter-mapping>
    6. <filter-name>testFilter1filter-name>
    7. <url-pattern>/*url-pattern>
    8. filter-mapping>
    9. <filter>
    10. <filter-name>testFilter2filter-name>
    11. <filter-class>com.scorpios.filter.TestFilter2filter-class>
    12. filter>
    13. <filter-mapping>
    14. <filter-name>testFilter2filter-name>
    15. <url-pattern>/*url-pattern>
    16. filter-mapping>

     13.跨域访问

    注解@CrossOrigin出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。

    Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin

    你可以向@RequestMapping注解处理程序方法添加一个@CrossOrigin注解,以便启用CORS(默认情况下,@CrossOrigin允许在@RequestMapping注解中指定的所有源和HTTP方法):

    注解@CrossOrigin详解_huayang183的博客-CSDN博客_@crossorigin

  • 相关阅读:
    Shell脚本编程实践——第1关:编写一个脚本,求斐波那契数列的前10项及总和
    MySQL大表优化方案
    C#中的delegate和event,及他们的区别
    JVM系列金九银十面试必看(至尊典藏版)
    DCU集群搭建虚拟环境方法简介
    Python05、字典、键值对、文件、标准库
    直流无刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)
    Django day 10
    分布式一致性协议
    java 数据脱敏
  • 原文地址:https://blog.csdn.net/qq_33753147/article/details/127459204