• springMVC02,restful风格,请求转发和重定向


    springMVC02,restful风格,请求转发和重定向

    restful风格

    restful简介

    概念:

    Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    RESTFUL特点包括:

    1. 每一个URI代表1种资源;
    2. 客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
    3. 通过操作资源的表现形式来操作资源;
    4. 资源的表现形式是XML或者HTML;
    5. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息

    传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get

    ​ http://127.0.0.1/item/queryItem.action?id=1 查询,GET
    ​ http://127.0.0.1/item/saveItem.action 新增,POST
    ​ http://127.0.0.1/item/updateItem.action 更新,POST
    ​ http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

    使用RESTful操作资源 : 可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

    ​ http://127.0.0.1/item/1 查询,GET
    ​ http://127.0.0.1/item 新增,POST
    ​ http://127.0.0.1/item 更新,PUT
    ​ http://127.0.0.1/item/1 删除,DELETE

    restful 例子测试

    首先创建一个maven项目,导入相关依赖,并且添加web支持,配置tomcat

    1.编写web.xml文件
    配置DispatcherServlet前端控制器(请求分发控制器)

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

    2.编写spring配置文件
    配置视图解析器,mvc注解驱动和spring注解驱动,以及静态资源请求过滤

      	
        <context:component-scan base-package="com.gothic.sunset.controller"/>
        
        <mvc:default-servlet-handler/>
        
        <mvc:annotation-driven/>
        
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/"/>
            
            <property name="suffix" value=".jsp"/>
        bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.编写controller
    com/gothic/sunset/controller UserController.java

    用下面的小例子,领会一下restful风格的特点:

    package com.gothic.sunset.controller;
    
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Controller
    public class UserController {
    
        @RequestMapping("/add/{a}/{b}")
        // @PathVariable注解的作用是 参数名的规范  和 mybatis中的@Param注解一样就不过多赘述
        public String add(Model model, @PathVariable("a") int a, @PathVariable("b") int b){
            int rs = a + b;
            String methodName = "+";
            model.addAttribute("param1",a);
            model.addAttribute("param2",b);
            model.addAttribute("method",methodName);
            model.addAttribute("rs",rs);
            return "test";
        }
    
        //可以通过@RequestMapping中的method属性来指定请求的方式  get post put .....
        // 其中的value属性之前也说过了,用来匹配地址栏请求映射
        @RequestMapping(value = "/del/{a}/{b}",method = RequestMethod.GET)
        public String del(Model model,@PathVariable("a") int a,@PathVariable("b") int b){
            int rs = a - b;
            String methodName = "-";
            model.addAttribute("param1",a);
            model.addAttribute("param2",b);
            model.addAttribute("method",methodName);
            model.addAttribute("rs",rs);
            return "test";
        }
    }
    
    
    • 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

    这里的话也可以使用@RequestMapping对应的衍生注解: @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping。

    比如上面的@RequestMapping(value = "/del/{a}/{b}",method = RequestMethod.GET) 就等同于@GetMapping(value="/del/{a}/{b}")。只是使用的时候需要注意,地址栏默认是使用get方式,你可以通过前台的表单中的action属性值来做对应不同的请求。

    然后就是@PathVariable注解和mybatis中的@Param注解一样,都是用来参数名的规范…

    4.视图层
    WEB-INF/jsp 新建test.jsp

    
    <%--
      Created by IntelliJ IDEA.
      User: gothi
      Date: 2022/12/2
      Time: 8:29
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        restful风格测试
    
    
    

    ${param1}${method}${param2}=${rs}

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.启动服务器测试
    在这里插入图片描述
    在这里插入图片描述
    相比较之前我们传统的传递参数,都是以?参数名=值&参数名2=值这样的方式,会暴露很多细节给用户,然后使用post的话虽然可以抹除这些参数,但是就是相当于压根不透露,还是不太好。
    使用restful后,我们可以隐藏一些细节,并且使地址栏变得简洁美观,而且多个地址其实都在一个页面。

    请求转发和重定向

    之前我们的请求转发,重定向是通过request对象和response对象来做的:

    • 重定向:rsp.sendRedirect("/index.jsp");
    • 请求转发: req.setAttribute("msg","/result/t3");或者 req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);

    在springmvc中,我们可以这样来做:

      //请求转发  forward:前缀
        @RequestMapping("/req")
        public String test1(Model model){
            String str = "请求转发 forward:前缀";
            model.addAttribute("msg",str);
            return "forward:/turn.jsp";
        }
    
    
        //重定向 redirect:前缀
        @RequestMapping("/rsp")
        public String test2(){
            return "redirect:/turn.jsp";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    新建turn.jsp 在web目录下:

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        请求转发及重定向测试
    
    
        

    ${msg}

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    SpringMVC中默认的转发视图是InternalResourceView

    SpringMVC中创建转发视图的情况:
    当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转

    SpringMVC中默认的重定向视图是RedirectView

    当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转。

    当转发和重定向时,都不需要经过视图解析器,所以只要手动确定了页面的正确位置即可。

    运行服务器测试:
    在这里插入图片描述
    在这里插入图片描述
    通过设置ServletAPI , 不需要视图解析器 .

    通过HttpServletResponse进行输出
    通过HttpServletResponse实现重定向
    通过HttpServletResponse实现转发

    	 //通过servletAPI的方式
    
        @RequestMapping("/re")
        public void test3(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
            rsp.getWriter().println("Hello,Spring BY servlet API");
        }
        //重定向 
        @RequestMapping("/rsp2")
        public void test4(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
            rsp.sendRedirect("/springmvcRestful/turn.jsp");
        }
        @RequestMapping("/req2")
        public void test5(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
            //转发
            req.setAttribute("msg","请求转发");
            req.getRequestDispatcher("/turn.jsp").forward(req,rsp);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述


    还得看看之前的作用域的问题…

  • 相关阅读:
    信号量机制
    doker中的Jenkins容器配置github
    word文档怎么变成pdf格式?这几种方法建议收藏
    Best Websites to Download Cracked Software for Free
    服务器免密登录设置
    React基础
    Taurus.MVC WebMVC 入门开发教程6:路由配置与路由映射
    jquery导航图片全屏滚动、首页全屏轮播图,各式相册
    【PostgreSQL内核学习(十四)—— (PortalRunMulti 和 PortalRunUtility)】
    JavaScript从入门到精通系列第二十三篇:JavaScript中的数组
  • 原文地址:https://blog.csdn.net/m0_63622279/article/details/128141651