SpringMvc(二)

简介: 关于SpringMvc相关介绍

③. Srping的数据响应

1>. SpringMVC的数据响应-数据响应方式

1. 页面跳转

(1). 直接返回字符串 (2). 通过ModelAndView对象返回

  • ①. 直接返回字符串

20190924095150529.png

  • ②. 通过ModelAndView对象返回
  @RequestMapping(value="/quick2")
    public ModelAndView save2(){
        ModelAndView modelAndView=new ModelAndView();
        /*
        Model:模型 作用封装数据
        View:视图  作用是展示数据
        */
        //1.向模型对象中添加数据
        modelAndView.addObject("username","xiaozhi");
        //2.设置逻辑视图名
        modelAndView.setViewName("success");
        return modelAndView;
    }
  • ③.在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建,在方法中直接使用该对象设置视图,同样可以跳转页面
  //在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建,
  //在方法中直接使用该对象设置视图,同样可以跳转页面
  @RequestMapping(value="/quick3")
    public ModelAndView save3(ModelAndView modelAndView){
        modelAndView.addObject("username","itheima");
        modelAndView.setViewName("success");
        return modelAndView;
    }
  //model只能作为形参传入,不能直接传入,因为Model是一个接口
  @RequestMapping(value="/quick4")
    public String save4(Model model){
        //1.model向模型对象中添加数据
        model.addAttribute("username","博学谷");
        //2.success用来跳转视图
        return "success";
    }
  • ④.在Controller方法的形参上可以直接使用原生的HttpServeltRequest对象,只需声明即可
//在Controller方法的形参上可以直接使用原生的HttpServeltRequest对象,只需声明即可
@RequestMapping(value="/quick5")
    public String save5(HttpServletRequest request){
        request.setAttribute("username","酷丁鱼");
        return "success";
    }

2. 回写数据

(1). 直接返回字符串 (2). 返回对象或集合

  • ①. 直接返回字符串
  1.通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 
  回写数据,此时不需要视图跳转,业务方法返回值为void
  2.将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,
  方法返回的字符串不是跳转是直接在http响应体中返回
    @RequestMapping(value="/quick7")
    @ResponseBody  //告知SpringMVC框架 不进行视图跳转 直接进行数据响应
    public String save7() throws IOException {
        return "hello itheima";
    }
    @RequestMapping(value="/quick6")
    public void save6(HttpServletResponse response) throws IOException {
        response.getWriter().print("hello itcast");
    }
  • ②. 直接回写json格式字符串(应用)
    @RequestMapping(value="/quick8")
    @ResponseBody
    public String save8() throws IOException {
        return "{\"username\":\"zhangsan\",\"age\":18}";
    }
    手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换
    成json格式的字符串,我们可以使用web阶段学习过的json转换工具jackson进
    行转换,通过jackson转换json格式字符串,回写字符串
    @RequestMapping(value="/quick9")
    @ResponseBody
    public String save9() throws IOException {
        User user = new User();
        user.setUsername("lisi");
        user.setAge(30);
        //使用json的转换工具将对象转换成json格式字符串在返回
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);
        return json;
    }
通过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"/>
            </list>
        </property>
    </bean>
    @RequestMapping(value="/quick10")
    @ResponseBody
    //期望SpringMVC自动将User转换成json格式的字符串
    public User save10() throws IOException {
        User user = new User();
        user.setUsername("lisi2");
        user.setAge(32);
        return user;
    }
   注意:要加上json这些jar包
   <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

20190922150022890.png

④. SpringMVC获取请求数据

  • ①. 基本类型参数 ②.POJO类型参数 ③.数组类型参数 ④. 集合类型参数

1>. 基本类型参数

  • ①. Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型转换;
  • ②. 自动的类型转换是指从String向其他类型的转换
    http://localhost:8080/itheima_springmvc1/quick9?username=zhangsan&age=12
    @RequestMapping(value="/quick11")
    @ResponseBody
    public void save11(String username,int age) throws IOException {
        System.out.println(username);
        System.out.println(age);
    }

2>. 获得POJO类型参数

  • Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配
package com.itheima.domain;
public class User {
    private String username;
    private int age;
    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 +
                '}';
    }
}
    @RequestMapping(value="/quick12")
    @ResponseBody
    public void save12(User user) throws IOException {
        System.out.println(user);
    }

2019092220141270.png

3>. 获取数组参数类型

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

20190922201811596.png

    @RequestMapping(value="/quick13")
    @ResponseBody
    public void save13(String[] strs) throws IOException {
        System.out.println(Arrays.asList(strs));
    }

20190924142147911.png

4>. 集合类型的参数

  • ①. 获得集合参数时,要将集合参数包装到一个POJO中才可以
<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>
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 +
                '}';
    }
}
    @RequestMapping(value="/quick14")
    @ResponseBody
    public void save14(VO vo) throws IOException {
        System.out.println(vo);
    }
  • ②. 当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装
解释:
data:即请求携带的数据
contentType:当请求数据为JSON格式时,值必须为application/json
dataType:当响应数据为Json时,可以定义dataType属性,并且值必须为json。
其中dataType:"json"也可以省略不写,页面会自动识别响应的数据格式
@RequestBody 用在方法的形参上,把请求体中的json数据封装到形参集合上
<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:28});
        $.ajax({
            type:"POST",
            url:"${pageContext.request.contextPath}/user/quick15",
            //JSON.stringify(userList):将参数转为json格式
            data:JSON.stringify(userList),
            contentType:"application/json;charset=utf-8"
        });
    </script>
    @RequestMapping(value="/quick15")
    @ResponseBody
    public void save15(@RequestBody List<User> userList) throws IOException {
        System.out.println(userList);
    }
       var json="{\"username\":\"xiaozhi\",\"age\":23}";
       alert(json);//{"username":"xiaozhi","age":23}
       var obj=JSON.parse(json);
       alert(obj);//[object Object]

20190924164022710.png

5>. 静态资源访问的开启

  • 当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种方式指定放行静态资源:
  • ①. 在spring-mvc.xml配置文件中指定放行的资源
    <mvc:resources mapping="/js/**"location="/js/"/>

  • ②. 使用<mvc:default-servlet-handler/>标签
  • 注意:这两种方式前面都要有<mvc:annotation-driven>
location:用于定位需要访问的本地静态资源文件路径,具体到某个文件夹
mapping:匹配静态资源全路径,其中 "/**" 表示文件夹及其子文件夹下的某个具体文件
    <!--开发资源的访问-->
    <!--
    <mvc:annotation-driven/>
    <mvc:resources mapping="/js/**" location="/js/"/>
    <mvc:resources mapping="/img/**" location="/img/"/>-->
    <mvc:annotation-driven/>
    <mvc:default-servlet-handler/>

6>. 配置全局乱码过滤器(应用)

  • 当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。
    <!--配置全局过滤的filter-->
    <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>

7>. @RequestParam

  • ①. value:与请求参数名称匹配
  • ②. required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
  • ③. defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
当请求的参数名称与Controller的业务方法参数名称不一致时,
就需要通过@RequestParam注解显示的绑定
<form action="${pageContext.request.contextPath}/quick16" method="post">
    <input type="text" name="name"><br>
    <input type="submit" value="提交"><br>
</form>
    //注意:这里的name要和前面表单提交的name要相同
    @RequestMapping(value="/quick16")
    @ResponseBody
    public void save16(@RequestParam(value="name",required = false,
    defaultValue = "itcast") String username) throws IOException {
        System.out.println(username);
    }

8>. 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

20190923193459108.png

    //http://localhost:8080/user/quick4/zhangsan
    @RequestMapping("/quick4/{name}")
    public void save3(@PathVariable(value = "name",required=false)String username){
        System.out.println(username);
    }

9>. 自定义类型转换器(应用)

  • ①. SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置
  • ②. 但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
//1.定义转换器类实现Converter接口
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;
    }
}
    //3.在<mvc:annotation-driven>中引用转换器
    <!--mvc的注解驱动-->
    <mvc:annotation-driven conversion-service="conversionService"/>
    //2.在配置文件中声明转换器
    <!--声明转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.itheima.converter.DateConverter"></bean>
            </list>
        </property>
    </bean>
    @RequestMapping(value="/quick18")
    @ResponseBody
    public void save18(Date date) throws IOException {
        System.out.println(date);
    }

10>. 获得请求参数-获得Servlet相关API(应用)

  • SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:HttpServletRequest、HttpServletResponse、HttpSession
    @RequestMapping(value="/quick19")
    @ResponseBody
    public void save19(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
    }

11>. 获得请求头信息(应用)

1. @RequestHeader注解的属性如下:

  • value:请求头的名称
  • required:是否必须携带此请求头
    @RequestMapping(value="/quick20")
    @ResponseBody
    //这里的User-Agent要和浏览器的这个头一样
    //http://localhost:8080/user/quick20
    public void save20(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
        //Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
        System.out.println(user_agent);
    }

2. @CookieValue注解的属性如下:

  • value:指定cookie的名称
  • required:是否必须携带此cookie
    @RequestMapping(value="/quick21")
    @ResponseBody
    public void save21(@CookieValue(value = "JSESSIONID") String jsessionId) throws IOException {
        //66F5B6AEC641A2F2A6BA669D5E1A9097
        System.out.println(jsessionId);
    }


相关文章
|
1天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
18 4
|
19天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
59 2
|
2月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
60 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
171 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查