SpringMVC(六)处理请求1.0

本文详细介绍了SpringMVC框架中的Action概念,包括多种参数类型及其使用方式,如基本数据类型、自定义POJO对象等,并提供了自动参数映射的具体实例。

Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action,每个请求处理方法可以有多个不同的参数,以及一个多种类型的返回结果。

Action参数类型
如果在请求处理方法中需要访问HttpSession对象,则可以添加HttpSession作为参数,Spring会将对象正确的传递给方法,如:public String action(HttpSession session);若需要访问客户端语言环境和HttpServletRequest对象,则可以在方法签名上包含这样的参数,如:public String action(HttpServletRequest request,Locale locale)。可以在请求中出现的参数类型有:

org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
java.util.Locale 当前请求的语言环境
java.util.TimeZone 时区
java.io.InputStream或java.io.Reader
java.io.OutputStream或java.io.Writer
org.springframework.http.HttpMethod
java.security.Principal
HttpEntity <?>参数用于访问Servlet的HTTP请求的标题和内容
java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap 视图隐含模型
org.springframework.web.servlet.mvc.support.RedirectAttributes 重定向
命令或表单对象
基本数据类型,如int,String,double…
复杂数据类型,如自定义的POJO对象
HandlerAdapter
org.springframework.validation.Errors / org.springframework.validation.BindingResult 验证结果
org.springframework.web.bind.support.SessionStatus 会话状态
org.springframework.web.util.UriComponentsBuilder
@PathVariable 注解参数访问URI模板变量。
@MatrixVariable 注释参数用于访问位于URI路径段键值对对,矩阵变量。
@RequestParam 注解参数访问特定的Servlet请求参数,请求参数绑定。
@RequestHeader 注解参数访问特定的se​​rvlet请求HTTP标头,映射请求头。
@RequestBody 注解参数访问HTTP请求主体,注解映射请求体
@RequestPart 注解参数访问“的multipart / form-data的”请求部分的内容。处理客户端上传文件,多部分文件上传的支持
@SessionAttribute 注解参数会话属性
@RequestAttribute 注解参数访问请求属性
(1)自动参数映射
1、方法的参数可以是任意基本数据类型,如果方法参数名与http中请求的参数名称相同时会进行自动映射,视图foo目录下的index.jsp与示例代码如下:

// 自动参数映射
    @RequestMapping("/action0")
    public String action0(Model model, int id, String name) {
        model.addAttribute("message", "name=" + name + ",id=" + id);
        return "foo/index";
    }

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Foo</title>
</head>
<body>
${message}
</body>
</html>

在这里插入图片描述
2、自定义数据类型
除了基本数据类型,也可以自定义的数据类型,如一个自定义的POJO对象,Spring MVC会通过反射把请中的参数设置到对象中,转换类型,示例代码如下:

import java.io.Serializable;

/** * 产品 */
public class Product implements Serializable {
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;
    private double price;

    public Product() {
    }

    public Product(String name, double price) {
        super();
        this.name = name;
        this.price = price;
    }

    public Product(int id, String name, double price) {
        super();
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "编号(id):" + this.getId() + ",名称(name):" + this.getName() + ",价格(price):" + this.getPrice();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

// 自动参数映射自定义数据类型
    @RequestMapping("/action01")
    public String action01(Model model, Product product) {
        model.addAttribute("message", product);
        return "foo/index";
    }

在这里插入图片描述

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)内容概要:本文围绕多旋翼无人机组合导航系统,重点介绍了基于多源信息融合算法的设计与实现,利用Matlab进行代码开发。文中采用扩展卡尔曼滤波(EKF)作为核心融合算法,整合GPS、IMU(惯性测量单元)、里程计和电子罗盘等多种传感器数据,提升无人机在复杂环境下的定位精度与稳定性。特别是在GPS信号弱或丢失的情况下,通过IMU惯导数据辅助导航,实现连续可靠的位姿估计。同时,文档展示了完整的算法流程与Matlab仿真实现,涵盖传感器数据预处理、坐标系转换、滤波融合及结果可视化等关键环节,体现了较强的工程实践价值。; 适合人群:具备一定Matlab编程基础和信号处理知识,从事无人机导航、智能控制、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多旋翼无人机的高精度组合导航系统设计;②用于教学与科研中理解多传感器融合原理与EKF算法实现;③支持复杂环境下无人机自主飞行与定位系统的开发与优化。; 阅读建议:建议结合Matlab代码与理论推导同步学习,重点关注EKF的状态预测与更新过程、多传感器数据的时间同步与坐标变换处理,并可通过修改噪声数或引入更多传感器类型进行扩展实验。
### Spring MVC POST 请求 415 错误解决方案 当在 Spring MVC 中使用 `@RequestBody` 注解接收 JSON 数据时,如果前端未正确设置请求头或数据格式不匹配,则会触发 HTTP 状态码 **415 Unsupported Media Type** 的错误。以下是详细的分析与解决方法: #### 问题原因 - 前端通过 AJAX 或其他方式发送的数据并非标准的 JSON 字符串[^4]。 - 后端控制器方法中使用了 `@RequestBody` 注解来绑定 JSON 数据到 Java 对象,但缺少必要的依赖库支持 JSON 转换[^3]。 - 配置文件中未启用对 JSON 处理的支持,或者 XML 文件中的命名空间定义缺失[^3]。 --- #### 解决方案 ##### 方法一:调整前端代码并确保正确的 Content-Type 设置 由于 `$().post()` 不允许显式指定 `Content-Type` 属性,因此建议改用更灵活的 jQuery `.ajax()` 方法,并手动设定请求头为 `application/json`: ```javascript $.ajax({ url: '/test', type: 'POST', contentType: 'application/json;charset=UTF-8', // 显式声明JSON格式 data: JSON.stringify({ key: "value" }), // 将JavaScript对象序列化成JSON字符串 success: function(response) { console.log('Success:', response); }, error: function(xhr, status, error) { console.error('Error:', xhr.responseText); } }); ``` 注意,在此实现中需调用 `JSON.stringify()` 函数将 JavaScript 对象转换为合法的 JSON 文本后再传递给服务器[^4]。 --- ##### 方法二:确认后端已引入 Jackson 库用于解析 JSON 数据 为了使 Spring MVC 支持自动将 JSON 输入流映射至实体类实例的功能,项目构建工具(如 Maven 或 Gradle)应包含如下依赖项之一: 对于 Maven 用户: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency> ``` 而对于 Gradle 则可写入以下内容: ```groovy implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8' ``` 上述版本号仅为示例,请依据实际需求选用最新稳定版[^3]。 --- ##### 方法三:验证 DispatcherServlet 初始化数以及 Web 配置是否恰当 假如采用基于 XML 的配置形式,则应在 spring-servlet.xml 文件里加入 `<mvc:annotation-driven />` 元素及其关联 schema 定义语句,从而激活内置的消息转换器机制以适应多种媒体类型的输入/输操作[^3]: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 开启注解驱动 --> <mvc:annotation-driven /> </beans> ``` 此外还需保证 servlet 容器加载过程中能够识别这些扩展功能模块的存在。 --- ##### 方法四:测试简化场景下的交互逻辑 作为调试手段可以先尝试移除复杂的业务处理流程,仅保留最基本的响应结构以便快速定位潜在瓶颈所在位置。例如下面展示了一个最简单的例子供考: Controller 实现片段: ```java @RestController @RequestMapping("/api") public class TestController { @PostMapping(value = "/echo", consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<String> echoJson(@RequestBody Map<String, Object> body){ return new ResponseEntity<>("Received payload:" + body.toString(), HttpStatus.OK); } } ``` 客户端脚本部分保持不变即可观察预期效果如何呈现来。 --- ### 总结 综上所述,要彻底消除此类异常现象的发生概率可以从以下几个方面入手加以改进优化——即合理规划前后两端通信协议细节;补充完善相关技术栈组件安装部署工作;最后再辅之以充分详尽的日志记录便于后续排查维护活动开展顺利进行下去。 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值