Spring企业级程序设计 • 【第5章 Spring MVC快速入门】
全部章节 >>>>
本章目录
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/>
// 原有代码省略
<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快速入门】的更多相关文章
- Spring企业级程序设计 • 【目录】
章节 内容 实践练习 Spring企业级程序设计目录(作业笔记) 第1章 Spring企业级程序设计 • [第1章 Spring之旅] 第2章 Spring企业级程序设计 • [第2章 Spring ...
- Spring企业级程序设计作业目录(作业笔记)
Spring企业级程序设计 • [目录] 第1章 Spring之旅 >>> 1.1.6 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打 ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【第二篇】ASP.NET MVC快速入门之数据注解(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【转载】Gradle学习 第九章:Groovy快速入门
转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...
- Spring企业级程序设计 • 【第7章 Spring框架整合】
全部章节 >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...
- Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】
全部章节 >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...
随机推荐
- echo -e "\033[字背景颜色;字体颜色m字符串\033[0m
格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033 ...
- redis 之 哨兵
#:编译安装redis4.0 [root@master ~]# tar xf redis-4.0.14.tar.gz [root@master ~]# cd redis-4.0.14/ [root@m ...
- Linux系统信息查看命令(ZZ)
http://hi.baidu.com/thinkdifferent/blog/item/22f4a80161630e011d958384.html转自一个baidu师兄的博客,很好的一个总结,推荐下 ...
- eclips 配置一个tomcat,启动多个不同端口的web项目
前提: 记录这个文章是因为在网上查资料,很多都是,用eclips.配置多个tomcat,就像下面图这样配置两个tomcat 去启动不同的web: 运动多个web 项目,设置不同的端口,需要多个tomc ...
- logstash 正则表达式
正则表达式 3. 使用给定好的符号去表示某个含义 4. 例如.代表任意字符 5. 正则符号当普通符号使用需要加反斜杠 正则的发展 6. 普通正则表达式 7. 扩展正则表达式 普通正则表达式 . 任意一 ...
- python数据预处理和特性选择后列的映射
我们在用python进行机器学习建模时,首先需要对数据进行预处理然后进行特征工程,在这些过程中,数据的格式可能会发生变化,前几天我遇到过的问题就是: 对数据进行标准化.归一化.方差过滤的时候数据都从D ...
- JavaXML解析的四种方法(连载)
1. xml简介 XML:指可扩展标记语言, Extensible Markup Language:类似HTML.XML的设计宗旨是传输数据,而非显示数据. 一个xml文档实例: 1 <?xml ...
- AOP面向切面
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点 ...
- logcplus(2)
(一)log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置. ### 简介 ### log4 ...
- STM32F103ZET6 核心板制作指引
学点啥系列之 --STM32F103ZET6 核心板制作指引 原创资料,转载请联系 作者的话:会画stm32F103ZET6的话,rct6啥的简直不要太简单 一.电路总览 图1:电路整体 二.单片机部 ...