Spring MVC框架:第三章:获取请求参数和页面跳转控制

简介: Spring MVC框架:第三章:获取请求参数和页面跳转控制

获取请求参数

1.什么是请求参数?

<a href="emp/remove?empId=3">删除</a>
<form action="emp/save" method="post">
    姓名:<input type="text" name="empName"/><br/>
    年龄:<input type="text" name="empAge"/><br/>
    工资:<input type="text" name="empSalary"/><br/>
    <input type="submit" value="保存"/>
</form>

2.请求参数的四种情况

①一名一值

<a href=“emp/remove?empId=3”>删除</a>

在handler方法的参数上使用@RequestParam注解。

@RequestMapping("/caseOne")
public String caseOne(@RequestParam("empId") Integer empId) {
    System.out.println("empId="+empId);
    return "result";
}

SpringMVC会自动帮我们进行类型转换。如果请求参数的名字和handler方法中对应形参的名字一致那么可以省略@RequestParam注解。

@RequestMapping("/caseOne")
public String caseOne(Integer empId) {
    System.out.println("empId="+empId);
    return "result";
}

②一名多值

<form action="team" method="post">
    请选择你最喜欢的球队:
    <input type="checkbox" name="team" value="Brazil"/>巴西
    <input type="checkbox" name="team" value="German"/>德国
    <input type="checkbox" name="team" value="French"/>法国
    <input type="checkbox" name="team" value="Holland"/>荷兰
    <input type="checkbox" name="team" value="Italian"/>意大利
    <input type="checkbox" name="team" value="China"/>中国
    <br/>
    <input type="submit" value="保存"/>
</form>

使用List或数组来接收。

@RequestMapping("/caseTwo")
public String caseTwo(@RequestParam("team") List<String> teams) {
    System.out.println(teams);
    return "result";
}
@RequestMapping("/caseTwo")
public String caseTwo(@RequestParam("team") String[] teams) {
    System.out.println(Arrays.asList(teams));
    return "result";
}

③表单数据正好对应一个实体类

<form action="emp/save" method="post">
    姓名:<input type="text" name="empName"/><br/>
    年龄:<input type="text" name="empAge"/><br/>
    工资:<input type="text" name="empSalary"/><br/>
    <input type="submit" value="保存"/>
</form>

实体类:

public class Employee {
    private Integer empId;
    private String empName;
    private int empAge;
    private double empSalary;
    ……

直接使用和表单对应的实体类类型接收

@RequestMapping("/caseThree")
public String caseThree(Employee employee) {
    System.out.println(employee);
    return "result";
}

④表单对应的实体类包含级联属性

public class Student {
  private Integer studentId;
  private String studentName;
  private School school;
  private List<Subject> subjectList;
  private Subject[] subjectArray;    
  private Set<Teacher> teacherSet;      
  private Map<String,String> scoreMap;
  {
   //在各种常用数据类型中,只有Set类型需要提前初始化
        //并且要按照表单将要提交的对象数量进行初始化
        //Set类型使用非常不便,要尽可能避免使用Set
    teacherSet = new HashSet<>();
    teacherSet.add(new Teacher());
    teacherSet.add(new Teacher());
    teacherSet.add(new Teacher());
  }

handler方法

@RequestMapping("/get/param/multi/value")
  public String getParamOneNameMultiValue(@RequestParam("team") List<String> teamList) {        
    for (String team : teamList) {
      System.out.println(team);
    }       
    return "target";
  }
  @RequestMapping("/get/param/entity")
  public String getParamEntity(Employee employee) {       
    System.out.println(employee);       
    return "target";
  }
  //@RequestMapping("/get/param/entity")
  public String getParamEntityParam(@RequestParam("empName") String empName) {        
    System.out.println("empName="+empName);       
    return "target";
  }
  @RequestMapping("/get/param/fuza")
  public String getParamFuza(Student student) {
    System.out.println("StudentId="+student.getStudentId());
    System.out.println("StudentName="+student.getStudentName());
    System.out.println("SchoolId="+student.getSchool().getSchoolId());
    System.out.println("SchoolName="+student.getSchool().getSchoolName());
    List<Subject> subjectList = student.getSubjectList();
    for (Subject subject : subjectList) {
      System.out.println("科目名称="+subject.getSubjectName());
    }
    Subject[] subjectArray = student.getSubjectArray();
    for (Subject subject : subjectArray) {
      System.out.println("科目名称="+subject.getSubjectName());
    }
    Set<Teacher> teacherSet = student.getTeacherSet();
    for (Teacher teacher : teacherSet) {
      System.out.println("老师姓名="+teacher.getTeacherName());
    }
    Map<String, String> scoreMap = student.getScoreMap();
    Set<String> keySet = scoreMap.keySet();
    for (String key : keySet) {
      String value = scoreMap.get(key);
      System.out.println(key+":"+value);
    }
    return "target";
  }

提交数据的表单

<form action="${pageContext.request.contextPath }/get/param/fuza" method="post">
    学生编号:<input type="text" name="studentId" value="22" /><br/>
    学生姓名:<input type="text" name="studentName" value="tom" /><br/>
    <!-- getSchool().setSchoolId() -->
    学校编号:<input type="text" name="school.schoolId" value="33" /><br/>
    学校名称:<input type="text" name="school.schoolName" value="at" /><br/>
    科目1名称:<input type="text" name="subjectList[0].subjectName" value="理论" /><br/>
    科目2名称:<input type="text" name="subjectList[1].subjectName" value="倒库"/><br/>
    科目3名称:<input type="text" name="subjectList[2].subjectName" value="路考"/><br/>
    科目4名称:<input type="text" name="subjectArray[0].subjectName" value="撞人"/><br/>
    科目5名称:<input type="text" name="subjectArray[1].subjectName" value="防碰瓷"/><br/>
    科目6名称:<input type="text" name="subjectArray[2].subjectName" value="追尾"/><br/>
    老师姓名:<input type="text" name="teacherSet[0].teacherName" value="卡卡西"/><br/>
    老师姓名:<input type="text" name="teacherSet[1].teacherName" value="伊鲁卡"/><br/>
    老师姓名:<input type="text" name="teacherSet[2].teacherName" value="大蛇丸"/><br/>
    考试成绩:<input type="text" name="scoreMap['shuxue']" value="25" /><br/>
    考试成绩:<input type="text" name="scoreMap['yuwen']" value="16" /><br/>
    考试成绩:<input type="text" name="scoreMap['yingyu']" value="7" /><br/>
    考试成绩:<input type="text" name="scoreMap['lol']" value="100" /><br/>
    考试成绩:<input type="text" name="scoreMap['dota']" value="300" /><br/>
    <input type="submit" value="提交"/>
  </form>
  <br/><br/>
  <form action="${pageContext.request.contextPath }/get/param/entity" method="post">
    <!-- private Integer empId; -->
    编号:<input type="text" name="empId"/><br/>
    <!-- private String empName; -->
    姓名:<input type="text" name="empName"/><br/>
    <!-- private Integer empAge; -->
    年龄:<input type="text" name="empAge"/><br/>
    <!-- private Double empSalary; -->
    工资:<input type="text" name="empSalary"/><br/>
    <input type="submit" value="提交"/>
  </form>
  <br/><br/>
  <form action="${pageContext.request.contextPath }/get/param/multi/value" method="post">
    请选择你最喜欢的球队:<br/>
    <input type="checkbox" name="team" value="German"/>德国<br/>
    <input type="checkbox" name="team" value="Brazil"/>巴西<br/>
    <input type="checkbox" name="team" value="Italian"/>意大利<br/>
    <input type="checkbox" name="team" value="China"/>中国<br/>
    <input type="checkbox" name="team" value="Korea"/>韩国<br/>
    <input type="submit" value="提交"/>
  </form>

web.xml配置,解决字符乱码

<!-- 在SpringMVC环境下对请求和响应过程强制使用UTF-8字符集进行编码、解码 -->
  <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>
    <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>

页面跳转控制

1.转发指令

@RequestMapping("/testForward")
public String testForward() {
    return "forward:/target.jsp";
}

forward:/target.jsp

表示方法执行完成后转发到/target.jsp。想一想有了视图解析器拼接字符串指定转发页面之后forward是否多余呢?

2.重定向指令

@RequestMapping("/testRedirect")
public String testRedirect() {
    return "redirect:/target.jsp";
}

redirect:/target.jsp

表示方法执行完成后重定向到/target.jsp。这里重定向中使用的路径和我们以前的写法不同,没有以Web应用名称开头,这是因为SpringMVC会替我们加上。

3.使用原生对象完成转发

@RequestMapping("/testForward")
public void testForward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/target.jsp").forward(request, response);
}

你看,使用原生request对象执行转发后,handler方法的返回值就必须是void,意思是我们自己指定了响应方式,不需要SpringMVC再进行处理了。一个请求只能有一个响应,不能在handler方法里面给一个,然后SpringMVC框架再给一个。

4.使用原生对象完成重定向

@RequestMapping("/testRedirect")
public void testRedirect2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.sendRedirect(request.getContextPath()+"/target.jsp");
}

使用原生response对象执行重定向后,handler方法的返回值同样需要设置为void,原因同上。

相关文章
|
27天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
38 0
|
1月前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
50 1
Spring 框架:Java 开发者的春天
|
23天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
41 2
|
22天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
80 1
|
1月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
|
1月前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
1月前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
1月前
|
Java 数据库连接 数据库
让星星⭐月亮告诉你,SSH框架01、Spring概述
Spring是一个轻量级的Java开发框架,旨在简化企业级应用开发。它通过IoC(控制反转)和DI(依赖注入)降低组件间的耦合度,支持AOP(面向切面编程),简化事务管理和数据库操作,并能与多种第三方框架无缝集成,提供灵活的Web层支持,是开发高性能应用的理想选择。
38 1
下一篇
无影云桌面