SpringMVC的请求
基本类型参数
POJO类型参数
数组类型参数
集合类型参数
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型转换;
自动的类型转换是指从String向其他类型的转换
如果你传递的基本类型的参数和方法中的形参不匹配,那么方法中的形参就是null
http://localhost:8080/week/quickMonday?username=laowang
@ResponseBody @RequestMapping("/quickMonday") public void Monday(String username){ //传递来的参数需要和方法的形参名相同,否在获取的参数就是null,不传递此参数也为null System.out.println(username); }
User:
package com.springMvc.Domain; public class User { private String username; private Integer age; public User() { } public User(String username, Integer age) { this.username = username; this.age = age; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", age=" + age + '}'; } }
@ResponseBody @RequestMapping("/quickTuesday") public void quickTuesday(User user){ // 传递来的参数会自动帮我们封装进对象内,如果没有传递来的参数就是null System.out.println(user); }
获得数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
@ResponseBody @RequestMapping("quickWednesday") //http://localhost:8080/week/quickWednesday?strs=aaa&strs=bbb public void quickWednesday(String [] strs){ // 传递的参数必须是strs名 // System.out.println(Arrays.asList(strs));// 使用了转化后数组不可以为空,必须要有值,所以传递来的数组不可以为空 System.out.println(strs); // 可以为空 }
public class VO { private List<User> userList; public VO(List<User> userList) { this.userList = userList; } public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } @Override public String toString() { return "VO{" + "userList=" + userList + '}'; } }
前端:
<form action="/week/quickThursday" method="post"> <%--表明是第一个User对象的username age--%> <input type="text" name="userList[0].username"><br/> <!--参数userList是你的内部封装的,传递到后点代码会帮我自动匹配--> <input type="text" name="userList[0].age"><br/> <input type="text" name="userList[1].username"><br/> <input type="text" name="userList[1].age"><br/> <input type="submit" value="提交"> </form>
@ResponseBody @RequestMapping(path = "quickThursday",method = RequestMethod.POST) public void quickThursday(VO vo){ // 接收传递来的参数自动和VO中的进行匹配 System.out.println(vo); }
首先idea要导入对应的包
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>catalina</artifactId> <version>6.0.29</version> </dependency>
springMVC.xml 开放访问资源
<!-- 开放资源的访问--> <mvc:annotation-driven/> <mvc:resources mapping="/js/**" location="/js/"/> <!--开放/js/下的所有文件,访问路径是/js/-->
1、保持上述配置不变
2、导入catalina包,位于tomcat的lib下,添加到项目中
3、修改web.xml配置文件:
web.xml
<!--配置默认Servlet--> <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="/js/jquery-3.3.1.js"></script> <script> var userList = new Array(); userList.push({username:"zhangsan",age:18}); userList.push({username:"lisi",age:28}); console.log(JSON.stringify(userList)) $.ajax({ type:"POST", url:"/week/quickFriday", dataType :'json', data:JSON.stringify("laolwang"), contentType: "application/json;charset=UTF-8", }); </script> </head> <body> </body> </html>
@ResponseBody @RequestMapping(value = "quickFriday",method = RequestMethod.POST) public void quickFriday(@RequestBody List<User> userList){ System.out.println(userList); }
•在spring-mvc.xml配置文件中指定放行的资源
<mvc:resources mapping="/js/**"location="/js/"/>
<!--开发资源的访问--> <!--<mvc:resources mapping="/js/**" location="/js/"/> <mvc:resources mapping="/img/**" location="/img/"/>--> <mvc:default-servlet-handler/>
也可以使用以下来代替
<!--配置全局过滤的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>
参数绑定注解@RequestParam
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
我们在获取参数的时候上面讲解都是传递参数名要和方法内的形参名相同才可以获取到,但是前后端分离的时候有时候会出现人员核对出错导致传递参数名和方法内规定的参数名不同,那样就会导致参数获取为null,所以我们可以使用注解@RequestParam来进行注解绑定,只要方法内的参数通过这个注解限定后就会自动和前端传递来的参数进行匹配上
注解@RequestParam还有如下参数可以使用:
value:与请求参数名称
required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””) value:参数名 required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。 defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
@ResponseBody @RequestMapping("quickSaturday") public void quickSaturday(@RequestParam(value = "name",required = false)String username){ // 请求的参数可以为空,请求的参数名士name,和username的值进行绑定 System.out.println(username); }
如果参数设置了required = true则不可以为空
@ResponseBody @RequestMapping("quickWeekday") public void quickWeekday(@RequestParam(value = "user",required = true) String username){ // 请求的参数user不可以为空 System.out.println(username); }
请求为空则会报错
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
@ResponseBody @RequestMapping("quickWeekday") public void quickWeekday(@RequestParam(value = "user",required = true,defaultValue = "老王") String username){ // 设置了默认值之后,限定不可以为空就无意义了,因为哪怕你不传递值也有默认值了 System.out.println(username); }
GET:用于获取资源
POST:用于新建资源
PUT:用于更新资源
DELETE:用于删除资源
例如:
/user/1 GET : 得到 id = 1 的 user /user/1 DELETE: 删除 id = 1 的 user /user/1 PUT: 更新 id = 1 的 user /user POST: 新增 user
上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
Restful风格的url必须搭配@PathVariable注解进行占位符的匹配获取工作
不然是获取不到url请求所携带的值
rstful所使用的占位符再传递参数的时候直接输入对应的参数值就可以了,后端获取的时候直接使用@RepathVariable进行获取即可
eg:
http://localhost:8080/week/quickJanuaryMonday/saas
@ResponseBody @RequestMapping(path = "/quickJanuaryMonday/{name}") // restful风格的url占位符name public void quickJanuaryMonday(@PathVariable("name")String username){ // 接受占位符name的值并映射到username中 System.out.println(username); }
pringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
自定义类型转换器的开发步骤:
定义转换器类实现Converter接口
在配置文件中声明转换器
在<annotation-driven>中引用转换器
定义继承了 Converter类的转换类
public class DateConverter implements Converter<String, Date> { @Override public Date convert(String s) { //将日期字符串转换成日期对象 返回 SimpleDateFormat formate = new SimpleDateFormat("yy-MM-dd"); Date date = null; try { date = formate.parse(s); } catch (ParseException e) { e.printStackTrace(); } return date; } }
在springMvc.xml中声明转换器类
<!-- 声明转换器--> <bean id="converterservice" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.springMvc.Controller.DateConverter"/> </list> </property> </bean>
在springMVC.xml中引用转换器
<mvc:annotation-driven conversion-service="converterservice"/>
后端代码:
@ResponseBody @RequestMapping("quickJanuaryThursday") public void quickJanuaryThursday(Date date){ System.out.println(date); }
请求的地址;http://localhost:8080/week/quickJanuaryThursday?date=2020-19-7
HttpServletRequest
HttpServletResponse
HttpSession
@ResponseBody @RequestMapping("quickJanuaryWednesday") public void quickJanuaryWednesday(HttpServletRequest request, HttpServletResponse response, HttpSession httpSession){ System.out.println(request); System.out.println(response); System.out.println(httpSession); }
@RequestHeader注解的属性如下:
required:是否必须携带此请求头
@ResponseBody @RequestMapping("quickJanuaryThursday") public void quickJanuaryThursday(@RequestHeader(value = "User-Agent",required = false)String user_agent){ // 获取user-agent请求头 System.out.println(user_agent); }
@CookieValue
使用@CookieValue可以获得指定Cookie的值
value:指定cookie的名称
required:是否必须携带此cookie
@ResponseBody @RequestMapping("quickJanuaryFriday") public void quickJanuaryFriday(@CookieValue(value = "JSESSIONID") String jsessionId){ System.out.println(jsessionId); }