栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

第一章 基本的请求和响应(SpringMVC)

Java 更新时间:发布时间: 百科书网 趣学号
SpringMVC教程目录

[第一章 基本的请求和响应]

[第二章 其他基础功能]

[第三章 RESTFul风格交互方式]

[第四章 特定功能单元]

[第五章 SpringMVC运行原理](

第一章 基本的请求和响应(SpringMVC)

[第一节 概述]

[第二节 HelloWorld]

[第三节 @RequestMapping注解]

[第四节 获取请求参数]

[第五节 @RequestHeader注解]

[第六节 @CookieValue注解]

[第七节 页面跳转控制]

文章目录
  • SpringMVC教程目录
  • 第一章 基本的请求和响应(SpringMVC)
  • 第一节 概述
    • 1、SpringMVC 优势
    • 2、表述层框架要解决的基本问题
    • 3、SpringMVC 代码对比
      • ①基于原生 Servlet API 开发代码片段
      • ②基于 SpringMVC 开发代码片段
  • 第二节 HelloWorld
    • 1、功能需求
      • ①访问首页
      • ②在首页点超链接
    • 2、搭建环境
      • ①导入依赖
      • ②日志配置文件
      • ③web.xml
      • ④Spring配置文件
    • 3、代码实现
      • ①创建请求处理器类
        • [1]名称
        • [2]创建
      • ②实现访问首页
        • [1]创建 handler 方法
        • [2]在首页编写超链接
      • ③实现点击超链接
        • [1]加入日志记录仪
        • [2]声明 handler 方法
        • [3]创建目标页面
      • ④整体流程解析
  • 第三节 @RequestMapping注解
    • 1、匹配方式说明
      • ①精确匹配
      • ②模糊匹配
    • 2、在类级别标记
      • ①超链接的HTML标签
      • ②仅标记在方法上的@RequestMapping注解
      • ③分别标记在类和方法上的@RequestMapping注解
    • 3、附加请求方式要求
      • ①请求方式
      • ②@RequestMapping附加请求方式
        • [1]HTML代码
        • [2]handler方法
      • ③进阶版
    • 4、Ambiguous mapping异常
  • 第四节 获取请求参数
    • 1、一名一值
      • ①超链接
      • ②@RequestParam注解
        • [1]最基本的用法
        • [2]@RequestParam注解省略的情况
        • [3]必须的参数没有提供
        • [4]关闭请求参数必需
        • [5]给请求参数设置默认值
    • 2、一名多值
      • ①表单
      • ②handler方法
    • 3、表单对应模型
      • ①表单
      • ②实体类
      • ③handler方法
      • ④POST请求的字符乱码问题
    • 4、表单对应实体类包含级联属性
      • ①实体类
      • ②表单
      • ③handler方法
    • 5、要发送的数据是 List
      • ①额外封装一层
      • ②表单
      • ③handler方法
  • 第五节 @RequestHeader注解
    • 1、作用
    • 2、用法
  • 第六节 @CookieValue注解
    • 1、作用
    • 2、用法
  • 第七节 页面跳转控制
    • 1、准备工作
      • ①创建范围之外的页面
      • ②在 SpringMVC 配置文件加入配置
    • 2、使用指令
      • ①转发指令
      • ②重定向指令
      • ②在 SpringMVC 配置文件加入配置
    • 2、使用指令
      • ①转发指令
      • ②重定向指令

第一节 概述 1、SpringMVC 优势

SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案。之所以能做到这一点,是因为 SpringMVC 具备如下显著优势:

  • Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
  • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
  • 代码清新简洁,大幅度提升开发效率
  • 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
  • 性能卓著,尤其适合现代大型、超大型互联网项目要求
2、表述层框架要解决的基本问题
  • 请求映射
  • 数据输入
  • 视图界面
  • 请求分发
  • 表单回显
  • 会话控制
  • 过滤拦截
  • 异步交互
  • 文件上传
  • 文件下载
  • 数据校验
  • 类型转换
3、SpringMVC 代码对比 ①基于原生 Servlet API 开发代码片段
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
    
    String userName = request.getParameter("userName");
    
    System.out.println("userName="+userName);
    
}
②基于 SpringMVC 开发代码片段
@RequestMapping("/user/login")
public String login(@RequestParam("userName") String userName){
    
    System.out.println("userName="+userName);
    
    return "result";
}
第二节 HelloWorld 1、功能需求 ①访问首页

②在首页点超链接

2、搭建环境 ①导入依赖

    
    
        org.springframework
        spring-webmvc
        5.3.1
    
    
    
    
        ch.qos.logback
        logback-classic
        1.2.3
    
    
    
    
        javax.servlet
        javax.servlet-api
        3.1.0
        provided
    
    
    
    
        org.thymeleaf
        thymeleaf-spring5
        3.0.12.RELEASE
    

由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠传递性导入。

②日志配置文件

logback.xml



    
    
        
            
            
            [%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n
        
    
    
    
    
    
        
        
    
    
    
    
    

③web.xml


    DispatcherServlet
    
    
    org.springframework.web.servlet.DispatcherServlet
    
    
    
    
        
        contextConfigLocation
    
        
        classpath:spring-mvc.xml
    
    
    
    
    1
    

    

    DispatcherServlet
    
    
    
    
    for (String team : teamList) {
        logger.debug("team = " + team);
    }
    
    return "target";
}
3、表单对应模型 ①表单
姓名:
年龄:
工资:
②实体类
public class Employee {
    
    private Integer empId;
    private String empName;
    private int empAge;
    private double empSalary;
    ……
③handler方法
@RequestMapping("/param/form/to/entity")
public String formToEntity(
    
        // SpringMVC 会自动调用实体类中的 setXxx() 注入请求参数
        Employee employee) {
    
    logger.debug(employee.toString());
    
    return "target";
}
④POST请求的字符乱码问题

到 web.xml 中配置 CharacterEncodingFilter 即可:



    CharacterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
    
    
        encoding
        UTF-8
    
    
    
    
        forceRequestEncoding
        true
    
        
    
    
        forceResponseEncoding
        true
    


    CharacterEncodingFilter
    /*

注1:在较低版本的 SpringMVC 中,forceRequestEncoding 属性、forceResponseEncoding 属性没有分开,它们是一个 forceEncoding 属性。这里需要注意一下。

注2:由于 CharacterEncodingFilter 是通过 request.setCharacterEncoding(encoding); 来设置请求字符集,所以在此操作前不能有任何的 request.getParameter() 操作。在设置字符集之前获取过请求参数,那么设置字符集的操作将无效。

4、表单对应实体类包含级联属性 ①实体类
public class Student {
    
    private String stuName;
    private School school;
    private List subjectList;
    private Subject[] subjectArray;
    private Set teacherSet;
    private Map scores;
    
    public Student() {
        //在各种常用数据类型中,只有Set类型需要提前初始化
        //并且要按照表单将要提交的对象数量进行初始化
        //Set类型使用非常不便,要尽可能避免使用Set
        teacherSet = new HashSet<>();
        teacherSet.add(new Teacher());
        teacherSet.add(new Teacher());
        teacherSet.add(new Teacher());
        teacherSet.add(new Teacher());
        teacherSet.add(new Teacher());
    }
    ……

其他实体类点这里

②表单

表单项中的 name 属性值必须严格按照级联对象的属性来设定:


stuName:
school.schoolName:
subjectList[0].subjectName:
subjectList[1].subjectName:
subjectList[2].subjectName:
subjectList[3].subjectName:
subjectList[4].subjectName:
subjectArray[0].subjectName:
subjectArray[1].subjectName:
subjectArray[2].subjectName:
subjectArray[3].subjectName:
subjectArray[4].subjectName:
tearcherSet[0].teacherName:
tearcherSet[1].teacherName:
tearcherSet[2].teacherName:
tearcherSet[3].teacherName:
tearcherSet[4].teacherName:
scores['Chinese']:input type="text" name="scores['Chinese']" value="100"/>
scores['English']:
scores['Mathematics']:
scores['Chemistry']:
scores['Biology']:
③handler方法
@RequestMapping("/param/form/to/nested/entity")
public String formToNestedEntity(
    
        // SpringMVC 自己懂得注入级联属性,只要属性名和对应的getXxx()、setXxx()匹配即可
        Student student) {
    
    logger.debug(student.toString());
    
    return "target";
}
5、要发送的数据是 List ①额外封装一层
public class EmployeeParam {
    
    private List employeeList;
    ……

②表单
直接发送 List<Employee">>:
1号员工姓名:
1号员工年龄:
1号员工工资:
2号员工姓名:
2号员工年龄:
2号员工工资:
③handler方法
@RequestMapping("/param/list/emp")
public String saveEmpList(
        // SpringMVC 访问这里实体类的setEmployeeList()方法注入数据
        EmployeeParam employeeParam
) {
    
    List employeeList = employeeParam.getEmployeeList();
    
    for (Employee employee : employeeList) {
        logger.debug(employee.toString());
    }
    
    return "target";
}

第五节 @RequestHeader注解 1、作用

通过这个注解获取请求消息头中的具体数据。

2、用法
@RequestMapping("/request/header")
public String getRequestHeader(
    
        // 使用 @RequestHeader 注解获取请求消息头信息
        // name 或 value 属性:指定请求消息头名称
        // defaultValue 属性:设置默认值
        @RequestHeader(name = "Accept", defaultValue = "missing") String accept
) {
    
    logger.debug("accept = " +accept);
    
    return "target";
}
第六节 @CookieValue注解 1、作用

获取当前请求中的 Cookie 数据。

2、用法
@RequestMapping("/request/cookie")
public String getCookie(
    
        // 使用 @CookieValue 注解获取指定名称的 Cookie 数据
        // name 或 value 属性:指定Cookie 名称
        // defaultValue 属性:设置默认值
        @CookieValue(value = "JSESSIONID", defaultValue = "missing") String cookieValue,
    
        // 形参位置声明 HttpSession 类型的参数即可获取 HttpSession 对象
        HttpSession session
) {
    
    logger.debug("cookieValue = " + cookieValue);
    
    return "target";
}
第七节 页面跳转控制 1、准备工作
  • 准备一个地址在前后缀范围之外的页面
  • 让这个页面能够成功访问
①创建范围之外的页面


    
    

范围之外页面

②在 SpringMVC 配置文件加入配置

下面配置是访问静态资源所需配置,后面会专门说,现在先直接拿来用:

    
    
2、使用指令 ①转发指令
@RequestMapping("/test/forward/command")
public String forwardCommand() {
    
    // 需求:要转发前往的目标地址不在视图前缀指定的范围内,
    // 通过返回逻辑视图、拼接前缀后缀得到的物理视图无法达到目标地址
    
    // 转发到指定的地址:
    return "forward:/outter.html";
}
②重定向指令
@RequestMapping("/test/redirect/command")
public String redirectCommand() {
    
    // 重定向到指定的地址:
    // 这个地址由 SpringMVC 框架负责在前面附加 contextPath,所以我们不能加,我们加了就加多了
    // 框架增加 contextPath 后:/demo/outter.html
    // 我们多加一个:/demo/demo/outter.html
    return "redirect:/outter.html";
}

Session 对象
HttpSession session
) {

logger.debug("cookieValue = " + cookieValue);

return "target";

}





# 第七节 页面跳转控制

## 1、准备工作

* 准备一个地址在前后缀范围之外的页面
* 让这个页面能够成功访问



### ①创建范围之外的页面

[外链图片转存中...(img-R2s08uv0-1652566832291)]

```html

    
    范围之外页面
    

②在 SpringMVC 配置文件加入配置

下面配置是访问静态资源所需配置,后面会专门说,现在先直接拿来用:

    
    
2、使用指令 ①转发指令
@RequestMapping("/test/forward/command")
public String forwardCommand() {
    
    // 需求:要转发前往的目标地址不在视图前缀指定的范围内,
    // 通过返回逻辑视图、拼接前缀后缀得到的物理视图无法达到目标地址
    
    // 转发到指定的地址:
    return "forward:/outter.html";
}
②重定向指令
@RequestMapping("/test/redirect/command")
public String redirectCommand() {
    
    // 重定向到指定的地址:
    // 这个地址由 SpringMVC 框架负责在前面附加 contextPath,所以我们不能加,我们加了就加多了
    // 框架增加 contextPath 后:/demo/outter.html
    // 我们多加一个:/demo/demo/outter.html
    return "redirect:/outter.html";
}
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/889180.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号