Spring SpringMVC的请求和响应

 

一,SpringMVC的数据响应

  1.1 数据响应方式  

    1) 页面跳转
      直接返回字符串
      通过ModelAndView对象返回
    2) 回写数据
      直接返回字符串
    返回对象或集合

  1.2 页面跳转

    1.2.1 返回字符串数据

    1.2.2 返回ModelAndView

  通过创建ModelAndView对象,进行对象返回。然后获取数据。也可以直接将数据封装在request对象中,不过这并不推荐,因为SpirngMVC中返回的数据最好放在视图中。

  如下实例:

@RequestMapping("/quick5")
    public Object quickMethod5(HttpServletRequest request){
        ModelAndView modelAndView = new ModelAndView();
        // 往request域中设置数据的方法

        // 1.直接提供产生,框架会自动创建request对象:也可以返回数据,但不推荐
        request.setAttribute("username", "wallace");

        // 2. 通过视图对象的addObject,这里进行了封装
        modelAndView.addObject("age", "18");

        modelAndView.setViewName("index");
        
        return modelAndView;
    }

  上面返回的数据都可以在jsp文件中获取如下:

<p>${username}</p>
<p>${age}</p>

  上面的视图也可以是这样的形式:

@RequestMapping("/quick5")
    public Object quickMethod5(HttpServletRequest request){
        ModelAndView modelAndView = new ModelAndView();
        // 往request域中设置数据的方法

        // 1.直接提供产生,框架会自动创建request对象:也可以返回数据,但不推荐
        request.setAttribute("username", "wallace");

        // 2. 通过视图对象的addObject,这里进行了封装
        modelAndView.addObject("age", "18");

        modelAndView.setViewName("index");
        
        return "index";  // 直接返回对应的视图,也可以解析。不过要设置视图名称
    }

  注意事项:

    // 返回视图形式:默认情况下在返回的视图前面加了forword:页面跳转形式
    @RequestMapping("/quick2")
    public Object quickMethod2(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:index.jsp");
        return modelAndView;
    }
    @RequestMapping("/quick3")
    public Object quickMethod3(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("forward:/jsp/index.jsp");
        return modelAndView;
    }
    @RequestMapping("/quick4")
    public Object quickMethod4(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index"); // 和quick3一致,这里隐藏了拼接
        return modelAndView;
    }

 

  1.3 回写数据

    1.3.1 直接回写字符串

  通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不
需要视图跳转,业务方法返回值为void
  将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,方法返回的字符
串不是跳转是直接在http响应体中返回。
  如下:

    @RequestMapping("/quick7")
    @ResponseBody  // 直接返回字符串,需要添加该注解
    public String quickMethod7(){
        return "bbb";
    }

    1.3.2 会写json格式字符串

    @RequestMapping("/quick8")
    @ResponseBody  // 只要是直接返回字符串就需要该注解
    public String quickMethod8() throws Exception {

        User user = new User();
        user.setName("wallace");
        user.setAge(11);
        ObjectMapper mapper = new ObjectMapper();
        String userJson = mapper.writeValueAsString(user); // 本质上json字符串也是字符串
        return userJson; 
    }

    1.3.3 返回对象和集合

  通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置: 

  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
            </list>
        </property>
    </bean>

  然后就可以直接使用了:

    @RequestMapping("/quick9")
    @ResponseBody
    public User quickMethod9() throws Exception {
        User user = new User();
        user.setName("wallace");
        user.setAge(11);
        return user;  // 返回后会被直接转换成字符串,一般前端可以用ajax进行对应属性值的获取
    }

  注意:上面的配置如果觉的过于麻烦,可以使用mvc的注解驱动替代:如下配置,将上面的配置换成注解驱动也能够实现

<mvc:annotation-driven/>

注意:
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使用 <mvc:annotation-driven /> 自动加载 RequestMappingHandlerMapping(处理映射器)和
RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用
<mvc:annotation-driven /> 替代注解处理器和适配器的配置。
同时使用 <mvc:annotation-driven />认底层就会集成jackson进行对象或集合的json格式字符串的转换 

  1.4 总结

    1) 页面跳转
      直接返回字符串
      通过ModelAndView对象返回
    2) 回写数据
      直接返回字符串
        HttpServletResponse 对象直接写回数据,HttpServletRequest对象带回数据,Model对象带回数据或者
        @ResponseBody将字符串数据写回
      返回对象或集合
        @ResponseBody+ <mvc:annotation-driven/>

二,SpringMVC的请求

  2.1 请求参数的类型

    客户端请求参数的格式是:name=value&name=value……
    服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数
      基本类型参数
      POJO类型参数
      数组类型参数
      集合类型参数

  2.2 常用的请求参数

    2.2.1 获取基本类型参数

    Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型
    转换;
    自动的类型转换是指从String向其他类型的转换,如下实例:

  请求url:

http://localhost:8080/mvc/quick10?name=wallace&age=19

  对应controller 

 @RequestMapping("/quick10")
    @ResponseBody
    public void quickMethod10(String name, int age) throws Exception {
        System.out.println(name); // 通过参数直接获得对应的值
        System.out.println(age);
    }

    2.2.2 获取POJO类型参数

  Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配,将数据封装成对象,需要将传入的参数是该对象如下:

  创建User类:

package com.itcast.domain;

public class User{
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  请求url:

http://localhost:8080/mvc/quick11?name=wallace&age=19

  controller:

@RequestMapping("/quick11")
    @ResponseBody
    public void quickMethod11(User user) throws Exception {
        System.out.println(user); // 参数名和属性名相同,可以直接封装成对象
    }

    2.2.3 获取数组类型参数

  Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。 如下:

  请求url:

http://localhost:8080/mvc/quick12?strs=walalce&strs=11&strs=adsfas

  controller:

    @RequestMapping("/quick12")
    @ResponseBody
    public void quickMethod12(String[] strs) throws Exception {
        System.out.println(strs);
        for (String str : strs) {
            System.out.println(str);
        }
    }

三,常见配置

  3.1 静态资源访问的开启

  当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是
SpringMVC的前端控制器DispatcherServleturl-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以
通过以下两种方式指定放行静态资源:

   方式一:spring-mvc.xml配置文件中指定放行的资源

<mvc:resources mapping="/js/**"location="/js/"/>

  方式二:使用 <mvc:default-servlet-handler/> 标签

<!--开放资源的访问--><mvc:default-servlet-handler/>

  3.2 post请求乱码问题(配置过滤器)

  当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>
</filter>
<filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

  3.3 参数绑定注解问题

  当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定

  如下:post请求的参数名是username

<form action="${pageContext.request.contextPath}/quick14" method="post">
    <input type="text" name="username">
    <input type="text" name="age">
    <input type="submit">
</form>

  controller:通过RequestParam进行指定

   @RequestMapping("/quick14")
    @ResponseBody
    public void quickMethod14(@RequestParam(value = "username", required = false) String user, String age) throws Exception {
        System.out.println(user);
        System.out.println(age);
    }

  3.4 Restful 风格参数

    Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端
  和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
  Restful风格的请求是使用“url+请求方式表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下面:
    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注解进行
占位符的匹配获取工作。
  url:这里是post含义就是提交一个user数据

<form action="${pageContext.request.contextPath}/quick15" method="post">
    <input type="text" name="username">
    <input type="text" name="age">
    <input type="submit">
</form>

  controller:

    @RequestMapping("/quick15/{username}/{age}")
    @ResponseBody
    public void quickMethod15(@PathVariable("username") String user, @PathVariable("age") String age) throws Exception {
        System.out.println(user);
        System.out.println(age);
    }

  3.5 自定义类型转换器

  SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自
定义转换器。 

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements Converter<String, Date> {

    public Date convert(String dateStr) {
        //将日期字符串转换成日期对象 返回
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

  controller:

    @RequestMapping("/quick16")
    @ResponseBody
    public void quickMethod16(Date date) throws Exception {
        System.out.println(date);
    }

四,Spring常见API

  4.1 获取Servlet的API

  SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:
  HttpServletRequest
  HttpServletResponse
  HttpSession

  我们可以直接获得这些对象:

    @RequestMapping("/quick21")
    @ResponseBody
    public void quickMethod21(HttpServletResponse response, HttpServletRequest request, HttpSession session, User user){
        System.out.println(response);
        System.out.println(request);
        System.out.println(session);
        System.out.println(user);
    }

  4.2 获取请求头

  使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
    @RequestHeader注解的属性如下:
    value:请求头的名称
    required:是否必须携带此请求头

   @RequestMapping("/quick17")
    @ResponseBody
    public void quickMethod17(@RequestHeader(value = "User-agent", required = false) String headerValue) throws Exception {
        System.out.println(headerValue);
    }

  4.3 获取cookie

  使用@CookieValue可以获得指定Cookie的值
  @CookieValue注解的属性如下:
    value:指定cookie的名称
    required:是否必须携带此cookie

@RequestMapping("/quick18")
    @ResponseBody
    public void quickMethod17(@CookieValue(value = "JSEEIONID", required = false) String jsessionid) throws Exception {
        System.out.println(jsessionid);
    }

五,文件上传

  5.1 文件上传实现

文件上传需要满足以下条件:
    表单项type="file"
    表单提交方式为post
    表单的enctype属性是多部分表单形式:enctype="multipart/form-data"

  示例:html

<form action="${pageContext.request.contextPath}/quick18" method="post" enctype="multipart/form-data">
    <input type="text" name="name">
    <input type="file" name="uploadFile">
    <input type="submit">
</form>

  controller:

@RequestMapping(value = "/quick18")
    @ResponseBody
    public void quickMethod18(@RequestParam("name") String name, MultipartFile uploadFile) throws Exception {
        System.out.println(name);
        String originalFilename = uploadFile.getOriginalFilename();
        System.out.println(originalFilename);
        uploadFile.transferTo(new File("e:\\upload\\"+originalFilename));
    }
posted @ 2019-12-16 21:22  他山之石·玉  阅读(997)  评论(0编辑  收藏  举报