Spring SpringMVC的请求和响应

一,SpringMVC的数据响应

  1.1 数据响应方式

  1.2 页面跳转

    1.2.1 返回字符串数据

    1.2.2 返回ModelAndView

  1.3 回写数据

    1.3.1 直接回写字符串

    1.3.2 会写json格式字符串

    1.3.3 返回对象和集合

  1.4 总结

二,SpringMVC的请求

  2.1 请求参数的类型

  2.2 常用的请求参数

    2.2.1 获取基本类型参数

    2.2.2 获取POJO类型参数

    2.2.3 获取数组类型参数

    2.2.4 获取集合类型参数

三,常见配置

  3.1 静态资源访问的开启

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

  3.3 参数绑定注解问题

  3.4 Restful 风格参数

  3.5 自定义类型转换器

四,Spring常见API

  4.1 获取Servlet的API

  4.2 获取请求头

  4.3 获取cookie

五,文件上传

  5.1 文件上传实现

一,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的前端控制器DispatcherServlet的url-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));
    }

原文地址:https://www.cnblogs.com/tashanzhishi/p/12051437.html

时间: 2024-07-29 14:18:03

Spring SpringMVC的请求和响应的相关文章

Java学习路线分享SpringMVC之请求和响应

Java学习路线分享SpringMVC之请求和响应,前面我们学习了SpringMVC的基本配置,接下来一个非常重要的知识点是如何接受用户的请求以及如何将数据发送给用户. 获得请求参数 获得页面参数的几种方式 1)通过参数名获得 给控制器的方法设置参数名和表单name相同 2)通过@RequestParam("参数名")注解设置参数 @RequestParam("表单元素的name") 参数类型 参数名 3)自动装箱,创建属性名和表单名称一样的类 把类作为方法的参数

springMvc REST 请求和响应

前言: 突然怎么也想不起来  springMvc REST 请求的返回  类型了!   (尴尬+究竟)  然后本着 方便的想法 百度了一下 发现了个问题,大家在写      springMvc REST 的文档 和记录或者笔记的时候 . 只写到了 符合 REST 风格的 请求 ,而 响应信息 完全是 传统的 主体数据传递 .然而这并非 REST响应的 风格啊 !!!! 下面把自己整理的笔记发上来 关于MVC REST 请求的方式 格式1 @RequestMapping(value = "{ite

Spring注解处理Ajax请求-JSON格式[系统架构:Spring+SpringMVC+MyBatis+MySql]

这是自己曾写的一个系统(养老保险管理)中的一个小片段,今天突然想到把请求数据改成json,该如何处理.(Spring+SpringMVC+MyBatis+MySql)如下 1.前端jsp页面 <div class="tab_tip"> 请输入[身份证号或姓名] <input type="text" class="tab_getText" id="tab1_getText"> <input type

Spring Boot使用AOP在控制台打印请求、响应信息

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等. AOP简介 AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果.其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足. 通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将

SpringMVC框架(2)--请求与响应

01-SpringMVC的数据响应-数据响应方式(理解) 1) 页面跳转 直接返回字符串 通过ModelAndView对象返回 2) 回写数据 直接返回字符串 返回对象或集合 02-SpringMVC的数据响应-页面跳转-返回字符串形式(应用) 03-SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用) 在Controller中方法返回ModelAndView对象,并且设置视图名称 @RequestMapping(value="/quick2") publ

基于Spring+SpringMVC+Mybatis的Web系统搭建

主要的后端架构:Spring+SpringMVC+Mybatis+Shiro+Maven  IDE:IntelliJ IDEA 15.0.2 jdk:1.8.0_66 系统完整源码 https://github.com/Wellat/Factor 系统目录结构 跑起来效果 搭建步骤 1.用Idea创建maven项目 2.配置pom.xml文件,添加依赖 1 <?xml version="1.0" encoding="UTF-8"?> 2 <proj

dubbo+zookeeper+spring+springMVC+mybatis的使用

读前声明:由于本人水平有限,有错误或者描述不恰当的地方请指出来,勿喷!第一次写博客. 源码下载链接:http://files.cnblogs.com/files/la-tiao-jun-blog/dubbo%E4%BE%8B%E5%AD%90.rar 使用条件: eclipse-jee-luna-SR2-win32-x86_64 jdk1.7,Apache Tomcat v8.0,maven zookeeper3.4.6 dubbo-2.4.10 dubbo-monitor-simple-2.5

Spring MVC基础知识整理?Spring+SpringMVC+Hibernate整合操作数据库

概述 Hibernate是一款优秀的ORM框架,能够连接并操作数据库,包括保存和修改数据.Spring MVC是Java的web框架,能够将Hibernate集成进去,完成数据的CRUD.Hibernate使用方便,配置响应的XML文件即可.由于spring3.x,基于asm的某些特征,而这些asm还没有用jdk8编译,所以采用Spring 3+JDK8就会报错,提示错误信息( java.lang.IllegalArgumentException),具体解决方案有:1.Spring 3+JDK7

Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十)--MyBatis逆向工程 1.什么SpringMVC Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一个模块.SpringMVC和Spring无需通过中间整合层进行整合. SpringMVC是一个基于mvc的web框架. 2.mvc在b/s系统下的应用 (1)用户发