Spring MVC(二)

1. 注解@RequestMapping修饰类

        在Spring MVC中一般都是使用注解@RequestMapping来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置的映射地址作用一致。在上一节的内容中,我们通过注解@RequestMapping改进了程序,让请求地址可以在方法中通过注解@RequestMapping来指定,代码显得非常简洁。

        注解@RequestMapping不仅可以修饰方法,还可以用来修饰类。在实际的项目中,大多都是采用模块化的编程,每个模块肯定各需要一个控制器,控制器中的不同方法对应不同的请求地址。在使用注解@RequestMapping修饰方法时,需要分别制定相应的请求地址,具体的代码如下所示。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*** 商品模块控制器*/
@Controller
public class ProductController {@RequestMapping("/product/add")public String add() {System.out.println("商品添加测试");return "product/add";}@RequestMapping("/product/update")public String update() {System.out.println("商品修改测试");return "product/update";}@RequestMapping("/product/list")public String list() {System.out.println("商品列表测试");return "product/list";}
}

        在每次编写操作方法的时候,都需要在相应的方法中加入相同的表示模块的映射地址(“/product”)。这样的话操作起来就会显得稍微麻烦一点,如果能在定义一个控制器的时候,就能指定代表模块的映射地址不是更好吗?

        注解@RequestMapping除了可以修饰方法,也可以用来修饰类。在类中加入注解@RequestMapping,就可以给这个控制器添加一个映射地址,其他的方法中就可以直接指定具体的访问地址即可,代码如下。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*** 商品模块控制器*/
@Controller
@RequestMapping("/product")
public class ProductController {@RequestMapping("/add")public String add() {System.out.println("商品添加测试");return "product/add";}@RequestMapping("/update")public String update() {System.out.println("商品修改测试");return "product/update";}@RequestMapping("/list")public String list() {System.out.println("商品列表测试");return "product/list";}
}

        此时,访问商品模块中的各方法,就可以通过类中的注解和方法中的注解共同组合成一个完整的映射地址,编写的时候就轻松了许多。

2. 注解@RequestMapping修饰方法

        在学习Servlet的时候,曾经对HTTP协议有过一些了解,一个完整的请求由三部分组成,分别是:请求行、消息报头、请求正文,其中请求行又包括:请求方法、请求地址、协议版本,通过这些信息就可以确定一个完整请求地址,最终访问到相应的资源。其中请求方法最常用的就是GET和POST,请求地址就是URL地址,请求报头是客户端向服务器端传递请求的附加信息以及客户端自身的信息,请求正文中包括发送请求所传递的参数等信息。

        通过注解@RequestMapping可以对HTTP协议的内容进行详细映射,前面我们已经用到了请求地址的映射,其实注解@RequestMapping除了可以映射请求地址外,还可以对请求方法、请求头、请求参数等信息映射请求。@RequestMapping有四个参数,分别是:value、method、heads、params,分别表示请求URL、请求方法、请求头和请求参数。这四个参数之间是与的关系,联合使用多个条件映射,可以增加请求映射的精确性。注解@RequestMapping默认为请求URL,之前的例子中注解@RequestMapping中添加的就是映射地址,四个参数中最为常用的就是请求地址和请求方法。

       使用注解@RequestMapping来设置请求方法具体使用代码如下。

@RequestMapping(value="/add", method=RequestMethod.POST)
public String add() {System.out.println("商品添加测试");return "redirect:/product/list";//目标重定向
}

        注意:处理完成以后,返回值是以“redirect:”开头的,这表示目标重定向,也就是我们俗称的客户端跳转

        此时访问这个方法的时候,请求类型就必须是POST,否则就会出现错误。因此在具体的操作时候,我们可以通过请求类型来指定具体的操作方法,HTTP请求的类型有GET、POST、PUT、DELETE等。通过注解@RequestMapping可以指定所要处理的请求类型,代码如下所示。

/*** 处理修改操作*/
@RequestMapping(value="/update", method=RequestMethod.PUT)
public String update() {System.out.println("商品修改测试");return "redirect:/product/list";
}/*** 处理删除操作*/
@RequestMapping(value="/delete", method=RequestMethod.DELETE)
public String delete() {System.out.println("商品删除测试");return "redirect:/product/list";
}

        注意:以上的写法不是最终开发的代码,在接下来的章节中会做更正,在此只是简单的演示操作。

        在学习Servlet的时候,通过表单只能是以GET或POST提交方式,要实现PUT和DELETE提交,需要借助于HiddenHttpMethodFilter过滤器操作,以下是HiddenHttpMethodFilter类的部分源代码。

/** Default method parameter: {@code _method} */
public static final String DEFAULT_METHOD_PARAM = "_method";private String methodParam = DEFAULT_METHOD_PARAM;/**
* Set the parameter name to look for HTTP methods.
* @see #DEFAULT_METHOD_PARAM
*/
public void setMethodParam(String methodParam) {Assert.hasText(methodParam, "'methodParam' must not be empty");this.methodParam = methodParam;
}@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {HttpServletRequest requestToUse = request;if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {String paramValue = request.getParameter(this.methodParam);if (StringUtils.hasLength(paramValue)) {requestToUse = new HttpMethodRequestWrapper(request, paramValue);}}filterChain.doFilter(requestToUse, response);
}

        通过源码可以发现,实现PUT和DELETE提交,需要通过POST提交转换,在提交的时候必须传入一个参数,参数名是“_method”。如果需要转换为PUT提交,传入的参数值是“PUT”,如果需要转换为DELETE提交,传入的参数值是“DELETE”。在具体的操作时,首先要配置这个过滤器,在web.xml文件中添加配置,代码如下。

<filter><filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

        在具体的JSP页面操作的代码如下。

<!-- POST提交转PUT提交 -->
<form action="product/update" method="post"><input type="hidden" name="_method" value="PUT"><input type="submit" value="PUT提交">
</form><!-- POST提交转DELETE提交 -->
<form action="product/update" method="post"><input type="hidden" name="_method" value="DELETE"><input type="submit" value="DELETE提交">
</form>

        在每个表单中,都有一个隐藏表单域,用来指定提交的类型,这样做不仅可以实现参数传递,同时也不影响页面中的标签显示。

        注解@RequestMapping可以指定一个详细的URL地址,在被注解的方法中,就不需要考虑请求路径问题了,可以着重编写具体的业务代码,真正做到了请求和响应互不交叉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统基础知识

计算机软件基础知识计算机软件基础知识 软件构件 构件又称为组件&#xff0c;是一个自包容、可复用的程序集&#xff0c;这个集合整体向外提供统一的访问接口&#xff0c; 构件外部只能通过接口来访问构件&#xff0c;而不能直接操作构件的内部。 构件的两个最重要的特性是自…

vue3.0(五) reactive全家桶

文章目录 1 reactive1.1 reactive的应用1.2 reactive的特点1.3 reactive的注意1.4 reactive的局限性 2 toRefs3 isReactive4 shallowReactive5 readonly5.1 readonly 详细信息5.2 readonly函数创建一个只读的响应式对象5.3 如何修改嵌套在只读响应式对象中的对象? 6 isReadonl…

小程序(三)

十三、自定义组件 &#xff08;二&#xff09;数据方法声明位置 在js文件中 A、数据声明位置&#xff1a;data中 B、方法声明位置methods中&#xff0c;这点和普通页面不同&#xff01; Component({/*** 组件的属性列表*/properties: {},/*** 组件的初始数据*/data: {isCh…

在RK3588开发板使用FFMpeg 结合云服务器加SRS实现摄像头数据推流到云端拱其他设备查看

今天测试了一把在开发板把摄像头数据推流到云端服务器&#xff0c;然后给其他电脑通过val软件拉取显示摄像头画面&#xff0c;浅浅记录一下大概步骤 1.开发板端先下载ffmpeg apt install ffmpeg2.云服务器先安装SRS的库 云服务器我使用ubuntu系统&#xff0c;SRS是个什么东西&…

优雅处理Python 使用xlrd 读取 Excel 报错:xlrd.compdoc.CompDocError

在用python xlrd库读取excel时&#xff0c;有时候会遇到 xlrd.compdoc.CompDocError报错。 其实注释掉库种raise的那几行&#xff0c;可以是可以&#xff0c;但是要修改库文件&#xff0c;并不好。 最好的方式是&#xff1a; wb open_workbook(fpath, formatting_infoTrue…

Mujoco210 和 Mujoco-py 在 Ubuntu22.04 下的安装

mujoco和mujoco-py的关系:mujoco是一个物理引擎,主要应用于强化学习和最优化控制领域。mujoco-py是mujoco编程的 Python 接口,由OpenAI Gym开发,可以使用mujoco_py方便地调用mujoco的API。 mujoco官网: https://mujoco.org/ 1.安装 Mujoco210 1. 从 Github下载 Mujoco …

怎么开发付费视频系统_轻松拥有知识付费平台

在信息爆炸的时代&#xff0c;我们每天都在被海量的内容所包围。但你有没有想过&#xff0c;如何将这些内容变得更加有价值&#xff0c;更加个性化&#xff0c;甚至能够为你带来经济收益&#xff1f;今天&#xff0c;就让我带你走进一个全新的领域——付费视频系统&#xff0c;…

电解制氢电源-零排放氢源生成器

电解制氢电源&#xff1a;氢能源的制造者 氢能作为一种清洁、高效的能源&#xff0c;正逐渐成为我国能源战略的重要组成部分。电解制氢电源作为氢能产业链的核心环节&#xff0c;对于实现氢能产业的可持续发展具有重要意义。 电解制氢电源是一种利用电能将水分解为氢气和氧气的…

RustGUI学习(iced)之小部件(八):如何使用svg部件显示矢量图形?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第八篇,主要讲述svg矢量图形部件的使用,会结合实…

Django项目之电商购物商城 -- 新增收货地址

Django项目之电商购物商城 – 新增收货地址 在项目中新增收货地址我们需要根据前端的设置来写 在这里我们看到新增收货地址的方法发送的是一个ajax请求 , 使用的是post方法 , 其路由为addresses/create 分析完毕后开始写视图以及路由 一. 设置视图以及路由 因为新增地址依…

vue数据大屏并发请求

并发? 处理并发 因为js是单线程的&#xff0c;所以前端的并发指的是在极短时间内发送多个数据请求&#xff0c;比如说循环中发送 ajax , 轮询定时器中发送 ajax 请求. 然后还没有使用队列, 同时发送 的. 1. Promise.all 可以采用Promise.all处理并发&#xff0c; 当所有pro…

JavaScript字符串对象的常用方法

JavaScript字符串对象是指通过String构造函数创建的字符串实例。下面是一些常用的字符串方法的详细解析与案例说明&#xff1a; charAt(index)&#xff1a;返回指定索引位置的字符。 var str "Hello World"; console.log(str.charAt(0)); // "H"concat(…

传输层协议——UDP协议

目录 一、传输层 二、再谈端口号 端口号的划分 知名端口号 pidof netstat命令 三、UDP协议 1、UDP协议格式 2、UDP协议特点 3、UDP协议的缓冲区 四、基于UDP的应用层协议 一、传输层 上一篇文章我们所讲到的HTTP协议和HTTPS协议&#xff0c;是属于应用层协议。我们…

vue3.x + echarts 5.x + ant-design-vue 4.x + monaco-editor v3 新增版本切换功能

前言 1. 因为vue架构中&#xff0c;大多数包都是通过npm / yarn 等工具直接安转到node_modules 使用 2. 多个版本切换时&#xff0c;不可能全部安装echarts版本 3. 所以思路围绕如何通过cdn动态引入echarts一、添加工具代码 loadScript 路径 utils/loadScript.js export de…

PYTHON做题复盘

1、关于递归的代码 #会返回None的错误代码while len(string)<1:return Trueelse:if string[0]!string[-1]:return Falseelse:string string[1:-1]#正确while len(string) > 1:if string[0] ! string[-1]:return Falseelse:string string[1:-1]return True 错误原因&am…

【NodeMCU实时天气时钟温湿度项目 2】WIFI模式设置及连接

第一专题内容&#xff0c;请参考 【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计-CSDN博客 第三专题内容&#xff0c;请参考 【NodeMCU实时天气时钟温湿度项目 3】连接SHT30传感器&#xff0c;获取并显示当前环境温湿度数据&#…

MySQL数据库变量使用

#MySQL变量的定义和使用 #一、标识符命名规范 #1.以字母或下划线开头&#xff0c;不能以数字开头 #2.不允许使用关键字和保留字 #3.只允许使用_和&#xffe5;作为标识符&#xff0c;不允许使用其他符号 #变量的定义方法 #set在update中使用过set&#xff0c;update声明修改表&…

致鸿物流器材有限公司揭示2024数字物流供应链与技术装备展新动态

参展企业介绍 广东致鸿物流器材有限公司&#xff0c;前身为广州致鸿物流器材有限公司&#xff0c;成立于2002年初&#xff0c;是一家在中国仓储笼行业成立多年的专业仓储笼制造公司&#xff0c;公司员工约400名&#xff0c;日产仓储笼制造规模近8000个&#xff0c;在全国范围内…

华为OD机试 - 手机App防沉迷系统(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

自动驾驶学习2-毫米波雷达

1、简介 1.1 频段 毫米波波长短、频段宽,比较容易实现窄波束,雷达分辨率高,不易受干扰。波长介于1~10mm的电磁波,频率大致范围是30GHz~300GHz 毫米波雷达是测量被测物体相对距离、相对速度、方位的高精度传感器。 车载毫米波雷达主要有24GHz、60GHz、77GHz、79GHz四个频段。 …