SpringMVC获取请求参数2以和注意事项开放请求权限、解决乱码、参数绑定注解、Restful风格参数、自定义类型转换器、获取servle、获取请求头
SpringMVC获取请求参数的注意事项
1、请求本地的jquery
文件失败
原因:问题在前端控制器的配置,打开web.xml
文件,里面有配置如下的代码
<!--配置springmvc前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--服务器启动时就去加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置springmvc映射文件-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/ </url-pattern>
</servlet-mapping>
/
缺省的Servlet
解决方式一【少用】:
在spring-mvc.xml
配置文件中设置如下代码:即可正常请求文件
<mvc:resources mapping="/js/**" location="/js/"/>
代表在springMVC框架当中,要开放对那些文件的访问权限
前面的
mapping
代表的是地址,后面的location
代表的具体访问路径
劣势:多个静态资源的文件需要西多个语句来指定开放权限
解决方式二【常用】:
在spring-mvc.xml
配置文件中设置如下代码:
<!---->
<mvc:default-servlet-handler/>
原来:在springMVC寻找匹配资源地址,如果找不到就交给原有的容器:
TomCat
内部的机制来寻找
优势:一条语句解决所有静态资源的访问权限
2、请求数据乱码问题
get请求在tomcat8.5的服务器中就自动给我们转换了
post发起中文数据请求会出现乱码现象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRKld4z5-1651133492080)(image/image-20220428132943028.png)]
输出如下内:
VO{userList=[User{username=‘zhangan’, age=1234}, User{username=‘lishi’, age=5214}]}
VO{userList=[User{username=‘???’, age=1234}, User{username=‘???’, age=5214}]}
解决方法:
在web.xml
配置文件中设置全局的过滤器来进行编码的过滤
<!--配置全局过滤的filter-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
重启服务器重新提交中文数据输出:VO{userList=[User{username=‘张三’, age=5545}, User{username=‘里斯’, age=4846}]}
3、参数绑定注解@requestParam【常用】
在前端页面时请求的参数与后端控制器的
username
不对应时,输出为null
注解@RequestParam
还有如下参数河以使用:
- value:与请求参数名称
- required:此在指定的求参数是否必须包括,默认是true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
@Controller
@RequestMapping("/user")
public class UserController {
// ------ 以下是:获取基本数据类型请求数据 ------
/**
* 将请求的参数名称使用@RequestParam映射到username中
* @param username
*/
@RequestMapping("/quick16")
@ResponseBody
public void save16(@RequestParam(value = "name",required = false,defaultValue = "chushiaz1") String username){
System.out.println(username);
}
}
4、获得Restful风格的参数
Restfu是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件柯以更简洁,更有层次,更易于实现缓存机制等。
Restfull风格的请求是使用“"ul 请求方式”表示一次请求目的的,HTTP协议里面四个表示操作方式的动词如下:
GET:用于获取资源
POST:用于新建资源
PUT:用于更新资源
DELETE:用于删除资源示例:
- /user/1 GET:得到id=1的user
- /user/1 DELETE:删除id=1的user
- /user/1 PUT:更新id=1的user
- /user/1 POST:新增id=1的user
使用占位符来完成参数的接收
上述url地址/user/1中的1就是要获得的请求参数,在Spring MVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/id,占位符id对应的就是1的值。在业务方法中我们可以使用@PathVariable注解
进行占位符的匹配获取工作。
工作流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFtFUjzw-1651133492082)(image/image-20220428140536345.png)]
@Controller
@RequestMapping("/user")
public class UserController {
// ------ 以下是:获取基本数据类型请求数据 ------
/**
* 通过占位符来接收Restful风格的参数
* @param name
*/
@RequestMapping("/quick17/{name}")
@ResponseBody
public void save17(@PathVariable(value = "name",required = true) String name){
System.out.println(name);
}
}
启动项目访问:http://localhost:8080/Spring_MVC_war_exploded/user/quick17/zhansan,后面的zhansan就是携带提交的数据,也就是通过占位符
{name}
来接收输出:zhangsan
注意:业务操作时需要符合上面写的
Restfull请求风格
5、自定义类型转换器
SpringMVC默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
自定义类型转换器的开发步骤“:
- 定义转换器类实现
Converter
接口 - 在配置文件中声明转换器
- 在中引用转换器
转换器的定义
在com.zcl.converter
包下创建DateConverter
类
package com.zcl.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String,Date> {
@Override
public Date convert(String dateStr) {
// 将日期字符串转换成正在的日期对象,进行返回即可
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
在spring-mvc.xml
配置文件中声明转换器
<!--声明类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.zcl.converter.DateConverter"/>
</list>
</property>
</bean>
修改spring-mvc.xml
中已有的mvc驱动
<!--mvc注解驱动,替换上面的json转换器-->
<!--需要在顶部写入对应的引用空间和约束-->
<mvc:annotation-driven conversion-service="conversionService"/>
启动服务器访问
@Controller
@RequestMapping("/user")
public class UserController {
// 自定义类型转换器
/**
* 输出2022-4-28格式会出现报错,所以声明一个类型转换器来完成转换
* @param date
*/
@RequestMapping("/quick18")
@ResponseBody
public void save18(Date date){
System.out.println(date);
}
}
在请求访问资源的时候
date格式为:2022/4/28可以正常访问输出,设置自定义格式转换器之后这个格式就会报错
date格式为:2022-4-28访问就会报错,设置和配置上面的类型转换器的时候就不再会报错了
6、获得Servlet相关的API
SpringMVC支持使用原始的ServletAPI对象作为控制器方法的参数进行注入,常见的对象如下:
- HttpServletRequest
- HttpServletResponse
- HttpSession
@Controller
@RequestMapping("/user")
public class UserController {
// 获取Servlet相关的API
/**
* 获取相关的api
* @param request
* @param response
* @param session
*/
@RequestMapping("/quick19")
@ResponseBody
public void save19(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
}
}
启动访问服务器,会输出对应的地址,由SpringMVC调用并注入
org.apache.catalina.connector.RequestFacade@1c2d34ce
org.apache.catalina.connector.ResponseFacade@41babf20
org.apache.catalina.session.StandardSessionFacade@6f45bff2
7、获取请求头
1、@RequestHeader
使用@RequestHeaderi可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
@RequestHeaderi注解的属性如下:
1、value:请求头的名称
2、required:是否必须携带此请求头
常见的请求头
浏览器请求之前,按F12查看网络可以查看
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: max-age=0
Connection: keep-alive
Cookie: Idea-f0dba785=183746f0-1e2e-4b2e-af15-60ca300ae488
DNT: 1
Host: localhost:8080
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Microsoft Edge";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.50
示例代码
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 根据@RequestHeader获取请求头
* @param user_agent
*/
@RequestMapping("quick20")
@ResponseBody
public void save20(@RequestHeader(value = "User-Agent") String user_agent){
System.out.println(user_agent);
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.50
}
}
2、通过@CookieValue获取cookie的值
使用@CookieValue可以获得指定Cookie的值
@CookieValue注解的属性如下:
1、value:指定cookie的名称
2、required:是否必须携带此cookiecookie的头也同样是在请求头里面查看的
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 根据cookie的头获取cookie的值
* @param jsessionId
*/
@RequestMapping("quick21")
@ResponseBody
public void save21(@CookieValue(value = "Idea-f0dba785",required = false) String jsessionId){
System.out.println(jsessionId);
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgejhgf
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01