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

简介: 文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。

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前端控制器(请求分发控制器)

    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--绑定spring配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别为1,服务器启动时就启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

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

      <!--开启注解驱动-->
    <context:component-scan base-package="com.gothic.sunset.controller"/>
    <!--mvc过滤静态请求资源-->
    <mvc:default-servlet-handler/>
    <!--开启mvc注解驱动-->
    <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>

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";
    }
}

这里的话也可以使用@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" %>
<html>
<head>
    <title>restful风格测试</title>
</head>
<body>
<h1>${param1}${method}${param2}=${rs}</h1>
</body>
</html>

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";
    }

新建turn.jsp 在web目录下:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求转发及重定向测试</title>
</head>
<body>
    <h2>${msg}</h2>
</body>
</html>

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);
    }

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

在这里插入图片描述


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

相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
530 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
457 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
353 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。