• SpringMVC学习---第二课


    SpirngMVC注解式开发

    注解

    通过***@RequestMapping*** 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上,也可以注解在类上,但意义是不同的。value 属性值常以“/”开始。@RequestMapping 的 value 属性用于定义所匹配请求的 URI。

    当@RequestMapping注解在类上时,说明是有着相同的公共请求路径

    当@RequestMapping注解出现在方法上时,说明是对每个方法请求的路径

    以下代码发送的请求分别是:/项目名/zar/hello/项目名/zar/two

    @Controller //这个是声明类是Controller,将类加入springmvc管理
    @RequestMapping("/zar")  //声明相同的公共路径
    public class HelloSpringMvc {
    //相当于一个控制器处理的方法
    @RequestMapping("/hello")
    public String one() {
    return "main";
    }
    @RequestMapping("/two")
    public String two() {
    return "main";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    一个@Controller 所注解的类中,可以定义多个处理器方法。当然,不同的处理器方法所匹配的 URI 是不同的。

    对请求提交方式的定义

    对于@RequestMapping,其有一个属性 method,用于对被注解方法所处理请求的提交

    方式进行限制,即只有满足该 method 属性指定的提交方式的请求,才会执行该被注解方法。

    Method 属性的取值为 RequestMethod 枚举常量。
    常用的为 RequestMethod.GET 与RequestMethod.POST,分别表示提交方式的匹配规则为 GET 与 POST 提交。

    @RequestMapping(value = "/hello",method = RequestMethod.POST)
    public String one() {
    return "main";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    浏览器的常用请求方式有
    在这里插入图片描述

    只要指定了处理器方法匹配的请求提交方式为 POST,则相当于指定了请求发送的方式:要么使用表单请求,要么使用 AJAX 请求。其它请求方式被禁用。

    不指定 method 属性,则无论是 GET 还是 POST 提交方式,均可匹配。即对于请求的提交方式无要求

    五种数据的提交方式

    1. 单个数据注入

    在方法中声明一个和表单提交的参数名称相同的参数,由框架按照名称直接注入。

    在这里插入图片描述

    1. 对象封装注入

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

    在这里插入图片描述

    1. 动态占位符提交(只限于超链接

    使用框架提供的一个注解@PathVariable,将请求url中的值作为参数进行提取,只能是超链接。

    在这里插入图片描述

    1. 请求参数名称与形参名称不一致

    请求与形参中的名字不对应,可以使用
    @RequestParam(value=“name1”,required=true)String namea来进行参数名称绑定。
    在这里插入图片描述

    1. 使用HttpRequestServlet对象提取

    在方法参数中声明一个request对象,使用request的getParameter()获取表单提交的数据,这样得到的数据还要手工进行数据类型的转换。

    public String five(HttpServletRequest request){
    int age=new Integer(request.getParameter("stuage"));
    String name=request.getParameter("stuname");
    System.out.println(age+"*********"+name);
        return "main";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    请求参数中文乱码问题的解决

    对于前面所接收的请求参数,若含有中文,则会出现中文乱码问题。

    Spring 对于请求参数中的中文乱码问题,给出了专门的字符集过滤器: CharacterEncodingFilter 类。

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

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

    处理器方法的返回值

    1. 第一种:ModelAndView

    若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回 ModelAndView 比较好。
    若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的 Ajax 异步响应),则不需要返回这个

    1. 第二种:String

    处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址。

    配置视图解析器
    在这里插入图片描述

    1. 第三种:无返回值void

    对于处理器方法返回 void 的应用场景,应用在AJAX 响应处理。若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。

    1. 第四种:返回对象类型

    处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,自定义对象,Map,List 等。但返回的对象不是作为逻辑视图出现的而是作为直接在页面显示的数据出现的。返回对象,需要使用**@ResponseBody 注解**,将转换后的 JSON 数据放入到响应体中。
    Ajax请求多用于Object返回值类型。
    由于转换器底层使用了Jackson 转换方式将对象转换为JSON 数据,所以需要添加Jackson的相关依赖

    <dependency>
          <groupId>com.fasterxml.jackson.coregroupId>
          <artifactId>jackson-databindartifactId>
          <version>2.9.8version>
        dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    SpringMVC的四种跳转方式

    默认的跳转是请求转发,直接跳转到jsp页面展示

    还可以使用框架提供的关键字redirect:,进行一个重定向操作 ,包括重定向页面和重定向action,

    使用框架提供的关键字forward:,进行服务器内部转发操作,包括转发页面和转发action。

    当使用redirect:和forward:关键字时,视图解析器中前缀后缀的拼接就无效了。

    测试四种跳转方式,前端代码

    
    <a href="${pageContext.request.contextPath}/one.action">请求转发页面(默认)a><br>
    <a href="${pageContext.request.contextPath}/two.action">请求转发actiona><br>
    <a href="${pageContext.request.contextPath}/three.action">重定向页面a><br>
    <a href="${pageContext.request.contextPath}/four.action">重定向actiona><br>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试四种跳转方式后端代码

    @Controller
    public class JumpAction {
    
        @RequestMapping("/one")
        public String one(){
            System.out.println("请求转发页面(默认)");
            //以前的访问方式        //request.getRequestDispatcher("/admin/main.jsp").forward(request,response);
            //地址栏的变化:  http://localhost:8080/one.action
            //return "main"; //默认的访问方式是自动拼接前缀和后缀进行跳转
            return "forward:/fore/user.jsp";
    		//只要使用了forward:就可以屏蔽前缀和后缀的拼接,自己手工构建返回的全部路径+.jsp
        }
    
    
        @RequestMapping("/two")
        public String two(){
            System.out.println("请求转发action");
            //观察地址栏的变化:  http://localhost:8080/two.action
            return "forward:/other.action";   
            //不使用forward:,就会是这样的路径  /admin/other.action/.jsp
        }
    
        @RequestMapping("/three")
        public String three(){
            System.out.println("重定向页面");
            //观察地址栏的变化  http://localhost:8080/admin/main.jsp
            return "redirect:/admin/main.jsp";
            //只要使用了redirect:就可以屏蔽前缀和后缀的拼接
        }
    
    
        @RequestMapping("/four")
        public String four(){
            System.out.println("重定向action");
            //观察地址栏的变化  http://localhost:8080/other.action
            return "redirect:/other.action";
            //只要使用了redirect:就可以屏蔽前缀和后缀的拼接
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    SpringMVC支持的默认参数类型

    1. HttpServletRequest 对象
    2. HttpServletResponse 对象
    3. HttpSession 对象
    4. Model/ModelMap 对象 
    5. Map对象

    SpringMVC的拦截器

    拦截器说明

    SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。
    其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。
    当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

    拦截器的应用场景

    1. 日志记录:记录请求信息的日志
    2. 权限检查,如登录检查
    3. 性能检测:检测方法的执行时间

    拦截器执行原理

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

    该方法在处理器方法执行之前执行。其返回值为 boolean,若为 true,则紧接着会执行处理器方法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。

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

    该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。

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

    当preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此时对 ModelAndView 再操作也对响应无济于事。afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据等。

    在这里插入图片描述

  • 相关阅读:
    51单片机3【单片机的种类】
    勒索病毒最新变种.mkp勒索病毒来袭,如何恢复受感染的数据?
    创新发展,科技制胜 | 云扩科技入选“2022中小企业智能化解决方案提供商TOP10”
    next.js 集成redux
    CSDN每日一练 |『坐公交』『盗版解锁密码』『n边形划分』2023-09-17
    基于Android的校园好帮手app的设计与实现
    人脸识别5.1.2- insightface人脸检测模型RetinaFace-Paddle
    WSL 2 上启用微软官方支持的 systemd
    MYSQL length函数
    设计模式之工厂方法模式--更加符合开闭原则的工厂模式
  • 原文地址:https://blog.csdn.net/CXYCMY/article/details/128165307