SpringMVC(三)获取请求参数

1.1通过ServletAPI获取

SpringMVC封装的就是原生的servlet

我们进行测试如下所示:

package com.rgf.controller.service;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数*/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public  String  getParamByServlet(HttpServletRequest request){String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return  "success";}
}

我们的登陆页面如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post"><input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性(第一种)</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性(第二种)</a><br>
<a th:href="@{/aaa/test/ant(username='admin')}">测试@RequestMapping注解支持ant风格的路径</a><br>
<br>
<form th:action="@{/param/servletAPI}" method="post">用户名: <input type="text" name="username"><br>密码:   <input type="password" name="password"><br>提交: <input type="submit" value="登录"><br>
</form>
<a th:href="@{/param/servletAPI}"></a>
</body>
</html>

 点击登录之后,即会跳转到成功界面。

同时我们的控制台会进行输出:username:admin,password:123456

1.2通过控制器方法的形参获取请求参数和@RequestParam的使用

我们的页面如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post"><input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性(第一种)</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性(第二种)</a><br>
<a th:href="@{/aaa/test/ant(username='admin')}">测试@RequestMapping注解支持ant风格的路径</a><br>
<br>
<form th:action="@{/param}" method="post">用户名: <input type="text" name="username"><br>密码:   <input type="password" name="password"><br>提交: <input type="submit" value="登录"><br>
</form>
<a th:href="@{/param/servletAPI}"></a>
</body>
</html>
package com.rgf.controller.service;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。* */
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public  String  getParamByServlet(HttpServletRequest request){String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return  "success";}@RequestMapping("/param")public  String getParam(String username,String password){return  "success";}
}

我们进行如下界面:

我们点击登陆之后,会跳转到成功界面, 此时控制台会进行输出:

username:root,password:123456

当请求参数的名字和控制器方法的形参名字不一致的时候,如果继续获取的话,控制台会输出为null.面对这种情况,我们需要进行手动添加。

我们需要利用@RequestParam标签:其下有三个属性

我们将界面修改如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post"><input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性(第一种)</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性(第二种)</a><br>
<a th:href="@{/aaa/test/ant(username='admin')}">测试@RequestMapping注解支持ant风格的路径</a><br>
<br>
<form th:action="@{/param}" method="post">用户名: <input type="text" name="name"><br>密码:   <input type="password" name="password"><br>提交: <input type="submit" value="登录"><br>
</form>
<a th:href="@{/param/servletAPI}"></a>
</body>
</html>

 此时找不到,我们将匹配的方法修改如下所示:

package com.rgf.controller.service;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。**/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public  String  getParamByServlet(HttpServletRequest request){String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return  "success";}@RequestMapping("/param")public  String getParam(@RequestParam("userName")String username, String password){return  "success";}
}

此时即可匹配上。

我们查看required这个属性:

package com.rgf.controller.service;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。**/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public  String  getParamByServlet(HttpServletRequest request){String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return  "success";}/*** required默认为true,即value所对应的参数必须传输* @param username* @param password* @return*/@RequestMapping("/param")public  String getParam(@RequestParam(value = "userName",required = true)String username, String password){return  "success";}
}

当我们不传username,如下所示:

则会报错400.

如果required属性为false的话,则不会报错。

而对于最后一个属性:defaultValue,如果required默认值为true,但是没有传入进来,则会使用此时设置的defaultValue=hello的值。

我们继续采用拼接的网址:

我们发现此时不会报错,查看控制台输出的信息为如下:

username:Hello,password:123

此时无论required的值为true或者false都不影响跳转到成功界面,如果传了,则值为传输过来的值,如果未传,则值为默认值。

总结如下所示:

package com.rgf.controller.service;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。* 3.@RequestParam:将请求参数和控制器的方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数,* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 -Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若未传输。则形参值为null* defaultVaule:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关**/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public  String  getParamByServlet(HttpServletRequest request){String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+",password:"+password);return  "success";}/*** required默认为true,即value所对应的参数必须传输* @param username* @param password* @return*/@RequestMapping("/param")public  String getParam(@RequestParam(value = "userName",required = true,defaultValue = "Hello")String username, String password){return  "success";}
}

 1.3@RequestHeader和@CookieValue

我们查看该页面的referer如下所示:

我们利用如下所示:

package com.rgf.controller.service;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。* 3.@RequestParam:将请求参数和控制器的方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数,* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 -Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若未传输。则形参值为null* defaultVaule:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关*4.@RequestHeader:将请求头信息和控制器方法的形参绑定*5.@CookieValue:将cookie数据和控制器方法的形参绑定*/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServlet(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:" + username + ",password:" + password);return "success";}/*** required默认为true,即value所对应的参数必须传输** @param username* @param password* @return*/@RequestMapping("/param")public String getParam(@RequestParam(value = "userName", required = true, defaultValue = "Hello")String username, String password,@RequestHeader(value = "referer",required = true,defaultValue = "www.baidu.com")String referer) {System.out.println("referer:" + referer);System.out.println("username:" + username + ",password:" + password);return "success";}
}

我们进行测试如下所示:

我们在网页输入为username:root,password:123。

我们进行提交请求的时候会携带请求头信息。

发现控制台输出为:

referer:http://localhost:63342/

username:root,password:123

如果其上没有进行提交,则输出referer:www.baidu.com

 我们发现@RequestHeader的属性如下所示,与@RequestMapping的一致。

我们进行查看cookievalue.

如果我们使用原生的servlet,则会获取cookie的时候,使用request.getcookies,先获取所有的cookie对象,返回值是一个数组,我们需要进行 之后再通过getname获取键,再通过getValue获取值。如果要获取一个指定的cookie的值,再判断name是否相等。

如何创建一个cookie.

第一次获取session的时候,使用request.getsession来获取的。这个时候我们会检测我们当前的请求报文是否携带了一个jsessionid的cookie,如果没有的话,则在服务器中会创造一个jsessionID的cookie,并且会创造一个httpsession对象。然后把我们当前的session对象,把他们存储在服务器所维护的map集合里面。map集合用jsessionID作为键。jsessionID的cookie的值就是一个随机序列,把他作为键,sessionID作为值。再把cookie响应到浏览器。之后每一次发送请求向服务器的话,每次都会携带jsessionid的cookie。有了cookie之后,就可以获取cookie的值,也就是一个随机序列。在服务器所维护的map集合中,然后以随机序列作为键,来获取map的值。

 我们通过如下方法进行测试:

package com.rgf.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;/*** 1.@RequestMapping注解的位置* @RequestMapping标识一个类:设置映射请求的请求路径的初始信息* @RequestMapping标识一个方法:设置映射请求请求路径的具体信息* 2.@RequestMapping注解的value属性* 作用:通过请求的请求路径匹配请求* value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值* 则当前请求就会被注解所标识的方法进行处理* 3.@RequestMapping注解的method属性* 作用:通过请求的请求方式匹配请求* method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式*则当前请求就会被注解所标识的方法进行处理* 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported* 在@RequestMapping的基础上,结合请求方式的派生注解:* @GetMapping,@PostMapping,@DeleteMapping,@PutMapping* 派生注解没有method属性,仍然有value属性。* 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,* 意为当前请求的参数与真实的参数不匹配)* 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置* params可以使用四种表达式:* "param":表示当前所匹配请求的请求参数中必须携带param参数* "!param":表示当前所匹配请求的请求参数中一定不能携带param参数* "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value* "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value* 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:* 400-Parameter  conditions "username" not met for actual request parameters;* 5.@RequestMapping注解的headers属性* 作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息满足headers属性的设置* 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,此时页面报错:404-;* 6.SpringMVC支持ant风格的路径* 在@RequestMapping注解的value属性值中设置一些特殊字符* ?:表示任意的单个字符(不包括?)* *:任意个数的任意字符(不包括?和/)* **:任意层数的任意目录,注意使用方式只能将**写在双斜线中,前后不能有任何的其他字符*/
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {//此时控制器方法所匹配的请求的请求路径为/test/hello@RequestMapping(value = {"/hello","/abc"},method ={RequestMethod.POST,RequestMethod.GET},params = {"username","!password","age=20","gender!=男"},headers={"referer"})public  String hello(){return  "index";}@RequestMapping("/a?a/test/ant")public  String testAnt(){return  "success";}@RequestMapping( "/a*a/test/ant")public  String testAnttwo(){return  "success";}@RequestMapping( "/**/test/ant")public  String testAntthree(){return  "success";}@RequestMapping("/param/servletAPI")public  String getParamByServletAPI(HttpServletRequest request){HttpSession session = request.getSession();String username = request.getParameter("username");String password=request.getParameter("password");System.out.println("username:"+username+",password:"+password);return "success";}}

我们利用该注解如下所示:

package com.rgf.controller.service;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。* 3.@RequestParam:将请求参数和控制器的方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数,* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 -Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若未传输。则形参值为null* defaultVaule:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关*4.@RequestHeader:将请求头信息和控制器方法的形参绑定*5.@CookieValue:将cookie数据和控制器方法的形参绑定*/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServlet(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:" + username + ",password:" + password);return "success";}/*** required默认为true,即value所对应的参数必须传输** @param username* @param password* @return*/@RequestMapping("/param")public String getParam(@RequestParam(value = "userName", required = true, defaultValue = "Hello")String username, String password,@RequestHeader(value = "referer",required = true,defaultValue = "www.baidu.com")String referer,@CookieValue(value = "JSESSIONID",required = true,defaultValue = "")String jsessionId) {System.out.println("referer:" + referer);System.out.println("jsessionId:" + jsessionId);System.out.println("username:" + username + ",password:" + password);return "success";}
}

我们需要先访问创建session的方法。我们访问:localhost:8080/SpringMVC/param/servletAPI.

访问成功之后,会出现setCookie.JSESSIONID=XXXXXXXX;Path=/SpringMVC;HttpOnly

访问成功之后,我们再访问界面将名字和密码输入,之后查看控制台所输出的:

 referer:http://localhost:63342/

JSESSIONID:XXXxxxxx

username:root,password:123456

从此就会携带JSESSIONID的cookie.

1.4通过pojo获取请求参数

在控制器方法的形参位置设置一个实体类类型的形参,只要保证实体类中的属性和我们的请求参数的名字一样,我们就可以直接把我们当前的请求参数的值封装到实体类类型的形参中。

我们创建pojo包下面的User类:

如下所示:

package com.rgf.pojo;public class User {private Integer id;private  String  username;private  String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User(Integer id, String username, String password) {this.id = id;this.username = username;this.password = password;}public User() {}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

我们创建我们的画面路径:(index.html)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/param/pojo}" method="post">用户名: <input type="text" name="username"><br>密码:   <input type="password" name="password"><br>提交: <input type="submit" value="登录"><br>
</form>
<a th:href="@{/param/servletAPI}"></a>
</body>
</html>

我们在控制器方法里面进行如下所示:

package com.rgf.controller.service;import com.rgf.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。* 3.@RequestParam:将请求参数和控制器的方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数,* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 -Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若未传输。则形参值为null* defaultVaule:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关*4.@RequestHeader:将请求头信息和控制器方法的形参绑定*5.@CookieValue:将cookie数据和控制器方法的形参绑定*/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServlet(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:" + username + ",password:" + password);return "success";}/*** required默认为true,即value所对应的参数必须传输** @param username* @param password* @return*/@RequestMapping("/param")public String getParam(@RequestParam(value = "userName", required = true, defaultValue = "Hello")String username, String password,@RequestHeader(value = "referer",required = true,defaultValue = "www.baidu.com")String referer,@CookieValue(value = "JSESSIONID",required = true,defaultValue = "")String jsessionId) {System.out.println("referer:" + referer);System.out.println("jsessionId:" + jsessionId);System.out.println("username:" + username + ",password:" + password);return "success";}@RequestMapping("/param/pojo")public String getParamByPojo(User user){System.out.println(user);return "success";}}

我们此时在如下框输入:

我们点击登录之后会在控制台发现输出如下所示:

User{id=null,username='admin',password='123456'} 

获取请求参数总结如下所示:

package com.rgf.controller.service;import com.rgf.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。* 3.@RequestParam:将请求参数和控制器的方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数,* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 -Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若未传输。则形参值为null* defaultVaule:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关*4.@RequestHeader:将请求头信息和控制器方法的形参绑定*5.@CookieValue:将cookie数据和控制器方法的形参绑定*6.通过控制器方法的实体类类型的形参获取请求参数,需要在控制器方法的形参位置设置实体类类型的形参,*要保证实体类中的属性的属性名和咱们的请求参数的名字一致,可以通过实体类类型的形参获取请求参数*/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServlet(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:" + username + ",password:" + password);return "success";}/*** required默认为true,即value所对应的参数必须传输** @param username* @param password* @return*/@RequestMapping("/param")public String getParam(@RequestParam(value = "userName", required = true, defaultValue = "Hello")String username, String password,@RequestHeader(value = "referer",required = true,defaultValue = "www.baidu.com")String referer,@CookieValue(value = "JSESSIONID",required = true,defaultValue = "")String jsessionId) {System.out.println("referer:" + referer);System.out.println("jsessionId:" + jsessionId);System.out.println("username:" + username + ",password:" + password);return "success";}@RequestMapping("/param/pojo")public String getParamByPojo(User user){System.out.println(user);return "success";}}

1.5解决获取请求参数的乱码问题

 解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册。

不可以使用request.servletAPI的这种方法,因为当前设置编码的代码有一种要求,在设置编码之前一定不能够获取任意的请求参数。只要获取,设置的编码就没有任何功能。

我们输入如下所示:

我们进行登录之后发现在控制台输出如下所示:

User{id=null,username='???',password='123456'} ,当前的请求方式为post.

我们将其修改为get:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/param/pojo}" method="get">用户名: <input type="text" name="username"><br>密码:   <input type="password" name="password"><br>提交: <input type="submit" value="登录"><br>
</form>
<a th:href="@{/param/servletAPI}"></a>
</body>
</html>

此时点击登录之后我们查看控制台输出的:

User{id=null,username='张三',password='123456'},此时不再为乱码。

tomcat1.7,get的请求方式出现乱码的解决方法:

我们打开tomcat里面的conf文件夹下面的server.xml,找到设置端口号的地方如下:

  <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

在tomcat7.0里面get和post都会有乱码,但是配置如下之后:

URIEncoding="UTF-8"。(get出现乱码的解决方法)

如果删掉之后,get也会出现乱码。

tomcat8.5里面,get方法是不会出现乱码的。

post方法出现乱码的解决办法:

我们在web.xml文件里面进行配置如下所示:

<!--配置Spring的编码过滤器  CharacterEncodingFilter  编码过滤器 --><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><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

我们来进行查看源码如下所示:

当前类的结构如下所示:

 我们从中发现没有doFilter方法,在当前继承的过程中,我们对当前的doFilter方法进行了重写,重写之后调用了另外一个方法来实现了过滤。即为:doFilterInternal 。

我们从filter进行查看:

里面有doFilter方法,往上我们来看:

此时发现里面有doFilter.

我们发现此时已经进行了重写:

 我们进行查看该方法:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String encoding = getEncoding();if (encoding != null) {if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {request.setCharacterEncoding(encoding);}if (isForceResponseEncoding()) {response.setCharacterEncoding(encoding);}}filterChain.doFilter(request, response);}

里面获取的encoding为:

 这就是为什么我们在配置过滤器的时候设置的初始化参数为encoding。

同时我们进行查看forceEncoding。

public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) {Assert.hasLength(encoding, "Encoding must not be empty");this.encoding = encoding;this.forceRequestEncoding = forceRequestEncoding;this.forceResponseEncoding = forceResponseEncoding;}

 根据doFilterInternal方法,我们可以发现如果我们进行设置了encoding和forceEncoding,则会设置为我们所设置的编码方式。如果不进行设置的话,则会直接放行,仍然为默认的编码方式。同时,(如果只设置encoding初始化参数的时候,只会去设置请求的编码,不会去设置响应的编码)。如果全部要进行设置的话,则要将encoding和forceEncoding全部在配置文件里面进行设置。此种方式即可解决配置乱码。

本章总结如下:

package com.rgf.controller.service;import com.rgf.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;/*** 1.获取请求参数的方式:* 1.通过servletAPI获取* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数* 2.通过控制器方法的形参获取* 只需要在控制器方法的形参位置,设置一个形参,形参的名字要和请求参数的名字一致即可。* 3.@RequestParam:将请求参数和控制器的方法的形参绑定* @RequestParam注解的三个属性:value、required、defaultValue* value:设置和形参绑定的请求参数的名字* required:设置是否必须传输value所对应的请求参数,* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:* 400 -Required String parameter 'xxx' is not present* 若设置为false,则表示value所对应的请求参数不是必须传输,若未传输。则形参值为null* defaultVaule:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关*4.@RequestHeader:将请求头信息和控制器方法的形参绑定*5.@CookieValue:将cookie数据和控制器方法的形参绑定*6.通过控制器方法的实体类类型的形参获取请求参数,需要在控制器方法的形参位置设置实体类类型的形参,*要保证实体类中的属性的属性名和咱们的请求参数的名字一致,可以通过实体类类型的形参获取请求参数* 7.解决获取请求此参数的乱码问题* 在web.xml中配置Spring的编码过滤器CharacterEncodingFilter*/
@Controller
public class TestParamController {@RequestMapping("/param/servletAPI")public String getParamByServlet(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:" + username + ",password:" + password);return "success";}/*** required默认为true,即value所对应的参数必须传输** @param username* @param password* @return*/@RequestMapping("/param")public String getParam(@RequestParam(value = "userName", required = true, defaultValue = "Hello")String username, String password,@RequestHeader(value = "referer",required = true,defaultValue = "www.baidu.com")String referer,@CookieValue(value = "JSESSIONID",required = true,defaultValue = "")String jsessionId) {System.out.println("referer:" + referer);System.out.println("jsessionId:" + jsessionId);System.out.println("username:" + username + ",password:" + password);return "success";}@RequestMapping("/param/pojo")public String getParamByPojo(User user){System.out.println(user);return "success";}}

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

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

相关文章

纺织工厂数字孪生3D可视化管理平台,推动纺织产业数字化转型

近年来&#xff0c;我国加快数字化发展战略部署&#xff0c;全面推进制造业数字化转型&#xff0c;促进数字经济与实体经济深度融合。以数字孪生、物联网、云计算、人工智能为代表的数字技术发挥重要作用。聚焦数字孪生智能工厂可视化平台&#xff0c;推动纺织制造业数字化转型…

OpenCV17-图像形态学操作

OpenCV17-图像形态学操作 1.形态学操作1.1腐蚀1.2膨胀 2.形态学应用2.1开运算2.2闭运算2.3形态学梯度2.4顶帽运算2.5黑帽运算2.6击中击不中变换2.7形态学应用示例 1.形态学操作 1.1腐蚀 图像腐蚀&#xff08;Image erosion&#xff09;可用于减小图像中物体的大小、填充孔洞或…

css之Flex弹性布局(子项常见属性)

文章目录 &#x1f380;前言&#xff1a;本篇博客介绍弹性布局flex容器中子项的常见用法&#x1fa80;flex:子项目占得份数 &#xff08;划分不同子项的比例&#xff09;&#x1f387;align-self 控制单独一个子项在侧轴的排列方式&#x1f9f8;order属性定义子项的排列顺序 &a…

酷开科技 | 酷开系统,为居家生活打开更精彩的窗口

电视在我们的日常生活中扮演着重要的角色。虽然&#xff0c;作为客厅C位的扛把子——电视的娱乐作用深入人心&#xff0c;但是&#xff0c;它的涵义和影响力却因我们每个人的具体生活环境而存在着种种差异&#xff0c;而我们的生活环境又受到我们所处的社会及文化环境的影响。 …

一文了解AIGC与ChatGPT

一、AIGC简介 1.AIGC基础 (1)AIGC是什么 AIGC是人工智能图形计算的缩写&#xff0c;是一种基于图形处理器&#xff08;GPU&#xff09;的计算技术&#xff0c;可以加速各种计算任务&#xff0c;包括机器学习、深度学习、计算机视觉等。 AIGC是一种基于GPU的计算技术&#x…

Git(一)Windows下安装及使用Git Bash

目录 一、简介1.1 什么是Git&#xff1f;1.2 Git 的主要特点1.3 什么是 Git Bash&#xff1f; 二、下载三、安装3.1 同意协议3.2 选择安装位置3.3 其他配置&#xff08;【Next】 即可&#xff09;3.4 安装完毕3.5 打开 Git Bash 官网地址&#xff1a; https://www.git-scm.com/…

包管理工具

代码共享方案 放到npm仓库&#xff0c;下载到本地放到node_modules npm配置文件 必须填写的属性&#xff1a;name、version name是项目的名称&#xff1b; version是当前项目的版本号&#xff1b; description是描述信息&#xff0c;很多时候是作为项目的基本描述&#xff1b…

力扣每日一题61:旋转链表

题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输…

CSS必学:你需要知道的盒子模型的秘密

作者:WangMin 格言:努力做好自己喜欢的每一件事 CSDN原创文章 博客地址 &#x1f449; WangMin 作为前端开发来说&#xff0c;要掌握的CSS基础一定很多&#xff0c;那么CSS中盒子模型肯定是必考必问必掌握的前端知识点&#xff0c;因为它是CSS基础中非常重要的内容&#xff0c;…

异步编程详解(.NET)

在之前写的一篇关于async和await的前世今生的文章之后&#xff0c;大家似乎在async和await提高网站处理能力方面还有一些疑问&#xff0c;很多网站本身也做了不少的尝试。今天我们再来回答一下这个问题&#xff0c;同时我会做一个async和await在WinForm中的尝试&#xff0c;并且…

Java SOAP 调用 C# 的WebService

Java SOAP 调用 C# 的WebService&#xff0c;C# 的WebService方法的创建可以参考上一篇文章。IntelliJ IDEA Community Edition 2021.2.3的idea64.exe新建项目&#xff0c;导入需要的jar&#xff0c;代码如下&#xff1a; import org.apache.axis.client.Service; import org.…

循环神经网络(Recurrent Neural Network)

1. 为什么需要循环神经网络 RNN 上图是一幅全连接神经网络图&#xff0c;我们可以看到输入层-隐藏层-输出层&#xff0c;他们每一层之间是相互独立地&#xff0c;(框框里面代表同一层)&#xff0c;每一次输入生成一个节点&#xff0c;同一层中每个节点之间又相互独立的话&#…

PKU 概率论+数理统计+建模 期中考复习总结

目录 计算条件概率计算概率&#xff08;放回与不放回&#xff09;生成随机数算法Linear Congruential Method判断是否是full period Uniformity (test of frequency)1.Chi-Square testmethodreminderexample 2.Kolmogorov-Sminov testmethodexample Independence (test of auto…

互联网Java工程师面试题·Spring篇·第一弹

目录 1、一般问题 1.1、不同版本的 Spring Framework 有哪些主要功能&#xff1f; 1.2、什么是 Spring Framework&#xff1f; 1.3、列举 Spring Framework 的优点。 1.4、Spring Framework 有哪些不同的功能&#xff1f; 1.5、Spring Framework 中有多少个模块&#xff…

JSX 模板精简原则

学习目标&#xff1a; 使模板中的逻辑跟简洁 实现&#xff1a; 复杂的多分枝的逻辑收敛为一个函数&#xff0c;通过一个专门的函数来写分支逻辑&#xff0c;模板中只负责调用 实例&#xff1a; // 有一个状态type有1&#xff0c;2&#xff0c;3三种 // 1 展示 h1 // 2 展示 h2…

webpack proxy如何解决跨域?

一、是什么 webpack proxy&#xff0c;即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题&#xff08;浏览器安全策略限制&#xff09; 想要实现代理首先需要一个中间服务器&#xff0c;webpac…

C++左值引用与右值引用

0.类型和值类别的区别&#xff1f; 类型&#xff08;type&#xff09;和值类别&#xff08;value category&#xff09; 1.类型指的是数据类型&#xff0c;int&#xff0c;char这样的内置类型&#xff0c;类型主要是用来区别它们的字节大小。除了内置类型还有自定义类型&…

【ESP-BOX-LITE】:照片查看器

目录 项目场景&#xff1a; 项目需求描述&#xff1a; 项目技术&#xff1a; 项目成果&#xff1a; 项目总结&#xff1a; 项目视频&#xff1a; 芳香 项目场景&#xff1a; 使用ESP-BOX-LITE实现照片查看器功能&#xff0c;显示多级目录下的图片或文件夹&#xff0c;自…

二进制部署k8s

常见的K8S安装部署方式 ●Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ●Kubeadm Kubeadm也是一个工具&#xff0c;提供…

vue3中使用vue3-pdf-app和使用浏览器内置的PDF插件浏览器PDF文件

文章目录 先准备一个PDF使用浏览器内置的PDF插件预览PDF在HTML中使用浏览器插件预览PDFVscode使用插件发布服务后直接通过URL地址访问PDF可使用的浏览器 在vue3项目中预览PDF文件vue3项目也是可以通过URL地址访问文件的vue3中使用浏览器内置的PDF插件预览PDF代码如下所示&#…