SpringMVC
@RequestParam获取请求参数
一:默认方式获取请求参数
- 发送请求参数
<a href="test?name=liushui">test</a>
- Controller中的处理方法:
@RequestMapping("test")
public String test(String name) {
System.out.println(name);
return "success";
}
必须使处理函数中的变量名与想要获取的参数的变量名相同
这种方式下,参数可以省略,默认值为null
二:通过@RequestParam(“parameter”)
- 发送请求参数
<a href="test?name=liushui">test</a>
- Controller中的处理方法:
@RequestParam(“param”)中的param必须指定为想要获取的参数
需要跟一个变量,这个变量的名字为任意,不需要和获取的参数为相同名
@RequestMapping("test")
public String test(@RequestParam("name")String NAME) {
System.out.println(NAME);
return "success";
}
这种方式下参数不可以省略的,否则会400
但是修改@RequestParam()中的值可以做到
@RequestParam()中有三个参数
- value
- required
- defaultvalue
value=“name” 表示要获取name这个参数
required为boolea,true(默认)表示这个数必须要有,false反之
defaultvalue=“liushui” 表示当没有提交这个参数时,用这个默认值代替
@RequestHeader()来获取请求头参数
通过@RequestHeader()来获取
与@RequestParam一样@RequestHeader中有三个参数
具体使用见@RequestParam获取请求参数
- value
- required
- defaultValue
@CookieValue获取Cookie
@RequestMapping("test")
public String test(@RequestParam(value = "name",required = false,defaultValue = "nihao")String name,
@CookieValue("JSESSIONID")String jid) {
System.out.println(name);
return "success";
}
form 表单中需要提交参数过多,使用POJO接收参数
现在form表单有多个项要进行提交,提交的参数必定要接收,若在处理函数中定义多个变量来接收form表单提交的参数显得过于累赘,可以使用一个POJO来接收
form表单:
<form action="test" method="get">
name:<input type="text" name="name1" ><br>
price:<input type="text" name="price"><br>
author:<input type="text" name="author" ><br>
<input type="submit" value="提交">
</form>
POJO:
public class Book {
private String name;
private String author;
private int price;
public Book() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book [name=" + name + ", author=" + author + ", price=" + price + "]";
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
处理函数:
@RequestMapping("test")
public String test(Book book) {
System.out.println(book);
return "success";
}
- 这个POJO中的属性必须与form表单中提交的参数名一样,否则会找不到
若有多个值提交,最少有一个值不为空,否则会报错- 上面说法有误,我测试了下,如果为String类型参数被省略会默认补上null,而int类型省略,就会直接报错!!!所以说基本类型不可以省略!!!
级联封装
当form表单中存在多余属性,但是该属性是属性的属性,听起来可能很拗口,我打个比方,类A中有属性类B对象,form表单中的对象为类B中的对象
现在POJO中多一个类对象:
private String name;
private String author;
private int price;
private Press press;
(press为新增对象)
Press类:
public class Press {
private String principalName;
private String phoneNumber;
public Press() {}
public String getPrincipalName() {
return principalName;
}
public void setPrincipalName(String principalName) {
this.principalName = principalName;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "Press [principalName=" + principalName + ", phoneNumber=" + phoneNumber + "]";
}
}
现在POJO中出现了一个对象类型属性(不同于String等)由于form表单中name值要和属性名相同,name属性中的属性在form中该怎么写name呢?
<form action="test" method="get">
name:<input type="text" name="name1" ><br>
price:<input type="text" name="price"><br>
author:<input type="text" name="author" ><br>
principalName:<input type="text" name="press.principalName" ><br>
phoneNumber:<input type="text" name="press.phoneNumber" ><br>
<input type="submit" value="提交">
</form>
== 必须要用 对象名.属性名 ,只有这样才会让SpringMVC找到对应的类进行参数注入==
解决中文乱码问题
-
请求乱码
- GET请求
在服务器配置中找到 server.xml 在该位置上 添加 URIEncoding=“UTF-8”
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="8443"/>
- POST请求
-
响应乱码
post请求乱码和响应乱码可以在 web,xml中进行配置过滤器进行解决
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class>
<!-- 这这参数是用来配置post请求参数的编码-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 这个boolean类型的参数是用来设置是否也要对响应乱码进行处理-->
<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>