SpringMVC系列之技术点定向爆破二

SpringMVC的运行流程

图片

  • 客户端发送请求

  • tomcat接收对应的请求

  • SpringMVC的核心调度器DispatcherServlet接收到所有请求

  • 请求地址与@RequestMapping注解进行匹配,定位到具体的类和具体的处理方法(封装在Handler中)

  • 核心调度器找到Handler后交给HandlerAdapter执行具体的Handler

  • 执行后Controller将具体的执行结果(ModelAndView)返回给HandlerAdapter

  • 核心调度器把ModelAndView交给视图解析器,视图解析器找到具体的jsp封装到View对象中

  • View视图把jsp转换成html内容再交给核心调度器

  • 核心调度器把html内容返回给客户端。

RequestMapping注解

在Controller中通过RequestMapping注解来定义匹配请求的URL。

  • RequestMapping注解可以定义在类的上方,作为类的中多个方法的统一URL前缀。

  • RequestMapping注解定义在方法的上方,作为此次请求具体要执行的方法的限定。

/**
@Author: 索尔
*/
@Controller //声明这是一个控制器
@RequestMapping("/hello") //访问路径,等价于url-pattern
public class HelloController {@RequestMapping("/test1") //访问路径public String hello1(){System.out.println("hello world");//具体的业务逻辑return "redirect:/index.jsp"; //跳转:/index.jsp}
}

RequestParam注解

RequestParam注解往往和RequestMapping注解配合使用,用来绑定请求参数和处理方法的参数。

我们来看下RequestParam注解的源码:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default true;String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
  • @RequestParam(required = false/true,value = “参数名”,defaultValue = “”) 其中name和value等效这里用value,推荐使用value。

  • value:用于重命名参数,若使用了value,则前端请求时该参数必须与value相同

  • required:用来制定该参数是否必须传入

    • true:默认值,前端请求时默认必须传入

    • false:前端请求时可以不传,不传时后端收到的是null

  • defaultValue:如果设置了defaultValue,则required不会使用默认值true,而自动为false。当没有穿参数时,就使用默认值。

接收复杂类型的参数

  • 设计User类,包含了多种复杂类型。

/**
@Author: 索尔
*/
public class User {private int id;private String name;private String[] hobbies;private Address address;private List<String> schools;private List<User> family;private Map<String,String> scores;...
}
  • 设计Controller的处理方法,接收复杂类型的参数并打印

 /*** 接收复杂类型的参数* @return*/@RequestMapping("/test3")public String test3(User user){System.out.println(user);return "redirect:/index.jsp";}

使用SpringMVC直接接收来自jsp发起的Get或着Post请求。

  • 设计存放表单的jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><form action="${pageContext.request.contextPath}/demo/test3" method="post">id:<input type="text" name="id"> <br/>姓名:<input type="text" name="name"><br/>爱好:<input type="checkbox" name="hobbies" value="阅读">阅读</input><input type="checkbox" name="hobbies" value="看片">看片</input><input type="checkbox" name="hobbies" value="音乐">音乐</input><br/>所在城市:<input type="text" name="address.city">所在街道:<input type="text" name="address.street"><br/>毕业院校:<input type="text" name="schools[0]"><input type="text" name="schools[1]"><br/>家庭成员:父亲:<input type="text" name="family[0].name">母亲:<input type="text" name="family[1].name"><br/>成绩:计算机:<input type="text" name="scores['计算机']">大学英语:<input type="text" name="scores['大学英语']"><br/><input type="submit" value="注册"/></form>
</body>
</html>

注意List、Map、实体类中的实体类的参数命名方式。当填入表单数据后,程序可以收到指定类型的参数。

  • 页面设定的参数内容:

图片

  • 后端接收到的结果:

User{id=1010, name='小王', address=Address{city='杭州', street='上城'}, hobbies=[读书, 看片], schools=[北京大学, 清华大学], family=[User{id=0, name='张三', address=null, hobbies=null, schools=null, family=null, scores=null}, User{id=0, name='李四', address=null, hobbies=null, schools=null, family=null, scores=null}], scores={大学英语=100, 计算机=90}}

解决Post请求参数中文乱码问题

如果参数中包含中文,则会出现乱码问题。使用过滤器解决Post请求参数中文乱码问题。

web.xml文件中配置过滤器:

<!--编码过滤器,解决乱码问题--><filter><filter-name>characterFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!--设置编码格式为utf8--><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><!--对request请求进行编码--><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><!--对response响应进行编码--><init-param><param-name>foreResponseEncoding</param-name><param-value>true</param-value></init-param></filter><!--配置要过滤的servlet--><filter-mapping><filter-name>characterFilter</filter-name><servlet-name>mvc</servlet-name></filter-mapping>

获得请求头数据

在JavaWeb中,需要繁琐的操作才能获得请求头数据。SpringMVC提供了快速获得请求头数据的方法。

@RequestMapping("/getHeader")public String getHeader(@RequestHeader("User-agent") String userAgent){System.out.println(userAgent);return "redirect:/index.jsp";}

获取Cookie数据

同样的,JavaWeb获得Cookie的方式也非常繁琐。SpringMVC提供了@CookieValue来快速获得Cookie中的数据。

 @RequestMapping("/getCookie")public String getCookie(@CookieValue("JSESSIONID") String jsessionid){System.out.println(jsessionid);return "redirect:/index.jsp";}

访问静态资源

在springmvc中,所有的请求都会被SpringMVC的核心处理器DispatcherServlet来处理,对于静态资源的请求也不例外。因此,需要告知SpringMVC,对于静态资源的请求不要去做处理,而是直接响应静态资源即可。通过springmvc的配置,完成静态资源的放行。

<!--配置访问静态资源--><mvc:annotation-driven/><!--将url中的路径映射到指定的资源文件夹--><mvc:resources mapping="/images/**" location="/images/" />

另一种处理静态资源的方法:DispatcherServlet处理不了,则交给DefaultServlet处理。

 <!--配置访问静态资源--><mvc:annotation-driven/><!--另一种处理静态资源的方法:DispatcherServlet处理不了,则交给DefaultServlet处理--><mvc:default-servlet-handler />

配置视图解析器

为了返回指定的视图,需要告知视图解析器如何获取指定视图。

<!-- 视图解析器作用:1.捕获后端控制器的返回值="index"2.解析:在返回值的前后 拼接 ==> "/index.jsp"--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀 --><property name="prefix" value="/"></property><!-- 后缀 --><property name="suffix" value=".jsp"></property></bean>

文件下载

文件上传和下载是处理复杂数据类型的另一种方式。首先我们来看下如何实现文件的下载。

文件下载的核心逻辑是通过封装响应消息,将下载内容发送给客户端。

@RequestMapping("/download")public ResponseEntity<byte[]> download(HttpServletRequest request) throws Exception {//设置下载文件信息ServletContext context = request.getServletContext();String realPath = context.getRealPath("/images/img.jpeg");//创建输入流FileInputStream fis = new FileInputStream(realPath);byte[] bytes = new byte[fis.available()];//读取文件内容,存入到字节数组中fis.read(bytes);fis.close();//封装下载内容到响应消息中HttpHeaders headers = new HttpHeaders();headers.set("Content-Disposition","attachment;filename=imp.jpeg");return new ResponseEntity<byte[]>(bytes,headers, HttpStatus.OK);}

文件上传

文件上传的核心逻辑是读到客户端传递来的字节数据,再通过Java程序存入到指定位置。

文件上传需要引入第三方组件Commons-fileupload的支持。

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>
  • 编写上传界面

<body><form enctype="multipart/form-data" action="${pageContext.request.contextPath}/upload" method="post">文件:<input type="file" name="uploadFile" /><br/><input type="submit" value="上传"></form>
</body>
  • 在spring中注册上传组件

<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"><property name="defaultEncoding" value="UTF-8"></property><property name="maxUploadSize" value="#{1024
*1024*
16}"></property></bean>
  • 编写后端上传接口

 @PostMapping("/upload")public String upload(MultipartFile uploadFile) throws IOException {System.out.println(uploadFile.getOriginalFilename());String path = "/Users/zeleishi/Documents/code/springmvc-demo1/out/upload/"+uploadFile.getOriginalFilename();File file = new File(path);uploadFile.transferTo(file);return "success";}

总结

这一篇文章我们攻克了SpringMVC部分关键技术,建议小伙伴同时收藏SpringMVC系列三篇博文,攻克SpringMVC将变得轻而易举。

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

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

相关文章

成功案例分享:物业管理小程序如何助力打造智慧社区

随着科技的进步和互联网的普及&#xff0c;数字化转型已经渗透到各个行业&#xff0c;包括物业管理。借助小程序这一轻量级应用&#xff0c;物业管理可以实现线上线下服务的无缝对接&#xff0c;提升服务质量&#xff0c;优化用户体验。本文将详细介绍如何通过乔拓云网设计小程…

LeetCode刷题--- 目标和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

基于SSM的剧本杀预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的剧本杀预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

easyrecovery数据恢复软件15安装下载免注册版本下载

说起数据恢复软件&#xff0c;相信没有小伙伴不知道easyrecovery这个软件吧&#xff0c;该软件具有快捷、高效、便捷的特点&#xff0c;且提供的功能也非常全面&#xff0c;不仅可以恢复各样被删除的文件、视频、图片等&#xff0c;还可以支持SD卡数据恢复&#xff0c;TF卡等各…

系列一、MQ简介

一、MQ简介 1.1、概述 MQ&#xff08;Message Queue&#xff09;&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件&#xff0c;是一套提供了消息&#xff08;消息即数据&#xff0c;一般消息的体量不会很大&#xff09;生产、存储、消费全过程的API软…

第11章 GUI Page421~422 步骤六 支持文字

运行效果&#xff1a; 关键代码&#xff1a; 新增头文件&#xff1a; //item_text.hpp #ifndef ITEM_TEXT_HPP_INCLUDED #define ITEM_TEXT_HPP_INCLUDED #include "item_i.hpp"class TextItem : public IItem { public:TextItem(): _startPosition(0, 0), _endPos…

【华为鸿蒙系统学习】- 如何利用鸿蒙系统进行App项目开发|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工…

关于“Python”的核心知识点整理大全36

目录 13.4.4 向下移动外星人群并改变移动方向 game_functions.py alien_invasion.py 13.5 射杀外星人 13.5.1 检测子弹与外星人的碰撞 game_functions.py alien_invasion.py 13.5.2 为测试创建大子弹 13.5.3 生成新的外星人群 game_functions.py alien_invasion.py …

Zookeeper-应用实战

Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 ZooKeeper官方的Java客户端API。 第三方的Java客户端API&#xff0c;比如Curator。 ZooKeeper官方的客户端API提供了基本的操作:创建会话、创建节点、读取节点、更新数据、…

7ADC模数转换器

一.模数转换原理 ADC模拟-数字转换器可以将引脚上连续变化的模拟电压转换成内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。另外一种是DAC既是与前面相反&#xff0c;如PWM波&#xff0c;由于PWM电路简单且没有额外的功率损耗&#xff0c;更适用于惯性系统的…

损失函数,代价函数,梯度,优化器,学习率,学习率调度器

这些是机器学习中的概念。把这些概念迁移到CV领域要进行一定的抽象。 首先损失&#xff0c;损失是一组参数拟合出来的样本的预测值和样本的真实值之间的差异&#xff0c;损失是用来度量这种差异的&#xff0c;根据不同的拟合权重参数全局有一个对应的损失值&#xff0c;损失后…

随机问卷调查数据的处理(uniapp)

需求&#xff1a;问卷调查 1.返回的数据中包含单选、多选、多项文本框、单文本框、图片上传 2.需要对必填的选项进行校验 3.非必填的多项文本框内容 如果不填写 不提交 表单数据格式 res{"code": 0,"msg": null,"data": [{"executeDay&…

两个图片完美融合 泊松编辑

一、效果惊人 二、步骤 下载安装 https://github.com/Trinkle23897/Fast-Poisson-Image-Editing.git 执行 test 目录下的 python data.py下载数据 执行测试&#xff0c;可以看到效果了 $ fpie -s test1_src.jpg -m test1_mask.jpg -t test1_tgt.jpg -o result1.jpg -h1 -…

JNI学习(二)

静态注册 接着上篇博客学习 JNI函数 JNIEXPORT void JNICALL Java_com_example_jnidemo_TextDemo_setText(JNIEnv *env, jobject this, jstring string){ __android_log_print(ANDROID_LOG_ERROR, "test", "invoke set from C\n");char* str (char*)(*e…

【Unity】入门

文章目录 概述常用组件各类文件基础知识创建工程工程目录介绍五个窗口面板创建代码和场景 脚本与编程鼠标的输入键盘的输入代码来操作组件获取物体API资源的使用API定时调用与线程向量的基本运算预制体与实例 物理系统与组件案例实操作快捷键来源 Unity已广泛运用到各个领域&am…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

结构型模式 | 适配器模式

一、适配器模式 1、原理 适配器模式&#xff08;Adapter&#xff09;&#xff0c;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类&#xff1a;类适配器模式、对象适配器模式、接口…

【ARM Cortex-M 系列 5 -- RT-Thread renesas/ra4m2-eco 移植编译篇】

文章目录 RT-Thread 移植编译篇编译os.environ 使用示例os.putenv使用示例python from 后指定路径 编译问题_POSIX_C_SOURCE 介绍编译结果 RT-Thread 移植编译篇 本文以瑞萨的ra4m2-eco 为例介绍如何下载rt-thread 及编译的设置。 RT-Thread 代码下载&#xff1a; git clone …

T2I-Adapter: 让马良之神笔(扩散模型)从文本生成图像更加可控

文章信息 单位&#xff1a;北大深张健团队&#xff0c;腾讯ARC lab 源码: https://github.com/TencentARC/T2I-Adapter 图1. 插个DXL的渲染图&#xff0c;这么真实的光感&#xff0c;感觉PS都可以被取代了 目录 文章信息前言一、介绍二、相关工作1.图像合成与转换2 扩散模型3 适…

Deployment Controller详解(下)

上一篇在《Deployment Controller详解&#xff08;上&#xff09;》中介绍了Deployment Controller 的创建、更新和回滚。了解了这三个功能&#xff0c;基本上也就懂得了大厂PaaS平台中服务的灰度升级、失败回滚等操作是如何实现的了。 接下来本文会介绍Deployment Controller…