SpringMvc入门

2021-11-15 11:52:13 浏览数 (1)

SpringMvc入门

  • 概述
    • Spring的mvc实现思想
    • POJO
  • SpringMVC思想是一个前段控制器能拦截所有请求,并智能派发
  • 这个前段控制器是一个servlet,应该在web.xml中配置这个servlet来拦截所有请求
  • 快速入门
    • 1.导入相关坐标
      • SpringMvc是SpringWeb模块,所有模块的运行都是依赖于核心模块(IOC模块)
      • 核心模块相关坐标
      • SpringWeb模块相关坐标
      • aop模块相关坐标
    • 2.配置springmvc的前段控制器---web.xml
    • 3.配置SpringMvc.xml----组件扫描(注解配置)
    • 5.在web.xml中配置监听器,通过监听器的初始化方法,来加载applicationContext.xml配置文件
    • 7.userController类
    • 8.success.jsp
    • 9.index.jsp
    • 10.配置视图解析器,帮助我们拼接页面地址
  • 运行流程分析
  • @RequestMapping分析
  • 如果不在web.xml中指定配置文件位置的解决办法
  • url-pattern的配置
  • 使用@RequestMapping映射请求
    • 一个方法处理一个请求,不能两个方法处理一个请求,不然报错
    • 类上加上注解,访问时的路径需要多加一层
    • @RequestMapping注解的相关属性
      • method限定请求方式
      • params规定请求参数
        • 建议看下面的这篇链接文章
      • headers规定请求头
      • consumes:只接收内容类型是哪种的请求,规定请求头中的content-type
      • produces:告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;char
      • ant风格的URL----URL地址可以写模糊的通配符
    • 模糊和精确多个匹配情况下,精确优先
    • 路径上可以有占位符,占位符语法就是在任意路径的地方上写一个{变量名}
    • 路径上的占位符只能占掉一层路径
    • 获取路径上的占位符-----@PathVariable()
      • 获取路径上的多层占位符
  • REST风格的URL地址约束
  • Rest风格增删改查搭建
    • 从页面发起PUT和DELETE形式的请求,Spring提供了对REST风格的支持
      • SpringMVC中有一个Filter,他可以把普通的请求转化为规定形式的请求
        • 在web.xml中配置这个filter
        • 发送其他形式的请求
          • 1.创建一个post表单
          • 2.在表单中携带一个_method的参数
          • 3.这个_method的值,就是DELETE,PUT
        • 高版本tomcat,REST支持有点问题
  • 获取请求参数
    • 默认方式获取请求参数
    • 通过@RequestParam注解获取请求参数
    • 参数默认是必须带的
      • @RequestParam注解里面的参数
        • key:指定要获取的参数的key
        • required:这个参数是否必须的
        • defaultValue:默认值,没带默认是null
      • 获取请求头的信息
      • 如果请求头中没有这个信息会报错
      • value,required,defaultvalue三个属性与@RequestParam注解里面的参数用法一致
      • @CookieValue获取请求中带来的某个Cookie值
      • @CookieValue注解中三个属性: value,defaultValue,required
    • 传入POJO,SpringMVC自动封装---POJO:自定义对象
      • 如果我们的请求参数是一个POJO,SpringMVC会帮我们自动赋值,将POJO中的每一个属性,从Request参数中尝试获取出来,并封装即可
      • 要封装类的无参构造和set,get方法不能少,并且变量名要和请求参数里面的名字相同
    • POJO的级联封装,封装POJO成员变量里面的自定义类型
    • 传入原生API
      • 使用前先导入servlet的相关依赖
      • springmvc中支持的相关原生API
    • 请求到的数据出现中文乱码的问题
      • 以前的解决方式
      • 解决方法:配置一个字符编码的filter----Spring提供,只能解决POST请求乱码,以及响应乱码,GET方式的请求乱码解决看下一条
      • 使用SpringMVC前端控制器写完就直接写字符编码的Filter,tomcat一装上,上手就是server.xml的8080处添加URIEncoding="UTF-8",用于解决GET方式请求乱码问题
      • IDEA里面无法直接改server.xml的配置,需要去tomcat文件夹下的conf目录下找到server.xml进行修改
      • springMVC字符编码Filter无效问题解决
      • 字符编码的filter一般都在其他filter之前

概述

Spring的mvc实现思想

POJO

简单的Java对象(Plain Ordinary Java Objects)实际就是普通JavaBeans


SpringMVC思想是一个前段控制器能拦截所有请求,并智能派发

这个前段控制器是一个servlet,应该在web.xml中配置这个servlet来拦截所有请求

快速入门

1.导入相关坐标

SpringMvc是SpringWeb模块,所有模块的运行都是依赖于核心模块(IOC模块)

核心模块相关坐标

spring坐标:

代码语言:javascript复制
<!--导入spring的坐标-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>

SpringWeb模块相关坐标

spring-web坐标:

代码语言:javascript复制
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

spring-webmvc坐标:

代码语言:javascript复制
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.15.RELEASE</version>
    </dependency>

aop模块相关坐标

代码语言:javascript复制
    <!--导入aspectj的坐标-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.4</version>
    </dependency>

2.配置springmvc的前段控制器—web.xml

代码语言:javascript复制
<!--SpringMVC相关配置-->

  <!--配置springmcv的前段控制器-->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--SpringMvc.xml是前段控制器需要使用-->
    <!--sevlet的初始化参数-->
   <!--contextConfigLocation:指定SpringMVC配置文件的位置-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:SpringMVC.xml</param-value>
    </init-param>
    <!--默认第一次访问时创建对象,这里填入1,表示服务器启动时创建镀锡-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <!--
    /和/*都是拦截所有请求,但是/*的范围更大,还会拦截到*.jsp这些请求
    一旦拦截jsp页面就不会显示了
    /会拦截所有请求,但是不会拦截*.jsp,能保证jsp访问正常
    -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

3.配置SpringMvc.xml----组件扫描(注解配置)

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--context的组件扫描,需要引入context命名空间-->
    <!--组件扫描-->
    <context:component-scan base-package="com.SpringMvc"/>
</beans>

5.在web.xml中配置监听器,通过监听器的初始化方法,来加载applicationContext.xml配置文件

代码语言:javascript复制
     <!--全局初始化参数-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--配置监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

7.userController类

代码语言:javascript复制
/*
* 1.告诉SpringMvc这是一个处理器,可以处理请求
* @Controller:标识哪个组件是控制器,能够区分其他组件,这个注解不能乱加
* */
@Controller
public class userController {
    /*
    * /代表从当前项目开始
    * 处理当前项目下的hello请求
    * 请求映射
    * */
    @RequestMapping("/hello")
    public String show()
    {
        System.out.println("收到请求");
        return "Success.jsp";
    }

}

8.success.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
<h1>Success!!!</h1>
</body>
</html>

9.index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>
<h1>小朋友</h1>
<br>
<a href="hello">点击跳转页面</a>
</body>
</html>

10.配置视图解析器,帮助我们拼接页面地址

springmvc.xml:

代码语言:javascript复制
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/><!--前缀-->
        <property name="suffix" value=".jsp"/><!--后缀-->
    </bean>
代码语言:javascript复制
/*
* 1.告诉SpringMvc这是一个处理器,可以处理请求
* @Controller:标识哪个组件是控制器
* */
@Controller
public class userController {
    /*
    * /代表从当前项目开始
    * 处理当前项目下的hello请求
    * 请求映射
    * */
    @RequestMapping("/hello")
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

地址栏没变,说明这是一次转发操作


运行流程分析

1.客户端点击链接发送http://localhost:8080/springmvc/hello 请求 2.来到tomcat服务器 3.springmvc的前段控制器收到所有请求 4.查看请求地址和@RequestMapping标注的哪一个匹配,来找到到底使用哪个类的哪个方法来处理 5.前段控制器找到了目标处理器和目标方法,直接利用反射执行目标方法 6.方法执行完成以后,会有一个返回值,springmvc认为这个返回值就是要去的页面地址 7.拿到方法返回值以后,用视图解析器进行拼串得到完整的页面地址 8.拿到页面地址,前段控制器帮我妈转发到页面


@RequestMapping分析

作用:就是告诉SpringMvc这个方法用来处理什么请求

这里@RequestMapping("/hello")里面的/可以省略,即使省略了,也是默认从当前项目下开始,最好加上


如果不在web.xml中指定配置文件位置的解决办法


url-pattern的配置

代码语言:javascript复制
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <!--
    /和/*都是拦截所有请求,但是/*的范围更大,还会拦截到*.jsp这些请求
    一旦拦截jsp页面就不会显示了
    /会拦截所有请求,但是不会拦截*.jsp,能保证jsp访问正常
    处理*.jsp是tomcat做的事情

DefaultServlet是tomcat中处理静态资源的
除了jsp和servlet外,剩下的都是静态资源
index.html:静态资源,tomcat会在服务器下找到这个资源并返回
我们前端控制器的/禁用了tomcat服务器中的DefaultServlet(相当于子类重写了父类的配置,那么就会隐藏父类的配置)
    1.服务器的大Web.xml中有一个DefaultServlet的url-pattern=/
    2.我们配置的前端控制器url-pattern=/
    静态资源会来到DefaultServlet(前端控制器)来看哪个方法的RequestMapping是这个index.html
    3.我们没有覆盖服务器中的JspServlet的配置
    4./*直接就是拦截所有请求,我们写/是为了迎合后来的Rest风格的URL地址
    -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

使用@RequestMapping映射请求

一个方法处理一个请求,不能两个方法处理一个请求,不然报错

类上加上注解,访问时的路径需要多加一层

代码语言:javascript复制
/*
* 为当前类的所有的方法的请求地址指定了一个基准路径
* */
@Controller
@RequestMapping("/haha")
public class userController {
    /*
    * /代表从当前项目开始
    * 处理当前项目下的hello请求
    * 请求映射
    * */
    @RequestMapping("/hello")
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }

}

@RequestMapping注解的相关属性

method限定请求方式

代码语言:javascript复制
@Controller
public class userController {
    /*
    * /代表从当前项目开始
    * 处理当前项目下的hello请求
    * 请求映射
    * */
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }

}

params规定请求参数

建议看下面的这篇链接文章

@RequestMapping中的params(请求参数映射限定)


headers规定请求头

@RequestMapping中的headers(请求头数据映射限定)

代码语言:javascript复制
/*
* 为当前类的所有的方法的请求地址指定了一个基准路径
* */
@Controller
public class userController {
 /*
 * user-agent: 浏览器信息
 * 实现让谷歌不能访问,火狐能访问
 * */
    @RequestMapping(value = "/hello",headers =
            {"User-Agent=User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"})
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }

}

consumes:只接收内容类型是哪种的请求,规定请求头中的content-type

produces:告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;char

@RequestMapping中的consumes属性和produces属性


ant风格的URL----URL地址可以写模糊的通配符

*号优先级比?号低

模糊和精确多个匹配情况下,精确优先


?代替一个字符:

代码语言:javascript复制
/*
* 为当前类的所有的方法的请求地址指定了一个基准路径
* */
@Controller
public class userController {
    @RequestMapping("/antTest0?")
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

*号匹配任意多个字符

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/antTest0*")
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

*号代替一层路径,只能代替一层路径

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/*/antTest01")
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

只能代替一层路径


**代替多层路径

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/**/antTest01")
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

路径上可以有占位符,占位符语法就是在任意路径的地方上写一个{变量名}

路径上的占位符只能占掉一层路径

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/antTest01/{id}")
    public String show()
    {
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

获取路径上的占位符-----@PathVariable()

获取路径中的参数值——@PathVariable中的value

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/antTest01/{id}")
    public String show(@PathVariable("id")String id)
    {
        System.out.println("路径上的占位符的值:" id);
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

获取路径上的多层占位符

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/ant/{id1}/{id2}")
    public String show(@PathVariable("id1")String id1,@PathVariable("id2")String id2)
    {
        System.out.println("路径上的占位符的值1:" id1);
        System.out.println("路径上的占位符值2:" id2);
        System.out.println("收到请求");
        //视图解析器自动拼串
        //前缀 返回值 后缀
        return "Success";
    }
}

REST风格的URL地址约束


Rest风格增删改查搭建

环境搭建:

BookController类:

代码语言:javascript复制
@Controller
public class BookController {
    /*处理查询图书的请求*/
@RequestMapping(value = "/book/{bid}",method = RequestMethod.GET)
public String getBook(@PathVariable("bid") Integer id)
{
    System.out.println("查询到了" id "号图书");
    return "Success";
}
/*添加图书*/
    @RequestMapping(value = "/book",method = RequestMethod.POST)
    public String addBook()
    {
        System.out.println("添加了图书");
        return "Success";
    }
    /*删除图书*/
    @RequestMapping(value = "/book/{bid}",method = RequestMethod.DELETE)
    public String deleteBook(@PathVariable("bid") Integer id)
    {
        System.out.println("删除了" id "号图书");
        return "Success";
    }
    /*删除图书*/
    @RequestMapping(value = "/book/{bid}",method = RequestMethod.PUT)
    public String updateBook(@PathVariable("bid") Integer id)
    {
        System.out.println("更新了" id "号图书");
        return "Success";
    }
}

index.jsp:

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>
<%--发起图书的增删改查请求,使用Rest风格的URL地址
请求URL   请求方式   表示含义
/book/1   GET      查询1号图书
/book/1   DELETE   删除1号图书
/book/1   PUT      更新1号图书
/book   POST     添加1号图书
--%>
<a href="book/1">查询图书</a><%--默认都是GET请求--%>
<br/>
<form action="book" method="post">
    <input type="submit" value="添加1号图书">
</form>
<br/>
<form action="book/1"  >
    <input type="submit" value="删除1号图书">
</form>
<br>
<form action="book/1">
    <input type="submit" value="更新1号图书">
</form>
</body>
</html>

从页面发起PUT和DELETE形式的请求,Spring提供了对REST风格的支持

SpringMVC中有一个Filter,他可以把普通的请求转化为规定形式的请求

在web.xml中配置这个filter
代码语言:javascript复制
<!--支持REST风格的filter-->
  <filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <!--拦截所有请求-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
发送其他形式的请求
1.创建一个post表单
2.在表单中携带一个_method的参数
3.这个_method的值,就是DELETE,PUT
代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>
<%--发起图书的增删改查请求,使用Rest风格的URL地址
请求URL   请求方式   表示含义
/book/1   GET      查询1号图书
/book/1   DELETE   删除1号图书
/book/1   PUT      更新1号图书
/book   POST     添加1号图书
--%>
<form action="book/1" method="get">
    <input type="submit" value="查询1号图书">
</form>
<br/>
<form action="book" method="post">
    <input type="submit" value="添加1号图书">
</form>
<br/>
<%--发送delete请求--%>
<form action="book/1" method="post" >
    <input name="_method" value="delete">
    <input type="submit" value="删除1号图书">
</form>
<br>
<%--发送put请求--%>
<form action="book/1" method="post" >
    <input name="_method" value="put">
    <input type="submit" value="更新1号图书">
</form>
</body>

高版本tomcat,REST支持有点问题

折中解决法: 在要跳转到的页面success,jsp中添加:

代码语言:javascript复制
isErrorPage="true"

这样发生异常时也会跳转到该页面

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
<h1>Success!!!</h1>
</body>
</html>

获取请求参数

默认方式获取请求参数

直接给方法入参上写一个和请求参数名相同的变量. 这个变量就来接收请求参数的值

带参数有值,没带参数就没值,为null

index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>

<form action="hello" method="get">
    <input type="text" name="username" value="大忽悠">
    <br/>
    <input type="submit" value="提交">
</form>

</body>
</html>

userController类:

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(String username)
    {
        System.out.println("用户名为:" username);
        return "Success";
    }
}

通过@RequestParam注解获取请求参数

参数默认是必须带的

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(@RequestParam("username")String name)
    {
        System.out.println("用户名为:" name);
        return "Success";
    }
}

@RequestParam注解里面的参数

key:指定要获取的参数的key
required:这个参数是否必须的
defaultValue:默认值,没带默认是null
代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(@RequestParam(value = "username",required = false,defaultValue = "小朋友")String name)
    {
        System.out.println("用户名为:" name);
        return "Success";
    }
}

获取请求头的信息

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(@RequestParam(value = "username",required = false,defaultValue = "小朋友")String name
    , @RequestHeader("User-Agent")String userAgent)
    {
        System.out.println("用户名为:" name);
        System.out.println("请求头中浏览器的信息:" userAgent);
        return "Success";
    }
}

如果请求头中没有这个信息会报错

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(@RequestHeader("hhht")String userAgent)
    {
        System.out.println("请求头中浏览器的信息:" userAgent);
        return "Success";
    }
}

value,required,defaultvalue三个属性与@RequestParam注解里面的参数用法一致

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(@RequestHeader(value = "user-agent",required = false,defaultValue = "fireFox")String userAgent)
    {
        System.out.println("请求头中浏览器的信息:" userAgent);
        return "Success";
    }
}

@CookieValue获取请求中带来的某个Cookie值

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(@CookieValue("JSESSIONID")String cookie){
        System.out.println("JSESSIONID:" cookie);
        return "Success";
    }
}

@CookieValue注解中三个属性: value,defaultValue,required

代码语言:javascript复制
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(@CookieValue(value = "JSESSIONID",required = false,defaultValue = "haha")String cookie){
        System.out.println("JSESSIONID:" cookie);
        return "Success";
    }
}

传入POJO,SpringMVC自动封装—POJO:自定义对象

Book类:

代码语言:javascript复制
public class Book {
    /*无参构造不能少*/
    private String name;
    private  Integer price;

    public String getName() {
        return name;
    }

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

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{"  
                "name='"   name   '''  
                ", price="   price  
                '}';
    }
}

index.jsp:

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>

<form action="book" method="post">
书名:<input type="text" name="name"/><br>
    价格:<input type="text" name="price"/><br>
    <input type="submit" value="提交">
</form>

</body>
</html>

BookController类:

代码语言:javascript复制
@Controller
public class BookController {

     @RequestMapping("/book")
    public String ShowBook(Book book)
    {
        System.out.println(book);
        return "Success";
    }
}

如果我们的请求参数是一个POJO,SpringMVC会帮我们自动赋值,将POJO中的每一个属性,从Request参数中尝试获取出来,并封装即可

要封装类的无参构造和set,get方法不能少,并且变量名要和请求参数里面的名字相同

POJO的级联封装,封装POJO成员变量里面的自定义类型

Book类:

代码语言:javascript复制
public class Book {
    /*无参构造不能少*/
    private String name;
    private  Integer price;
       private  Author author;

    public Author getAuthor() {
        return author;
    }

    public void setAuthor(Author author) {
        this.author = author;
    }

    public String getName() {
        return name;
    }

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

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{"  
                "name='"   name   '''  
                ", price="   price  
                ", author="   author  
                '}';
    }
}

author类:

代码语言:javascript复制
public class Author {
   private String name;
    private  int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

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

index,jsp:

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>

<form action="book" method="post">
书名:<input type="text" name="name"/><br>
    价格:<input type="text" name="price"/><br>
    作者名字:<input type="text" name="author.name"/><br>
    作者年龄:<input type="text" name="author.age"/><br>
    <input type="submit" value="提交">
</form>

</body>
</html>

传入原生API

使用前先导入servlet的相关依赖

代码语言:javascript复制
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>

springmvc中支持的相关原生API

BookController类:

代码语言:javascript复制
@Controller
public class BookController {

     @RequestMapping("/book")
    public String ShowBook(HttpServletRequest servletRequest, HttpSession httpSession)
    {
        servletRequest.setAttribute("Request","大忽悠");
        httpSession.setAttribute("Session","小朋友");
        return "Success";
    }
}

success.jsp:

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
<h1>Success!!!</h1>
Request:${requestScope.Request}
Session:${sessionScope.Session}
</body>
</html>

请求到的数据出现中文乱码的问题

以前的解决方式

解决方法:配置一个字符编码的filter----Spring提供,只能解决POST请求乱码,以及响应乱码,GET方式的请求乱码解决看下一条

web.xml中

代码语言:javascript复制
  <!--配置一个字符编码的Filter-->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--初始化参数-->
    <!--encoding:指定解决POST请求的乱码-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <!--forceEncoding:顺手解决响应乱码
    response.setCharacterEncoding(this.encoding)-->
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

使用SpringMVC前端控制器写完就直接写字符编码的Filter,tomcat一装上,上手就是server.xml的8080处添加URIEncoding=“UTF-8”,用于解决GET方式请求乱码问题

IDEA里面无法直接改server.xml的配置,需要去tomcat文件夹下的conf目录下找到server.xml进行修改

springMVC字符编码Filter无效问题解决

springMVC字符编码Filter无效

POST方式:

GET方式:

字符编码的filter一般都在其他filter之前


0 人点赞