第一章 概述
- Spring MVC快速入门
- Spring MVC详解
- Spring MVC的使用
- Maven开发Spring MVC
第二章 Spring MVC快速入门及详解
2-1 Spring MVC快速入门
(1)什么是MVC设计模式?
- Controller:负责接收并处理请求,响应客户端。
- Model:模型数据,业务逻辑。
- View:呈现模型,与用户进行交互。
(2)什么是Spring MVC? - 目前最好的实现MVC设计模式的框架。
- Spring框架的一个后续产品。
- Spring框架的一个子模块,二者可以很好的结合使用,不需要整合。
2-2 Spring MVC详解
(1)Spring MVC核心组件(8个)
- DispatcherServlet:前置控制器。
- HandlerMapping:将请求映射到Handler。
- andler:后端控制器,完成具体业务逻辑
- HandlerInterceptor:处理器拦截器。
- HandlerExecutionChain:处理器执行链。 -
- HandlerAdapter:处理器适配器。
- ModelAndView:装载模型数据和视图信息。
- ViewResolver:视图解析器。
(2)Spring MVC实现流程
- 客户端请求被DispatcherServlet接收。
- DispatcherServlet将请求映射到Handler。
- 生成Handler以及HandlerInterceptor。
- 返回HandlerExecutionChain(Handler+HandlerInterceptor)。
- DispatcherServlet通过HandlerAdapter执行Handler。
- 返回一个ModelAndView。
- ispatcherServlet通过ViewResoler进行解析。
- 返回填充了模型数据的View,响应给客户端。
第三章 Spring MVC使用
Spring MVC的使用
- 大部分组件由框架提供,开发者只需通过配置进行关联。
- 开发者只需要手动编写Handler,View。
3-1 Spring MVC使用—基于XML配置
Spring MVC基础配置。
- XML配置Controller,HandlerMapping组件映射。
- XML配置ViewResolver组件映射。
(1)目录结构
(2)创建maven webapp项目,在pom.xml中导入Spring MVC,servlet需要的依赖。
<!-- 导入springmvc需要的jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<!-- 导入Servlet相关的jar -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
(3)在web.xml中配置DispatcherServlet前置控制器。
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 前置控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param><!-- 初始化参数,指定springmvc的路径 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- Servlet-mapping映射 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(4)在resource中创建springmvc.xml文件,将Hanler和视图jsp关联起来。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- 配置HandlerMapping,将url请求映射到Handler -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 配置Mapping -->
<property name="mappings">
<props>
<!-- 配置test请求对应的handler -->
<prop key="/test">testHandler</prop>
</props>
</property>
</bean>
<!-- 配置Handler -->
<bean id="testHandler" class="com.demo.handler.MyHandler" ></bean><!-- id值对应上面的prop值 -->
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/"></property><!-- 单斜杠表示根目录,配置前后缀针对MyHandler中的逻辑视图而言 -->
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
(5)创建MyHandler.java文件实现Controller接口。
public class MyHandler implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//添加模型数据
modelAndView.addObject("name","Tom");
//添加逻辑视图
modelAndView.setViewName("show");//把Tom传到show视图中
return modelAndView;
}
}
(6)因为MyHandler文件中是setViewName(“show”),所以创建show.jsp文件。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %><!-- 是否忽略EL -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${name}
</body>
</html>
(7)在浏览器中输入地址,以及在springmvc.xml中定好的test,即可取出数据。
3-2 Spring MVC使用—基于注解
SpringMVC基础配置。
- Controller,HandlerMapping通过注解进行映射。
- XML配置ViewResolver组件映射。
(1)目录结构
(2)pom.xml,show.jsp,web.xml三个文件和之前一样。
(3)创建AnnotationHandler.java文件,通过注解完成SpringMVC可以不实现Controller接口。
@Controller //通过注解的方式告诉springmvc,这是一个控制器
public class AnnotationHandler {
/**
* 业务方法:ModelAndView完成数据的传递,视图的解析
*/
@RequestMapping("/modelAndViewTest") //这个方法是客户端处理对应的请求的
public ModelAndView modelAndViewTest(){
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","这是ModelAndView的注解");
//设置逻辑视图
modelAndView.setViewName("show");
return modelAndView;
}
/**
* 业务方法:Model传值,String进行视图解析
*/
@RequestMapping("/ModelTest")
public String ModelTest(Model model){
//填充模型数据
model.addAttribute("name","这是Model传值(注解方式)");
//设置逻辑视图
return "show";
}
/**
* 业务方法:Map传值,String进行视图解析
*/
@RequestMapping("/MapTest")
public String MapTest(Map<String,String> map){
//填充模型数据
map.put("name", "这是Map传值方式(注解)");
//设置逻辑
return "show";
}
}
(4)创建springmvc.xml文件,实现ViewResolver的映射
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- 将AnnotationHandler自动扫描到IOC容器中 -->
<context:component-scan base-package="com.demo.handler"></context:component-scan>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/"></property><!-- 单斜杠表示根目录,配置前后缀针对MyHandler中的逻辑视图而言 -->
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
(5)启动tomcat服务器,输入项目地址以及AnnotationHandler的RequestMapping值
第四章 案例
4-1 案例一:添加商品(JSP)
需求:添加商品信息(名字,价格),后台对数据进行封装,封装好后再进行展示,再回到前台。
(1)目录结构,样式采用BootStrap。
(2)在pom.xml中引入对应依赖,和前面讲述的一样
(3)创建add.jsp文件,作为商品的输入页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link href="lib/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<style type="text/css">
body{
over-flow-x:hidden;
}
</style>
</head>
<body>
<form class="form-horizontal" role="form" action="addGoods" method="post">
<div class="form-group">
<label class="col-sm-1 control-label">名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="name" placeholder="请输入商品名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="price" placeholder="请输入商品价格">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-3">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form>
</body>
</html>
(4)为解决中文乱码,CSS样式问题,在web.xml文件中作好配置
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 处理中文乱码,filter过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern><!-- 捕获所有请求 -->
</filter-mapping>
<!-- 前置控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param><!-- 初始化参数,指定springmvc的路径 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- Servlet-mapping映射 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 设置访问静态资源 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern><!-- 捕获所有css样式 -->
</servlet-mapping>
</web-app>
(5)创建springmvc.xml的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- 将AnnotationHandler自动扫描到IOC容器中 -->
<context:component-scan base-package="com.demo.handler"></context:component-scan>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/"></property><!-- 单斜杠表示根目录,配置前后缀针对MyHandler中的逻辑视图而言 -->
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
(6)创建AnnotationHandler.java文件
@Controller //通过注解的方式告诉springmvc,这是一个控制器
public class AnnotationHandler {
/**
* 添加商品并展示
*/
@RequestMapping("/addGoods")
public ModelAndView addGoods(Goods goods){
System.out.println(goods.getName()+"\t"+goods.getprice());
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
//填充模型数据,将Goods传入到页面中
modelAndView.addObject("goods",goods);
//设置逻辑视图
modelAndView.setViewName("showGoods");
return modelAndView;
}
}
(7)创建showGoods.jsp文件,显示输入的商品
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %><!-- 是否忽略EL -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
商品名称:${requestScope.goods.name}<br/>
商品价格:${requestScope.goods.price}
</body>
</html>
4-2 案例二:静态页面的跳转(超链接并传值,表单,替换当前页面内容)
(1)目录结构
(2)pom.xml引入如之前案例的servlet,springMVC的依赖。
(3)配置web.xml文件
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 前置控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param><!-- 初始化参数,指定springmvc的路径 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- Servlet-mapping映射 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(4)配置springmvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 将AnnotationHandler自动扫描到IOC容器中 -->
<context:component-scan base-package="com.demo.handler"></context:component-scan>
<!-- 注解的意思是 全拦截只默认处理 servlet请求,不处理静态资源 html css js -->
<mvc:default-servlet-handler/>
<!-- 开启注解 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/"></property><!-- 单斜杠表示根目录,配置前后缀针对MyHandler中的逻辑视图而言 -->
<!-- 配置后缀 -->
<property name="suffix" value=".html"></property>
</bean>
</beans>
(5)创建FirstController.java文件
@Controller
public class FirstController {
@RequestMapping("/getFirest") //访问的url
public String getFirest(){
System.out.println("请求到了我的这个方法");
return "success";
}
@RequestMapping("/ShowName")
public void ShowName(HttpServletRequest request,HttpServletResponse response) throws IOException{
String name = request.getParameter("name");
response.getWriter().write(name+" is a good person");
}
@RequestMapping(value="/ShowFormName",method=RequestMethod.POST)
public String ShowFormName(String name,HttpServletResponse response){
System.out.println(name);
return "success";
}
}
(6)超链接从test.html跳转到success.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="getFirest">测试</a>
</body>
</html>
(7)表单传值,替换当前页面内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="ShowName" method="POST">
姓名:<input type="text" name="name"><input type="submit" value="提交">
</form>
</body>
</html>
(8)超链接替换当前页面内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="ShowName?name=Tom">测试</a>
</body>
</html>
4-3 案例三:用户注册(html)
(1)目录结构
(2)pom.xml,springmvc.xml参考4-2案例。
(3)web.xml设置字符编码,避免中文乱码
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 处理中文乱码,filter过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern><!-- 捕获所有请求 -->
</filter-mapping>
<!-- 前置控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param><!-- 初始化参数,指定springmvc的路径 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- Servlet-mapping映射 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 设置访问静态资源 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern><!-- 捕获所有css样式 -->
</servlet-mapping>
</web-app>
(4)创建User.java文件
public class User {
private String username;
private Integer passWorld;
}
(5)创建FirstController.java文件
@Controller
public class FirstController {
@RequestMapping(value="/register",method=RequestMethod.POST)
public String register(User user,HttpSession session){
if(user!=null){
System.out.println(user);
session.setAttribute("message", "注册成功");
}else{
session.setAttribute("message", "注册失败");
}
return "success";
}
}
(6)创建registerTest.html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="register" method="POST">
<h1>注册页面</h1>
姓名:<input type="text" name="username"><br>
密码:<input type="text" name="passWorld">
<input type="submit" value="注册">
</form>
</body>
</html>
(7)运行测试结果
第五章 总结
(1)SpringMVC基本概念
(2)SpringMVC底层实现原理
(3)SpringMVC的使用(基于XML,基于注解)