SpringMVC---- SpringMVC的请求和响应(二)

文章目录

  • 2. SpringMVC 获得请求数据

    • 2.1 获得请求参数

    • 2.2 获得基本类型参数

    • 2.3 获得POJO类型参数

    • 2.4 获得数组类型参数

    • 2.5 获得集合类型参数


🚴大家好!我是近视的脚踏实地,后边这系列是自己自学Spring框架的学习笔记,这篇文章学习关于SpringMVC 的数据请求的 相关知识
     唯有行动  才能解除你所有的不安

2. SpringMVC 获得请求数据

2.1 获得请求参数

客户端请求参数的格式是:name=value&name=value… …
(数据的格式是键值对形式)
服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
(服务端获得的请求参数,如果是单个就可以直接使用,但大部分都要封装到一个实体当中。然后再把这个封装的实体在不同层进行传递,最后和数据交互,)

● 基本类型参数
● POJO类型参数(简单javaBean)
● 数组类型参数
(比如前段页面中有多选的,爱好可以有多个选项,就可以封装为数组)
● 集合类型参数
(和数组功能类似,可以封装多个数据,用得比较多。)

2.2 获得基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。
(服务端在获得这些基本类型的参数,一般就直接使用,不进行实体封装,客户端在提交这个数据时,只要客户端数据的name跟我们controller方法中的参数的name一致,那么SpringMVC就会自动得帮我们进行参数的封装。)

http://localhost:quick9?username=zhangsan&age=12>

(比如说这个后边的参数username=zhangsan&age=12,那么想要获得这个参数,就要在controller中准备一个方法,这个方法设置两个参数,一个String username,一个是int age,这样Springmvc一看参数名称一致,就会封装进去,如下方法)

@RequestMapping("/quick9")@ResponseBodypublic void quickMethod9(String username,int age) throws IOException {System.out.println(username);System.out.println(age);}

(@ResponseBody注解仍然要带上,表示不进行页面的跳转,就是直接回写数据,而设置void,那么返回体就是空的数据,这里只是测试,int age也可以写成String类型中, 因为在web阶段学过,客户端请求任何参数,其实都是字符串形式,这个地方写int也行,springmvc框架可以帮我们进行数据类型的转换。)

运行结果👇:

2.3 获得POJO类型参数

Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
(就是客户端发送的数据,到达服务端之后,到达web层,spingmvc要把这些参数封装到一个实体当中,原先我们用getparametermap,然后再用BeanUtils来封装。那么这些功能已经被springmvc底层封装好,所以在操作时,我们只需要要求请求参数的名称和要封装的实体的属性名一样,那么springmvc也会自动给你封装到实体当中。)

那么接着来测试👇:
实体类👇:

测试代码👇:

font color=009933>运行结果👇:

2.4 获得数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
(这个就是客户端在提交数据的时候,这些数据可能名称都一样,但是值不一样,我们也是可以接收的,只要请求参数的名称跟数组名称一致,就OK。)
测试代码👇:

(数组打印的是地址,list打印出来是有值的,所以可以把数组转成集合,打印出来比较清楚)
运行结果👇:

2.5 获得集合类型参数

获得集合参数时,要将集合参数包装到一个POJO中才可以。
(数组我们直接在方法上写个数组的形参,只要名称一致,就能自动封进去,但集合不行,至少在目前不行,它要借助一个VO对象来进行封装,比如说我要单独去写一个javaBean,它内部有一个集合,我们可以往这个javaBean内部的集合去封装相应的数据,没有办法将这个集合作为形参放到controller的方法中。 )

比如现在准备一个表单,它提交的是某些人的信息,那么一个人就是一个User,某些人就意味着是多个人,那么就得封装到集合当中,就可以使用List集合,泛型是User。

那么先来创建一个VO实体类,VO内部就有我们要封装的那个集合👇:

public class VO {private List<User> userList;    public List<User> getUserList() {return userList;    }    public void setUserList(List<User> userList) {this.userList = userList;    }    @Override    public String toString() {return "VO{"                  "userList="   userList                  '}';    }}

接着来编写测试代码👇:

接着来创建一个表单👇:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page isELIgnored="false" %><html><head>    <title>Title</title></head><body><form action="${pageContext.request.contextPath}/user/quick14" method="post">    <%--表明是第一个User对象的username age--%>    <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></body></html>

(<input type=“text” name=“userList[0].username”>,首先是name得跟谁匹配,我们是要和Vo对象提交,然后要和这个对象封装 的属性名称一样,而VO当中的属性名称是userList,所以先把userList写上,但是userList是个集合,接着得告知往集合里边第几个user对象中封哪个属性,那么就通过角标来[0]就代表是集合当中的第一个User,然后这还是个对象,接着指定User对象中的哪个属性,就是套娃的过程。)
接着把服务器启动进行测试👇:

提交后,控制台👇:

(那么方法上直接封装一个集合,也是可以的,但是那种方式需要特殊的场景,一般表单要封装一个集合,一般还是要封装到集合当中)

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。
(这个第二种场景集合数据就可以直接写在方法形参的位置,在发送ajax请求时,我们可以指定contentType为json形式,在服务端的方法的位置我们就可以直接写集合,去接收请求的数据,与此同时,需要在集合的参数前边加个@RequestBody注解才能进行相应的接收,那么这样就不需要封装到一个pojo对象当中了。)

那么首先来创建一个页面👇:,需要用到jquery,所以先要把相应的js文件导进来

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page isELIgnored="false" %><html><head>    <title>Title</title>    <script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>    <script>        var userList = new Array();        userList.push({username:"zhangsan",age:18});        userList.push({username:"lisi",age:24});        $.ajax({type:"POST",            url:"${pageContext.request.contextPath}/user/quick15",            data:JSON.stringify(userList),            contentType:"application/json;charset=utf-8"        });    </script></head><body></body></html>

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。

接着重启服务器来访问👇:

然后发现控制台并没有输出,那么打开抓包工具查看,发现是没有找到js文件,但是文件确实实在那个位置的 。

那么这是一会要讲的一个小知识点,对于静态资源访问的权限问题,后边再学习, 现在先去springmvc文件中做如下配置就可以解决👇:

然后重新服务器,发现就可以了

(@RequestBody注解代表请求体,就是把请求体里边的内容,直接封装到集合当中,但是在使用过程中,要严格按照步骤,首先客户端发送的是一个json格式的数据,同时contentType要指定为application/json格式的。然后在web层的方法中才可以用@RequestBody把这数据直接封到集合当中 )

接着来分析一下刚刚报错,js文件找不到,那么为什么找不到呢,原因在于前端控制器的配置,springmvc整个架构,它的前端控制器是一个叫做DispatcherServlet,然后来到web.xml文件看👇:

那么这里配了一个/,就是缺省的Servlet,意味着就是客户端发送请求,这个请求到了服务端就找对应的Servlet,找不到最终都归缺省的处理,而现在在web.xml中我们使用的springmvc来开发的,内部没有其他的Servlet,除了DispatcherServlet,没有其他的Servlet,就意味着我都不匹配,都找DispatcherServlet,但这个DispatcherServlet它内部要帮我们进行一个虚拟路径的匹配,匹配controller当中的RequestMapping,而它找那个jquery文件时,也当做了一个RequestMapping来进行匹配,那么很明显我们没有任何一个资源叫做那个jQuery玩意的,匹配不上它就什么都不干了,最终那个js文件是没有被访问到的。

那么为什么在springmvc配置文件中写上<mvc:resources mapping="/js/**" location="/js/"/> 就可以了,这句话是代表在Springmvc框架中开发对哪些资源的访问权限,一般都是静态资源,比如说这个js文件,mapping表示代表那个映射地址,就是找js文件下的jQuery,location代表是哪个目录下的资源是对外开放的,这里就是js下的。

比如说有webapp下会有个img文件夹,里边有很多图片,那么也可以让客户端直接访问的。直接发请求就能访问到这些图片,那么相应的也要进行一下配置。就是mapping映射到img下的所有资源,location指定是img目录,前边你是代表找资源的地址,后边代表具体资源所在的一个目录。

那么在企业中还有一种经常用到的,也是比较方便的👇:

这个代表就是,你在访问资源时,springmvc帮忙找对应的匹配地址,如果找不到就交由与原始的容器,也就是Tomcat,交给Tomcat,让它内部的机制去找静态资源。而Tomcat是有能力帮忙找到静态资源的,原先Web阶段的html,js啊,图片,css都是静态资源,所以说tomcat服务器,它内部的机制可以帮忙找到静态资源的,并返回。

然后后重新服务器,发现同样可以实现功能,说明这种方式也行👇:

(所以这里要掌握的是以后静态资源在访问时,要怎么去开启。让他可以去访问静态资源,两种方式,第一种就是自己配,每次有一个新的又要重新配,第二种就很简单)
注意:通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种方式指定放行静态资源:
● 在spring-mvc.xml配置文件中指定放行的资源
     <mvc:resources mapping="/js/**" location="/js/"/>
● 使用<mvc:default-servlet-handler/>标签

(0)

相关推荐