当前位置: 首页 > news >正文

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地址,在被注解的方法中,就不需要考虑请求路径问题了,可以着重编写具体的业务代码,真正做到了请求和响应互不交叉。

相关文章:

Spring MVC(二)

1. 注解RequestMapping修饰类 在Spring MVC中一般都是使用注解RequestMapping来映射请求&#xff0c;也就是通过它来指定控制器可以处理哪些URL请求&#xff0c;相当于Servlet中在web.xml中配置的映射地址作用一致。在上一节的内容中&#xff0c;我们通过注解RequestMapping改进…...

ECP44304T-76是一款增强型通信处理器吗?

ABB ECP44304T-76是一款增强型通信处理器&#xff0c;专为ABB的PLC控制系统设计。 这款通信处理器的主要功能是提供PLC与其他设备或网络之间的通信接口。它支持多种通讯协议&#xff0c;包括但不限于Profibus、Ethernet、Modbus等&#xff0c;使得PLC可以轻松集成到复杂的工业…...

mongoDB分组查询

完整代码 //根据医院编号 和 科室编号 &#xff0c;查询排班规则数据Overridepublic Map<String, Object> getRuleSchedule(long page, long limit, String hoscode, String depcode) {//1 根据医院编号 和 科室编号 查询Criteria criteria Criteria.where("hosco…...

【Java 刷题记录】位运算

位运算 33. 位1的个数 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;3 解释…...

WINDOWS下zookeeper突然无法启动但是端口未占用的解决办法(用了WSL)

windows下用着用着时候突然zookeeper启动不了了。netstat查也没有找到端口占用&#xff0c;就是起不来。控制台报错 java.lang.reflect.UndeclaredThrowableException: nullat org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147) ~…...

【LLM第三篇】名词解释:RLHF——chatgpt的功臣

RLHF (Reinforcement Learning from Human Feedback) &#xff0c;直译为&#xff1a;“来自人类反馈的强化学习”。RLHF是一种结合了强化学习和人类反馈的机器学习方法&#xff0c;主要用于训练大模型以执行复杂的任务&#xff0c;尤其是当这些任务难以通过传统的奖励函数来精…...

基于Opencv的车牌识别系统(毕业设计可用)

系统架构 图像采集&#xff1a;首先&#xff0c;通过摄像头等设备捕捉车辆图像。图像质量直接影响后续处理的准确性&#xff0c;因此高质量的图像采集是基础。 预处理&#xff1a;对获取的原始图像进行预处理&#xff0c;包括灰度化、降噪、对比度增强和边缘检测等。这些操作旨…...

Leetcode—295. 数据流的中位数【困难】

2024每日刷题&#xff08;132&#xff09; Leetcode—295. 数据流的中位数 实现代码 class MedianFinder { public:MedianFinder() {}void addNum(int num) {if(maxHeap.empty() || num < maxHeap.top()) {maxHeap.push(num);} else {minHeap.push(num);}if(maxHeap.size(…...

JavaWeb之过滤器(Filter)与监听器(Listener)

前言 过滤器(Filter) 1.什么是过滤器 2.过滤器的语法格式 3.使用场景 3.1.如何防止用户未登录就执行后续操作 3.2.设置编码方式--统一设置编码 3.3.加密解密(密码的加密和解密) 3.4.非法文字筛选 3.5.下载资源的限制 监听器(Listener) 1.什么是监听器 2.监听器分类…...

video.js的请求头问题

为了防止视频被轻易下载&#xff0c;我们项目需要在请求视频地址的时候&#xff0c;增加token识别&#xff0c;避免url一粘贴到浏览器地址上就能被盗。 明明一开始就找到的方法&#xff1a; // ts-ignorevideojs.Vhs.xhr.beforeRequest function (options) {options.headers …...

leetcode 1235

leetcode 1235 代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vector<vector<int>> jobs(n);for(int i0; i<n; i){jobs[i] …...

Activiti7 开发快速入门【2024版】

记录开发最核心的部分&#xff0c;理论结合业务实操减少废话&#xff0c;从未接触工作流快速带入开发。假设你是后端的同学学过JAVA和流程图&#xff0c;则可以继续向后看&#xff0c;否则先把基础课程书准备好先翻翻。 为什么要工作流 比起直接使用状态字段&#xff0c;工作…...

vue3组件插槽

Index.vue: <script setup> import { ref, onMounted } from vue import Child from ./Child.vue import ./index.cssonMounted(() > {}) </script><template><div class"m-home-wrap"><Child>插槽</Child><div class&qu…...

Cloudera简介和安装部署

ChatGPT Cloudera 是一个基于 Apache Hadoop 的数据管理和分析平台。它是由 Hadoop 的几位创始人及早期贡献者于 2008 年创立的公司&#xff0c;并随着公司的不断发展&#xff0c;Cloudera 开始提供企业级的解决方案&#xff0c;帮助企业更好地利用 Hadoop 生态系统进行大数据…...

Spring Boot集成Ldap快速入门Demo

1.Ldap介绍 LDAP&#xff0c;Lightweight Directory Access Protocol&#xff0c;轻量级目录访问协议. LDAP是一种特殊的服务器&#xff0c;可以存储数据数据的存储是目录形式的&#xff0c;或者可以理解为树状结构&#xff08;一层套一层&#xff09;一般存储关于用户、用户…...

杨辉三角的打印

题目内容&#xff1a; 在屏幕上打印杨辉三角。 思路&#xff1a; 首先我们通过观察发现&#xff0c;每一步的打印都与行列数有关&#xff0c;中间的数据由这一列和上一行的前一列数据控制。所以我们可以使用二维数组进行操作&#xff1a; &#xff08;&#xff11;&#xff…...

贪吃蛇(下)游戏的实现

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.蛇和食物的打印二.游戏的运行逻辑三.结束游戏 &#xff08;善后工作&#xff09;四.游戏的测…...

偏微分方程算法之椭圆型方程差分格式编程示例

目录 一、示例1-五点菱形格式 1.1 C代码 1.2 计算结果 二、示例2-九点紧差分格式 2.1 C代码 2.2 计算结果 三、示例3-二阶混合边值 3.1 C代码 3.2 计算结果 本专栏对椭圆型偏微分方程的三种主要差分方法进行了介绍&#xff0c;并给出相应格式的理论推导过程。为加深对…...

PCIe协议之-TLP路由基础

✨前言&#xff1a; 在PCI Express (PCIe) 技术中&#xff0c;数据包的路由方式对于确保信息能够高效、准确地传送至目标设备至关重要。PCIe定义了几种路由方式&#xff0c;主要有以下几种。 &#x1f31f;地址路由&#xff08;Address Based Routing&#xff09; 这是最基本…...

inline内联函数-虚函数(virtual)可以是内联函数(inline)吗?

目录标题 inline内联函数特征&#xff1a;使用&#xff1a;编译器对inline函数的处理步骤优点&#xff1a;缺点&#xff1a; 虚函数&#xff08;virtual&#xff09;可以是内联函数&#xff08;inline&#xff09;吗&#xff1f;特征&#xff1a;使用&#xff1a; inline内联函…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...