全部章节   >>>>


本章目录

5.1 Spring MVC设计概述及其框架结构

5.1.1 Spring MVC介绍

5.1.1 Spring MVC优势

5.1.2  Spring MVC工作原理

5.1.3 手动搭建Spring MVC环境

5.1.4 实践练习

5.2 处理器映射器和适配器

5.2.1 配置处理器映射器和适配器

5.2.2   注解驱动

5.2.3   @RequestMapping注解

5.2.3 注解驱动

5.2.4 实践练习

5.3  Spring MVC简单类型数据绑定

5.3.1 基本数据类型绑定

5.3.2  POJO类型数据绑定

5.3.3 Json类型数据交互

5.3.4 实践练习

5.4 Spring MVC复杂类型数据绑定

5.4.1  List集合类型数据绑定

5.4.2  Set集合类型数据绑定

5.4.3  Map集合类型数据绑定

5.4.4 实践练习

总结


5.1 Spring MVC设计概述及其框架结构

5.1.1 Spring MVC介绍

Spring MVC是目前最好的实现MVC设计模式的框架,是Spring框架的一个分支产品,以Spring IoC容器为基础,并利用容器的特性来简化它的配置。

Spring MVC相当于Spring的一个子模块,可以很好地和Spring结合起来进行开发,是Java Web开发者应该要掌握的框架。

5.1.1 Spring MVC优势

  • 清晰的角色划分
  • 分工明确
  • 无需继承框架特定API,可以使用命令对象直接作为业务对象。
  • 和Spring其他框架无缝集成
  • 可适配,通过HandlerAdapter可以支持任意的类作为处理器。
  • 可定制性,HandlerMapping、ViewResolver等能够非常简单的定制。
  • 功能强大的数据验证、格式化和绑定机制。
  • 利用Spring提供的Mock对象能够非常简单的进行Web层单元测试。
  • 本地化和主题的解析的支持,使我们更容易进行国际化和主题的切换。
  • 强大的JSP标签库,使JSP编写更容易。

5.1.2  Spring MVC工作原理

Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的处理器。

5.1.3 手动搭建Spring MVC环境

示例:搭建SpringMVC开发环境 创建WEB工程。

添加相关jar。

在src目录下创建Spring MVC的核心配置文件springmvc.xml。

在web.xml配置文件中配置Spring MVC的DispatcherServlet前端控制器。

在WebContent目录下创建index.jsp文件。

发布程序启动WEB服务器访问。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd ">
<!-- 此处输入内容 -->
</beans>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定Spring MVC的核心配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 拦截所有以do结尾的请求 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>

5.1.4 实践练习

5.2 处理器映射器和适配器

在Spring MVC中,处理器映射器和适配器这两个组件在Spring MVC整个的运行流程之中扮演一个很重要的角色。

映射器和适配器两个组件的功能:

  • 映射器主要是跟在浏览器上输入的URL来映射对应的Handle,具体的映射规则需要根据使用哪一个映射器来决定
  • 适配器主要是决定调用哪个Handler来实现具体的业务逻辑。

5.2.1 配置处理器映射器和适配器

示例:配置官方推荐的处理器映射器和适配器,在页面中输出结果。

<!-- 开启注解扫描功能 -->
<context:component-scan base-package="com.mhys.demo"></context:component-scan>
<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

@RequestMapping注解将url请求与业务方法进行映射。

ModelAndView对象的作用:设置转向地址和传递处理器中方法处理结果数据到结果页面。

5.2.2   <mvc:annotation-driven />注解驱动

手动配置处理器映射器和适配器比较麻烦,也不便于记忆。为了简化配置,官方提供了<mvc:annotation-driven />注解驱动标签来简化配置

此标签会自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter两个Bean,当然还简化了其他的一些配置信息。

示例: 通过<mvc:annotation-driven />注解驱动标签来简化处理器映射器和适配器的配置。

5.2.3   @RequestMapping注解

Spring MVC通过@RequestMapping注解将url请求与业务方法进行映射。在Spring MVC框架中,@RequestMapping注解的使用频率很高,它可以添加在处理器类上以及方法上,在类定义处添加@RequestMapping注解,相当于多了一层访问路径。

@RequestMapping注解有三个常用的属性:

  • value:指定url请求的实际地址,是@RequestMapping的默认值,可省略不写。
  • method:指定请求的类型,get、post、put和delete等,常用get和post类型请求。
  • params:指定请求中必须包含某些参数值,否则无法调用该方法。

5.2.3 <mvc:annotation-driven />注解驱动

示例:通过@RequestMapping完成GET和POST请求处理。

@Controller
@RequestMapping("/first")
public class RequestMappingController {
@RequestMapping(value="/postTest",method=RequestMethod.GET)
public ModelAndView testMethod(){
ModelAndView model= new ModelAndView();
model.addObject("method", "get请求成功!");
model.setViewName("/WEB-INF/jsp/test.jsp");
return model;
}
}

@Controller
@RequestMapping("/first")
public class RequestMappingController {
@RequestMapping(value="/postTest",method=RequestMethod.POST)
public ModelAndView testMethod(){
ModelAndView model= new ModelAndView();
model.addObject("method", "get请求成功!");
model.setViewName("/WEB-INF/jsp/test.jsp");
return model;
}
}

5.2.4 实践练习

5.3  Spring MVC简单类型数据绑定

在开发中,经常需要用到的是在业务方法中获取url中的参数和前端页面中的参数。这个时候需要了解Spring MVC的数据绑定。数据绑定就是在后台业务方法中,直接获取前端HTTP请求中的参数。

HTTP请求传输的参数都是String类型,但是Hanlder业务方法中的参数都是指定的数据类型,如int、Object等,所以需要处理参数的类型转换。

此项工作不需要开发人员去完成,Spring MVC的HandlerAdapter组件会在执行Handler业务方法之前完成参数的绑定。

5.3.1 基本数据类型绑定

示例:使用@RequestParam来接收基本数据类型参数。

@Controller
@RequestMapping("/method")
public class MethodController {
@RequestMapping("/items")
public String getParams(@RequestParam("ownerName") String ownerName,
@RequestParam("itemName") String itemName, @RequestParam("itemPrice") String itemPrice){ System.out.println("ownerName:" + ownerName);
System.out.println("itemName:" + itemName);
System.out.println("itemPrice:" + itemPrice);
return "index.jsp";
}
}
<body>
<hr />
<h1>添加古董信息</h1><br/>
<form action="method/items.do" method="post">
宝贝任务:<input type="text" name="ownerName"><br/><br/>
宝贝名:<input type="text" name="itemName"><br/><br/>
宝贝价格:<input type="text" name="itemPrice"><br/><br/>
<input type="submit" value="添加">
</form>
</body>

5.3.2  POJO类型数据绑定

示例:接收页面提交的参数实现对入参数据的封装。

//地址实体类
public class Address {
private String addressId;
private String addressName;
// set()方法和get()方法省略
@Override
public String toString() {
return "Address [addressId=" + addressId + ", addressName="
+ addressName + "]";
}
}
//用户实体类
public class User {
private String username;
private int age;
private Address address;
// set()方法和get()方法省略 @Override
public String toString() {
return "User [username=" + username + ", age=" + age + ", address="
+ address + "]";
}
}
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/user")
// 进入用户注册页面
public ModelAndView intouser(User user){
ModelAndView model = new ModelAndView();
model.setViewName("/WEB-INF/jsp/user.jsp");
return model;
}
@RequestMapping("/info")
public String userInfo(User user){
System.out.println(user);
return null;
}
}
<body>
<form action="info.do" method="post">
姓名:<input type="text" name="username"/><br/><br/>
年龄:<input type="text" name="age"/><br/><br/>
地址编号:<input type="text" name="address.addressId"/><br/><br/>
地址:<input type="text" name="address.addressName"/><br/><br/>
<input type="submit" value="提交"/>
</form>
</body>

5.3.3 Json类型数据交互

在前后端交互中,经常碰见Ajax请求后端业务方法并将Json格式的参数传到后端的情况。如果需要Spring MVC支持Json,必须加入Json的处理jar包。添加jar包。

示例:将客户的账号和金额传到后端,然后将金额加100返回客户信息到前端。这里将使用@RequestBody注解和@ResponseBody注解来接收Json格式数据和返回Json格式数据。

@Controller
@RequestMapping("/customer")
public class CustomerController {
@RequestMapping(value="/jsontest",method=RequestMethod.POST )
@ResponseBody
public Customer jsonTest(@RequestBody Customer customer ){
System.out.println(customer.getCustomerId()+"------"+customer.getMoney());
int money = customer.getMoney() + 100;
customer.setMoney(money);
return customer;
}
@RequestMapping("/json")
@ResponseBody
// 进入页面
public ModelAndView intoJson(){
ModelAndView model = new ModelAndView();
model.setViewName("/WEB-INF/jsp/customer.jsp");
return model;
}
}
<script type="text/javascript" language="javascript">
$(document).ready(function(){
var customer = {"customerId":"584135","money":105};
$("#json").click(function () {
$.ajax({
url:"<%=request.getContextPath() %>/customer/jsontest.do",
data:JSON.stringify(customer), // 将Json对象转换成Json字符串
contentType: "application/json;charset=UTF-8",
type:"post",
dataType:"json",
success:function(data){
alert(data.customerId+"---"+data.money);
}
})
});
});
</script>

5.3.4 实践练习

5.4 Spring MVC复杂类型数据绑定

5.4.1  List集合类型数据绑定

示例:在前台页面注册多个员工的信息,后台通过List集合数据绑定来获取员工集合信息。

public class Employee {
private String id;
private String name; @Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + "]";
}
// set()方法和get()方法省略
}
@Controller
public class EmployeeController {
@RequestMapping("/employeeList")
@ResponseBody
public String getEmployeeList(EmployeeList employeeList){
StringBuffer sbf = new StringBuffer();
for(Employee employee : employeeList.getEmployees()){
sbf.append(employee);
}
return "员工:" + sbf.toString();
}
}
<body>
<form action="employeeList.do" method="post">
员工1编号:<input type="text" name="employees[0].id"/>
员工1姓名:<input type="text" name="employees[0].name"/><br/><br/>
员工2编号:<input type="text" name="employees[1].id"/>
员工2姓名:<input type="text" name="employees[1].name"/><br/><br/>
员工3编号:<input type="text" name="employees[2].id"/>
员工3姓名:<input type="text" name="employees[2].name"/><br/><br/>
<input type="submit" value="List提交"/>
</form>
</body>

5.4.2  Set集合类型数据绑定

示例:通过Set集合来完成员工信息集合的数据绑定。

public class EmployeeSet {
private Set<Employee> employees = new HashSet<Employee>(); public EmployeeSet() {
employees.add(new Employee());
employees.add(new Employee());
employees.add(new Employee());
}
// set()方法和get()方法省略
}
@Controller
public class EmployeeController {
// 原有代码省略
@RequestMapping("/employeeSet")
@ResponseBody
public String getEmployeeSet(EmployeeSet employeeSet){
StringBuffer sbf = new StringBuffer();
for(Employee employee : employeeSet.getEmployees()){
sbf.append(employee);
}
return "员工:" + sbf.toString();
}
}
<body>
<form action="employeeList.do" method="post">
员工1编号:<input type="text" name="employees[0].id"/>
员工1姓名:<input type="text" name="employees[0].name"/><br/><br/>
员工2编号:<input type="text" name="employees[1].id"/>
员工2姓名:<input type="text" name="employees[1].name"/><br/><br/>
员工3编号:<input type="text" name="employees[2].id"/>
员工3姓名:<input type="text" name="employees[2].name"/><br/><br/>
<input type="submit" value="List提交"/>
</form>
</body>

5.4.3  Map集合类型数据绑定

示例:通过Map集合来完成员工信息集合的数据绑定。

@Controller
public class EmployeeController {
// 原有代码省略 @RequestMapping("/employeeMap")
@ResponseBody
public String getEmployeeMap(EmployeeMap employeeMap){
StringBuffer sbf = new StringBuffer();
for(String key:employeeMap.getEmployees().keySet()){
Employee employee = employeeMap.getEmployees().get(key);
sbf.append(employee);
}
return "员工:" + sbf.toString();
}
}
<body>
<form action="employeeMap.do" method="post">
员工1编号:<input type="text" name="employees['a'].id"/>
员工1姓名:<input type="text" name="employees['a'].name"/><br/><br/>
员工2编号:<input type="text" name="employees['b'].id"/>
员工2姓名:<input type="text" name="employees['b'].name"/><br/><br/>
员工3编号:<input type="text" name="employees['c'].id"/>
员工3姓名:<input type="text" name="employees['c'].name"/><br/><br/>
// 原有代码省略
&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" value="Map提交"/>
</form>
</body>

5.4.4 实践练习

总结

Spring MVC的主要组件:

  • DispatcherServlet前端控制器:作为前端控制器,整个流程控制的中心。
  • HandlerMapping处理器映射器:通过扩展处理器映射器实现不同的映射方式。
  • HandlAdapter处理器适配器:通过扩展处理器适配器,支持更多类型的处理器。
  • ViewResolver视图解析器:通过扩展视图解析器,支持更多类型的视图解析。

@RequestMapping:用于处理请求URL映射的注解,可用于类或方法上。

@RequestBody:注解实现接收HTTP请求的Json数据,将Json转换为java对象。

@ResponseBody:注解实现将Conreoller处理器类中方法返回对象转化为Json对象响应给客户。

Spring企业级程序设计 • 【第5章 Spring MVC快速入门】的更多相关文章

  1. Spring企业级程序设计 • 【目录】

    章节 内容 实践练习 Spring企业级程序设计目录(作业笔记) 第1章 Spring企业级程序设计 • [第1章 Spring之旅] 第2章 Spring企业级程序设计 • [第2章 Spring ...

  2. Spring企业级程序设计作业目录(作业笔记)

    Spring企业级程序设计 • [目录] 第1章 Spring之旅  >>> 1.1.6 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打 ...

  3. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  4. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  5. 【第二篇】ASP.NET MVC快速入门之数据注解(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 【转载】Gradle学习 第九章:Groovy快速入门

    转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...

  9. Spring企业级程序设计 • 【第7章 Spring框架整合】

    全部章节   >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...

  10. Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】

    全部章节   >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...

随机推荐

  1. Vue框架,computed和watch的区别

    computed和watch定义 1.computed是计算属性,类似于过滤器,对绑定到视图的数据进行处理.官网的例子: <div id="example"> < ...

  2. DBMS_RANDOM包详解

    DBMS_RAMDOM包中一共包含9个存储过程和函数,其中6个是现在用的,3个是已经过时的: 当前版本11gR2 每次生成一个随机数oracle都会初始化一个种子,也可以调用seed过程自己初始化一个 ...

  3. Multiple Inheritance in C++

    Multiple Inheritance is a feature of C++ where a class can inherit from more than one classes. The c ...

  4. 【力扣】337. 打家劫舍 III

    在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个" ...

  5. 【C/C++】例题3-5 生成元/算法竞赛入门经典/数组与字符串

    [题目] x+x的各位数之和为y,x为y的生成元. 求10万以内的n的最小生成元,无解输出0. [解答] 这是我根据自己的想法最初写的代码: #include<cstdio> #inclu ...

  6. ANTLR 相关术语

    下面介绍很多重要的与语言识别相关的术语. 语言(Language) A language is a set of valid sentences 一门语言是一个有效语句的集合. Sentences a ...

  7. 『与善仁』Appium基础 — 20、Appium元素定位

    目录 1.by_id定位 2.by_name定位 3.by_class_name定位 4.by_xpath定位 5.by_accessibility_id定位 6.by_android_uiautom ...

  8. ZooKeeper 06 - ZooKeeper 的常用命令

    目录 1 - 服务端常用命令 2 - 客户端常用命令 3 - 常用四字命令 4 - ZooKeeper 日志的可视化 版权声明 若要部署 ZooKeeper 单机环境,请查看此篇:https://ww ...

  9. HDC2021技术分论坛:如何高效完成HarmonyOS分布式应用测试?

    作者:liuxun,HarmonyOS测试架构师 HarmonyOS是新一代的智能终端操作系统,给开发者提供了设备发现.设备连接.跨设备调用等丰富的分布式API.随着越来越多的开发者投入到Harmon ...

  10. pipeline input步骤

    目录 一.简介 二.input步骤复杂用法 三.获取上游pipeline信息 四.超时中止 一.简介 执行imput步骤会暂停pipeline,直到用户输入参数.这是一种特殊的参数化pipeline的 ...