• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringMVC获取请求参数2以和注意事项开放请求权限、解决乱码、参数绑定注解、Restful风格参数、自定义类型转换器、获取servle、获取请求头

武飞扬头像
小钟要学习!!!
帮助1

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:用于删除资源

示例:

  1. /user/1 GET:得到id=1的user
  2. /user/1 DELETE:删除id=1的user
  3. /user/1 PUT:更新id=1的user
  4. /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型进行参数设置。

但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。

自定义类型转换器的开发步骤“:
  1. 定义转换器类实现Converter接口
  2. 在配置文件中声明转换器
  3. 在中引用转换器
转换器的定义

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对象作为控制器方法的参数进行注入,常见的对象如下:

  1. HttpServletRequest
  2. HttpServletResponse
  3. 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:是否必须携带此cookie

cookie的头也同样是在请求头里面查看的

@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
系列文章
更多 icon
同类精品
更多 icon
继续加载