概念
SpringMVC既然是要替代Servlet,自然也会有请求和响应的功能.
而且这些功能要比原本Servlet中的请求和响应要方便的多.
准备
一.配置MVC环境
在使用SpringMVC的请求和响应前,需要先进行基本的MVC环境配置.
参考这篇文章:https://blog.csdn.net/chinatopno1/article/details/105106249
二.处理POST请求乱码
在web.xml中设置
处理POST请求模式下的中文乱码
(如果是GET请求,则无需处理)
<!--配置过滤全局的编码-->
<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>
三.释放静态资源
当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下方式指定放行静态资源
在springmvc.xml配置文件中指定放行的资源
<mvc:default-servlet-handler/>
四.打开注解驱动
在springmvc.xml中声明SpringMVC的注解驱动
貌似只有这样,我们在类中使用RequestMapping,ResponseBody这样的标签才会有效
<mvc:annotation-driven/>
它有二个作用:
数据共享与跳转
SpringMVC中,有一种个对象,那就是ModelAndView对象
它有2个作用
作用一:数据域共享
可以通过ModelAndView共享数据 相当于Request域共享.
作用二:跳转页面
ModeAndVie还可以跳转页面,并且跳转页面时同样会进行数据共享
格式:
//
@RequestMapping("/自定义虚拟路径")
public ModelAndView 自定义方法名(){
ModelAndView 自定义ModelAndView对象名 = new ModelAndView();
自定义ModelAndView对象名.addObject("自定义键名",自定义任意类型的数据 );
自定义ModelAndView对象名.setViewName("用来跳转url链接,此处是以视图方式跳转,因此不应该加上斜杠'/'");
return 自定义ModelAndView对象名;
}
列如:
//通过ModelAndView共享数据 相当于Request域共享 不仅仅用于页面跳转,还会携带共享数据
@RequestMapping("/modelview")
public ModelAndView modelview(){
ModelAndView mv = new ModelAndView();
mv.addObject("keyName","paramTest" );
mv.setViewName("url"); //以视图处理的方式跳转
return mv;
}
MVC应用于响应
我们可以将一些字符串响应在前台页面,在servlet中是response方法.
在springMvc中则是用’ResponseBody’注解配合方法的返回值类型来实现.
响应普通字符串到页面
格式:
@RequestMapping (value = "/自定义虚拟路径",produces = "text/html;charset=utf-8") // produces用于设置编码
@ResponseBody //告诉SpirngMVC 此处的返回内容不做跳转,而是要以字符串的形式输出到浏览器上
public String 自定义方法名(){
return String类型的数据;
}
列如:
@RequestMapping (value = "/stringone",produces = "text/html;charset=utf-8") // produces用于设置编码
@ResponseBody //告诉SpirngMVC 此处的返回内容不做跳转,而是要以字符串的形式输出到浏览器上
public String stringOne(){
return "你好!中国第一!";
}
响应JSON字符串到页面
格式:
@RequestMapping (value = "/自定义虚拟路径名",produces = "application/json;charset=utf-8") // produces用于设置编码
@ResponseBody
public String 自定义方法名() throws JsonProcessingException {
响应实体类 自定义实体类对象名 = new 响应实体类();
//为该实体类赋值,可选
ObjectMapper 自定义JSON字符串转换对象名 = new ObjectMapper();
String 自定义转换结果名 = 自定义JSON字符串转换对象名.writeValueAsString(userObj);
return 定义转换结果名;
}
列如:
@RequestMapping (value = "/stringjson",produces = "application/json;charset=utf-8") // produces用于设置编码
@ResponseBody
public String stringOfJson() throws JsonProcessingException {
User userObj = new User();
userObj.setName("韩江");
userObj.setAge(20);
ObjectMapper om = new ObjectMapper();
String jsonResult = om.writeValueAsString(userObj);
return jsonResult;
}
响应对象到页面
格式:
@RequestMapping ("/stringuser") // 当输出的数据为对象时,则不用设无需设置编码
@ResponseBody
public 响应实体类名 自定义方法名() throws JsonProcessingException {
响应实体类 自定义实体类对象名 = new 响应实体类();
//为该实体类赋值,可选
return 自定义实体类对象名;
}
列如:
@RequestMapping ("/stringuser") // 当输出的数据为对象时,则不用设无需设置编码
@ResponseBody
public User stringOfUser() throws JsonProcessingException {
User userObj = new User();
userObj.setName("韩江");
userObj.setAge(20);
return userObj;
}
MVC应用于请求
注意:
一.在SpringMVC框架中,
请求结果的形参类型可以为int,double等数字类型.但前提是所提交的参数必须也是数字.
否则将会报错
二.方法中的形参名,必须在名称和顺序上对应着前端提交过来的参数名.
获取并应用普通请求
格式:
@RequestMapping("/自定义虚拟路径")
public 自定义返回值类型 自定义方法名(自定义参数类型 自定形参名一,自定义参数类型 自定形参名等二等多个形参名){
//调用
}
列如:
@RequestMapping("/param")
public void paramGet(String name,String number,int age){
System.out.println("name:"+name);
System.out.println("number:"+number);
System.out.println("age:"+age);
}
获取并应用请求到对象
格式:
@RequestMapping("/自定义虚拟路径名")
public 自定义返回值类型 自定义方法名(实体类名 自定义实体类对象名){
//调用
}
列如:
@RequestMapping("/parampojo")
public String paramPojo(User userObj){
System.out.println(userObj.getName());
System.out.println(userObj.getNumber());
System.out.println(userObj.getAge());
return "forward:/url.jsp";
}
获取并应用请求到数组
格式:
@RequestMapping("/自定义虚拟路径名")
public 自定义返回值类型 自定义方法名(String[] 自定义数组形参名){
//调用
}
列如:
@RequestMapping("paramarr")
public void paramArray(String[] str){
for (String s : str) {
System.out.println(s);
}
}
获取集群的请求参数
当在集群环境下,别的服务器给我们发送json字符串的时候, 我们要使用RequestBody进行解析并接收.
这是因为在集群环境下,不管你发送的参数类型是什么,都是以JSON字符串的形式传输数据的.
基于在真实开发中Web,Service,Dao层是建立在不同服务器,不同项目之间的,因此,想要接收其它服务器发来的参数.那么就必须要用到RequestBody注解,将该注解应用到方法的参数括号内.
格式:
@RequestMapping("/自定义虚拟路径名")
public 自定义返回值类型 自定义方法名(@RequestBody 实体类名 自定义实体类对象名){
//调用
}
列如:
@RequestMapping("/jiqun")
public void jiqun(@RequestBody User userInfo){
System.out.println(userInfo);
}
RequestParam注解(了解)
当一个参数被@RequestParam修饰之后,则访问该方法时, 必须携带这个参数, 否则报错
该注解在目前来看没有意义
@RequestMapping("/show02")
public String show02(@RequestParam String name,@RequestParam int age) {
System.out.println(name);
return "success";
}
获得请求头信息
使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
@RequestHeader注解的属性如下:
value:请求头的名称
required:是否必须携带此请求头
@RequestMapping(value="/quick20")
@ResponseBody
public void save20(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
System.out.println(user_agent);
}
使用@CookieValue可以获得指定Cookie的值
@CookieValue注解的属性如下:
value:指定cookie的名称
required:是否必须携带此cookie
@RequestMapping(value="/quick21")
@ResponseBody
public void save21(@CookieValue(value = "JSESSIONID") String jsessionId) throws IOException {
System.out.println(jsessionId);
}