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.mzph.cn/news/116328.shtml

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

相关文章

学习MAVEN

MAVEN的详细介绍和作用、意义 好的&#xff0c;小朋友们&#xff0c;我们今天来聊聊一个非常神奇的工具箱&#xff0c;它的名字叫做Maven! &#x1f31f; 1. **神奇的工具箱Maven**: Maven就像是一个神奇的工具箱&#x1f9f0;&#xff0c;它可以帮助大人们把他们的电脑工…

【Docker】Dockerfile常用指令

参考官方文档&#xff1a;https://docs.docker.com/engine/reference/builder/ Dockerfile常用指令 指令说明from基础镜像&#xff0c;当前镜像基于&#xff08;依赖&#xff09;哪个镜像maintainer镜像的维护者和邮箱run镜像构建时需要执行的命令workdir镜像的工作目录expos…

基于springboot实现基于Java的超市进销存系统项目【项目源码+论文说明】

基于springboot实现基于Java的超市进销存系统演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;超市进销存系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#x…

最详细STM32,cubeMX外部中断

这篇文章将详细介绍 cubeMX外部中断的配置&#xff0c;实现过程。 文章目录 前言一、外部中断的基础知识。二、cubeMX 配置外部中断三、自动生成的代码解析四、代码实现。总结 前言 实验开发板&#xff1a;STM32F103C8T6。所需软件&#xff1a;keil5 &#xff0c; cubeMX 。实…

09 创建型模式-建造者模式

1.建造者模式介绍&#xff1a; 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不 同的表示。 2.建造者模式要解决的问题 建造者模式可以将部件和其组装过程分开&am…

【Unity程序技巧】公共Update管理器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【29】c++设计模式——>策略模式

策略模式 C中的策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的类&#xff0c;并且使它们可以互相替换&#xff0c;从而使得算法的变化独立于使用算法的客户端。 策略模式通…

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现(骨干网络基于VGG16、ResNet50、ResNet101)

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现&#xff08;骨干网络基于VGG16、ResNet50、ResNet101&#xff09; 背景介绍2、 网络结构详解2.1 LarFOV效果分析 2.2 DeepLab v1-LargeFOV 模型架构2.3 MSc&#xff08;Multi-Scale&#xff0c;多尺度(预测…

Matlab论文插图绘制模板第122期—函数折线图(fplot)

本期分享的是函数折线图的绘制模板。​ 所谓函数折线图&#xff0c;就是将自定义线函数进行可视化表达​。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需要的朋友可以关注同名公号【阿昆的…

【JavaEE】网络编程---TCP数据报套接字编程

一、TCP数据报套接字编程 1.1 ServerSocket API ServerSocket 是创建TCP服务端Socket的API ServerSocket 构造方法&#xff1a; ServerSocket 方法&#xff1a; 1.2 Socket API Socket 是客户端Socket&#xff0c;或服务端中接收到客户端建立连接&#xff08;accept方法&…

浅谈兼容性测试的关键步骤

兼容性测试是确保应用程序在多样化的技术环境中正常运行的关键步骤。它有助于提高用户满意度&#xff0c;扩大市场覆盖范围&#xff0c;同时确保法规合规性。通过正确执行兼容性测试&#xff0c;企业可以确保其应用程序在各种平台上提供一致的卓越用户体验&#xff0c;从而增强…

#电子电器架构 —— 车载网关初入门

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数7000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他…

现在游戏出海有多少优势?

国内游戏市场趋于饱和&#xff0c;但是国外市场潜力仍然可观&#xff0c;因此很多人选择游戏出海&#xff0c;那么现在游戏出海有多少优势呢&#xff1f; 1、市场潜力 全球游戏市场潜力巨大&#xff0c;增长迅速。中国游戏公司具有强大的研发能力和创新能力&#xff0c;能够开…

在edge浏览器中安装好了burp的ca证书,浏览器依旧不能访问https的原因

在edge浏览器中安装好了burp的ca证书&#xff0c;浏览器依旧不能访问https的原因 1.SwitchyOmega代理插件设置2.CA证书方法1方法2 1.SwitchyOmega代理插件设置 严格安装以下图片执行&#xff0c;不可少写或多写 2.CA证书 方法1 下载好证书&#xff0c;先导入到edge浏览器的中…

Qt 案例 使用QNetworkReply或者URLDownloadToFile 下载http、https资源到本地路径

Qt 使用QNetworkReply或者URLDownloadToFile两种不同方式下载http、https链接资源文件&#xff0c;并且获取下载进度。 目录 一、 使用 URLDownloadToFile 下载二、 使用 QNetworkReply 下载三、 打包好的可执行程序示例下载四、 会员或订阅专栏下载源码 一、 使用 URLDownload…

pv操作题目笔记

对于 pv 操作分以下几步走 什么是pv操作 PV操作在进程同步中通常指的是信号量&#xff08;Semaphore&#xff09;操作。信号量是一种用于控制多个并发进程或线程之间的同步和互斥访问的同步工具。PV操作通常涉及两个基本操作&#xff1a;P操作&#xff08;wait操作&#xff0…

hdlbits系列verilog解答(向量门操作)-14

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 构建一个具有两个 3 位输入的电路&#xff0c;用于计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的逆 &#xff08;NOT&#xff09;。将b反相输出到out_not上半部分&#xff0c;将a 的反相输出到out…

git pull 和 git fetch 有什么区别?

一、是什么 先回顾两个命令的定义 git fetch 命令用于从另一个存储库下载对象和引用git pull 命令用于从另一个存储库或本地分支获取并集成(整合) 再来看一次git的工作流程图&#xff0c;如下所示&#xff1a; 可以看到&#xff0c;git fetch是将远程主机的最新内容拉到本地…

K8S集群实践之九: Ceph

Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments.1. 说明 因香橙派和树莓派资源所限&#xff0c;转移到基于VirtualBox建立的VMs继续实践…

Java实现添加文字水印、图片水印

目录 前言 一、获取原图片对象信息 1、读取本地图片 2、读取网络图片 二、处理水印 三、添加水印 四、获取目标图片 五、完整工具类 六、结果展示 前言 现在很多人都喜欢在各种平台上分享自己的照片吧&#xff0c;不管是一些制作出来的媒体图片还是精致的人像图片&…