目录
1. 获得普通类型参数
这是最简单的一种获取参数,只需要满足url请求的键和后台接收请求方法中的形参保持一致即可,
后台:
@RequestMapping("/quick8")
@ResponseBody
//获得普通类型请求数据,直接按下面格式,不用写什么req对象,直接给方法加上形参
public void save8(String username,int age) {
System.out.println(username);
System.out.println(age);
}
url格式:....../quick8?username=zhangsan&age=18
这样访问后就可以得到两个普通类型的参数了。
2. 获得POJO类型参数
POJO类型其实也就是我们的JavaBean,一个类的实例,我们的框架可以做到自动识别url里请求的键与我们形参里实例对象相匹配
比如这里的User类,类里有这两个属性username和age:
public class User {
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
private String username;
private int age;
}
我们的后台获取请求如下编写:
@RequestMapping("/quick9")
@ResponseBody
//POJO:获得请求参数并自动按属性名匹配后封装到一个对象里,即自动给这个对象赋好值
public void save9(User user) {
System.out.println(user);
}
url的请求格式为:......./quick9?username=zhangsan&age=18
这样访问这个mapping后就得到了POJO类型的参数
3. 获得数组类型参数
这里的数组类型参数只得是元素是普通数据,比如String[]、Int[]这种的,后台编写如下:
@RequestMapping("/quick10")
@ResponseBody
//获取请求参数自动转为数组对象:string[]/int[]这种
public void save10(String[] strs) {
System.out.println(Arrays.asList(strs));
}
我们的形参就是一个数组对象,这里是字符串数组对象,println里的方法可以自行百度一下,就是一个打印数组的方法。
这里我们的请求头编写的方法就是......./quick10?strs=a&strs=b&strs=c
没错,所有的键都是strs,因为这里的形参里strs是一个数组对象,所有后台会自动识别这个strs键的值都是这个数组里的元素,然后按顺序往strs这个数组里添加。
4. 获得集合类型参数
与获取数组类型参数不同的是,集合类型的参数最大的特点就是里面的元素可能是一个对象,也就是一个对象的集合,这里以user对象的集合为例。
4.1 通过POJO方式
通过POJO的方式来获取,就是将我们要写入的这个集合对象作为我们一个类里面的属性值,然后实例化这个类来作为我们承接数据的形参,比如这里我们实例化一个VO类使用vo对象:
@RequestMapping("/quick11")
@ResponseBody
//获取请求参数自动转为集合对象:List<E>这种,里面得元素不一定是普通数据,也可以是对象或者别的东西,这时我们需要将集合对象装在POJO里
//这种请求参数用get方法获取起来不易,我们一般用post,然后表单形式。
public void save11(VO vo) {
System.out.println(vo);
}
然后我们用一个表单来提交我们所需要的数据,方法就通过post的方法,因为编写url头的形式太复杂,对于这么多各种各样的数据。
<form action="${pageContext.request.contextPath}/user/quick11" method="post">
<%-- 需要表明是第几个对象,用下标,然后后面给出这个对象的哪一个数值,框架就会通过name把这些全写入vo对象--%>
<input type="text" name="userList[0].username"><br/>
<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>
ps:{pageContext.request.contextPath}是一个定位器加上他可以在不同设备准确的从webapp下开始索引路径 。
这里我们需要编写的name的格式如上图,首先我们userList实际上是我们vo对象里面自定的一个private属性:
public class VO {
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "VO{" +
"userList=" + userList +
'}';
}
private List<User> userList;
}
而这里的name就是我们请求数据里面的键,这里的键就要填我们想要拿到的这个userList,只是说我们通过POJO将他放在对象里,然后既然是一个集合,这个集合现在打算收两个对象,所以用下标方式来表示不同对象——userList[0],然后每一个对象内部又有这自己的属性,因此需要这样引用——userList[0].username、userList[0].age,这样我们填入的数据才能准确匹配每个对象及其属性值。
这样运行填写提交后就可以看到对应的效果了。
4.2 通过ajax请求方式
这个方式跟POJO的不同之处就在于它的形参可以是userList本身
就像这样:
可以看见,使用这种方式我们是在形参的前面使用了一个@RequestBody注解。
然后ajax部分的请求编写如下:
ajax前面导入jQuery和js语句定义一个userList对象就不用赘述了,其实它就是把它页面的js对象先转为json格式在请求传到后台,,只需要在contentType处设置好是json数据传输就行了,后台自动会将这个json数据写成它的userList,然后就得到了这个集合类数据。
5. 设置字符过滤器
在项目之初,相信通过post方法收集表单时,若我们填入了中文,在后台打印出来的数据可能是一对乱码,这个原因就是字符格式不同引起的,所以现在我们要进行一个请求响应所有的字符格式规范统一的一个过滤器,这个需要项目运行之初便配置。
方法是在web.xml中如下配置:
<!-- 给整个app配置过滤器,将全局字符都配为utf-8-->
<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>
设置filter和filter-mapping,我们用的也是spring-mvc官方的字符过滤器,只需要在init-param中设置我们要的字符编码格式即可,过滤器的配置可以直接复制上文使用。
6. 静态资源访问的开启
在刚使用springMVC后,相信有好多人自己做一些图片展示或者css设计等,发现会报错,根本展示不出来,自己定义的文件和图片,无法被访问到
原因:我们只有一个servlet,而这个servlet的范围是全局应用,也就是每一个访问的连接,都会被当作是一个mapping,当它在controller中没有找到这个mapping时,就不执行了,然后报错找不到,所以这是、时,我们要设置它为:当某一个访问在mapping中找不到时,自动交给原生的tomcat去处理访问,原生的tomcat就能访问到静态资源。
实现上述功能只需要加一句话在spring-mvc.xml中,但是要用到我们上一期讲的mvc的命名空间
<!-- 访问静态资源时遇到的问题,原因是mvc框架找不到对应的映射,这时交由原始容器-->
<mvc:default-servlet-handler/>
设置完这句即可正常运作,这句话也需要作为项目搭建便配置。
7. 参数不匹配时获取数据
上面都说要请求的url后面跟的键值对的键要和我们的形参或者是属性要匹配才能自动转换识别,那如果他们不匹配能不能识别?
答案是能,但是需要一定工具,而且一般我们能够匹配还是让他们匹配,毕竟都是一个项目里的,这个工具就是——@RequestParam注解
如上图所示,第一个框是form表单,里面提交的数据的键是name,然后我们在接收的时候,设置的形参是username,不一样的时候但我们想顺利把name的值接到username身上,就安装下面框里的 @RequestParam的格式来编写即可。
8. 获取Restful风格的数据
首先明白什么是Restful风格的数据
也就是通过url和请求方式相结合来默认一种操作类型,从而简便请求的url的处理,上图的例子可知。
当我们知道是这种风格的请求时,我们需要这样编写,用到了占位符,用的的相关注解是@PathVariable:
上面实例可以看到当指定请求的mapping后面跟着一个数据时,而这个数据后台只知道是一个什么类型的,代表什么的数据,但并不知道它具体的内容是什么,同时请求时也不需要通过键值对的方式传数据到后台,这样的话我们后台编写的时候应提前做好占位符
比如这里我知道这个mapping后面应该要接一个name的值,我占着位,然后使用@PathVariable注解,如上图格式,这样我形参里的name便获取到了我们这个占位符占的数据的具体值。
9. 获取原生servlet的相关API
要获取原生servlet的API很简单,只需要创建相应形参,然后访问后得到的对象即为我们想要的API的对象。
@RequestMapping("/quick13")
@ResponseBody
//获取原生servlet的相关api。
public void save13(HttpRequest request, HttpResponse response, HttpSession session) {
}
10.获取请求头
通过@RequestHeader这个注解,用法如下,value是报文里吗键值对的键。
获取请求头中的cookie中的session-id
同时虽然cookie这个键也是报文里的一个,我们可以通过上面的@RequestHeader的方法去获取,但是往往cookie中的内容很多,并且也有类似键值对的格式,所以这里介绍一个更针对性的注解——@CookieValue
与@RequestHeade相同,这里的value是cookie里键值对的键,一般我们用的最多的就是获取JSESSIONID,也就是session的id,使用方法及格式如上。