请求处理
请求参数处理
servlet 中使用 request.getParameter("name") 获取参数, 在SpringMVC中 只需要在处理方中声明对应的参数就可以自动接收请求的参数。并且还可以自动转换类型 类型不匹配会报400错误 请求的参数必须和处理参数参数名一致 如果处理方法的参数未传入的情况 会自动传入null
如果处理方法的参数和传入的参数不一致 可以使用 @RequestParam("myage") 作用到传入参数前面 指定url参数名称
@RequestParam("myage") Integer age
@RequestParam(value = "myage",required = false) Integer age
@RequestParam(value = "myage",defaultValue="111") Integer name
int 不能为null Integer 可以
jsp文件 form表单 url参数 项目根目录${"pageContext.request.contextPath"}
<form action="${pageContext.request.contextPath}/params01" method="post">
中文乱码: GET 请求乱码 : Tomcat conf server.xml 修改Connector 添加 URIEncoding="utf-8"
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
POST 请求乱码: 在servlet 的时期 在获取参数之前设置 request.setCharsetEncoding("UTF-8"),每个参数都需要设置,所以国门用过滤器设置编码 request.setCharsetEncoding("") 终极解决方式
使用SpringMVC提供的编码过滤器CharacterEncodingFilter来解决POST乱码问题:
在web.xml中配置
<!-- 配置编码过滤器-->
<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>
<!--只过滤request1的servlet-->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<servlet-name>request1</servlet-name>
</filter-mapping>
form表单与spring方法接受对应
package com.kdy.entity;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class User {
private Integer id;
private String name;
private String[] alias;
private List<String> hobbies;
private Map<String,String> relatives;
private Role role;
private List<User> friends;
package com.kdy.entity;
public class Role {
private Integer id;
private String name;
<h2>复杂类型的参数演示</h2>
<form action="${pageContext.request.contextPath}/params03" method="post">
ID:<input name="id" type="text"><br />
姓名:<input name="name" type="text"><br />
<!--对应String 数组及List-->
外号: <input name="alias" type="checkbox" value="张三">张三
<input name="alias" type="checkbox" value="李四">李四
<input name="alias" type="checkbox" value="王二">王二
<input name="alias" type="checkbox" value="赵武">赵武
<input name="alias" type="checkbox" value="孔六">孔六
<br />
<%-- 爱好:<input name="hobbies" type="checkbox" value="唱歌">唱歌--%>
<%-- <input name="hobbies" type="checkbox" value="跳舞">跳舞--%>
<%-- <input name="hobbies" type="checkbox" value="美食">美食--%>
<%-- <input name="hobbies" type="checkbox" value="看电影">看电影--%>
<!--List 是有索引的-->
爱好:<input name="hobbies[0]" type="checkbox" value="唱歌">唱歌
<input name="hobbies[1]" type="checkbox" value="跳舞">跳舞
<input name="hobbies[2]" type="checkbox" value="美食">美食
<input name="hobbies[3]" type="checkbox" value="看电影">看电影
<br />
亲属:
<!--对应Map-->
<input name="relatives[dagu]" type="checkbox" value="大姑">大姑
<input name="relatives[ergu]" type="checkbox" value="二姑">二姑
<input name="relatives[sijiuma]" type="checkbox" value="四舅妈">四舅妈
<input name="relatives[badayi]" type="checkbox" value="八大姨">八大姨
<!--子类-->
角色名:<input name="role.name" type="text"><br />
角色ID:<input name="role.id" type="text"><br />
<!--子类list-->
朋友1:<input name="friends[0].id" type="text" value="666">
<input name="friends[0].name" value="孔德阳01" type="text">
<input name="friends[1].id" type="text" value="6667">
<input name="friends[1].name" value="孔德阳11" type="text">
<input type="submit" value="提交">
</form>
<!--
如果是包装类型的简单变量 直接输入属性名字 = 表单元素的name
数组 =保证表单元素name是一样的
List不是简单变量 必须加上[索引] name="list[0].username"
map 必须加上[key] name="map[key]"
实体类 只能给某个属性赋值 name="Object.xxx"
-->
SpringMVC 控制器方法 传入多个参数解决
当传入参数有多个时,多个都会绑定参数
@RequestMapping("params03")
public String params03(User user, Role role){
System.out.println(user);
System.out.println(role);
return "index.jsp";
}
遇到这种情况 一般再次封装一层 名字一般是ObjectDTO DTO:data translation object数据传输对象
package com.kdy.entity;
public class UserDTO {
private User user;
private Role role;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
@Override
public String toString() {
return "UserDTO{" +
"user=" + user +
", role=" + role +
'}';
}
}
此时form表单根据封装加上 user.xxx role.xxxx
<h2>复杂类型的参数演示</h2>
<form action="${pageContext.request.contextPath}/params04" method="post">
ID:<input name="user.id" type="text"><br />
姓名:<input name="user.name" type="text"><br />
<!--对应String 数组及List-->
外号: <input name="user.alias" type="checkbox" value="张三">张三
<input name="user.alias" type="checkbox" value="李四">李四
<input name="user.alias" type="checkbox" value="王二">王二
<input name="user.alias" type="checkbox" value="赵武">赵武
<input name="user.alias" type="checkbox" value="孔六">孔六
<br />
<%-- 爱好:<input name="hobbies" type="checkbox" value="唱歌">唱歌--%>
<%-- <input name="hobbies" type="checkbox" value="跳舞">跳舞--%>
<%-- <input name="hobbies" type="checkbox" value="美食">美食--%>
<%-- <input name="hobbies" type="checkbox" value="看电影">看电影--%>
<!--List 是有索引的-->
爱好:<input name="user.hobbies[0]" type="checkbox" value="唱歌">唱歌
<input name="user.hobbies[1]" type="checkbox" value="跳舞">跳舞
<input name="user.hobbies[2]" type="checkbox" value="美食">美食
<input name="user.hobbies[3]" type="checkbox" value="看电影">看电影
<br />
亲属:
<!--对应Map-->
<input name="user.relatives[dagu]" type="checkbox" value="大姑">大姑
<input name="user.relatives[ergu]" type="checkbox" value="二姑">二姑
<input name="user.relatives[sijiuma]" type="checkbox" value="四舅妈">四舅妈
<input name="user.relatives[badayi]" type="checkbox" value="八大姨">八大姨
<!--子类-->
角色名:<input name="user.role.name" type="text"><br />
角色ID:<input name="user.role.id" type="text"><br />
<!--子类list-->
朋友1:<input name="user.friends[0].id" type="text" value="666">
<input name="user.friends[0].name" value="孔德阳01" type="text">
<input name="user.friends[1].id" type="text" value="6667">
<input name="user.friends[1].name" value="孔德阳11" type="text">
<br ><br ><br >
角色ID:<input name="role.id" type="text"><br />
角色姓名:<input name="role.name" type="text"><br />
<input type="submit" value="提交">
</form>
方法改进
@RequestMapping("params04")
public String params03(UserDTO userdto){
System.out.println(userdto);
return "index.jsp";
}
请求参数 其他注解 @RequestHeader 获取header头 @CookieValue 获取cookie中的值
// @RequestMapping("params05")
// public String params05(@RequestHeader("Host") String host){
// System.out.println(host);
// return "index.jsp";
// }
//
//
@RequestMapping("params05")
public String params06(@RequestHeader Map<String,String> headers){
Set<Map.Entry<String, String>> entries = headers.entrySet();
for(Map.Entry<String, String> entry:entries){
System.out.println(entry.getKey()+"##-->>"+entry.getValue());
}
return "index.jsp";
}
//获取cookie
@RequestMapping("params06")
public String cookie(@CookieValue("JSESSIONID") String seesionid){
System.out.println(seesionid);
return "index.jsp";
}
SpringMVC 原生servlet的支持
@RequestMapping("/org")
public String orgServlet(HttpServletRequest request, HttpServletResponse response){
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":"+cookie.getValue());
}
String name = request.getParameter("name");
return "index.jsp";
}
除了HttpServletRequest HttpServletResponse
还有 HttpSession
Principal 获取安全协议相关
Local 当前语言
ServletInputStream
OutputStream 等
springmvc 可以和 servlet api 一起用
技巧
JRebel插件 方便调试 Intellj 快捷键 Ctrl+Shift +Alt +N 查找类