1、springmvc简介
1.1、mvc架构
MVC 是一种著名的设计模式,特别是在 Web 应用程序领域。模式全都是关于将包含业务数据的模块与显示模块的视图解耦的。这是怎样发生的?视图(例如,JSP 页面)怎样能够与其模型(例如,包含数据的 JavaBean)解耦?记得这句格言么?一个层次的重定向几乎可以解决计算机业中的所有问题。确实,在模型和视图之间引入重定向层可以解决问题。此重定向层是控制器。控制器将接收请求,执行更新模型的操作,然后通知视图关于模型更改的消息。依赖于模型的状态并且依赖于请求的控制器可以决定要显示哪个视图。
MVC(Model-View-Controller)三元组的概念:
1、 Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean 组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
2、 领域模型javaBean组件等价于 域模型层 + 业务逻辑层 + 持久层(M)
3、 View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西(V)。
4、 Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图(C)
1.2、springmvc架构
SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需通过中间整合层进行整合。SpringMVC是基于MVC架构的WEB框架。
SpringMVC框架是一个基于请求驱动的Web框架,使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理。首先让我们来整体看一下Spring Web MVC请求的处理流程。
1.3、 SpringMVC请求处理流程
对工作原理解释说明:
① 用户发送请求到springmvc框架提供的DispatcherServlet 这个前端控制器
② 前端控制器会去找处理器映射器(HandlerMapping),处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet 。
③ 根据处理器映射器返回的处理器,DispatcherServlet 会找“合适”的处理器适配器(HandlerAdapter)
④ 处理器适配器HandlerAdpater会去执行处理器(Handler开发的时候会被叫成Controller也叫后端控制器) 执行之前会有转换器、数据绑定、校验器等等完成上面这些才会去正在执行Handler
⑤ 后端控制器Handler执行完成之后返回一个ModelAndView对象
⑥ 处理器适配器HandlerAdpater会将这个ModelAndView返回前端控制器DispatcherServlet。前端控制器会将ModelAndView对象交给视图解析器ViewResolver。
⑦ 视图解析器ViewResolver解析ModelAndView对象之后返回逻辑视图。
⑧ 前端控制器DispatcherServlet对逻辑视图进行渲染(数据填充)之后返回真正的物理View并响应给浏览器。
对组件说明:
1、 DispatherServlet:前端控制器
用户请求到达前端控制器,相当于MVC中的C,而DispatherServlet是整个流程的核心,它来调用其他组件来处理用户的请求,前端控制器的存在降低了其他组件之间的耦合度。
2、 HandlerMapping:处理器映射器
它的作用就好比去看电影要拿着电影票根据电影票上面的座位号找到座位其中座位就是Handler,电影票以及上面的座位号就是URL
HandlerMapping 负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、 HandlerAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过适配器可以对更多类型的处理器进行执行。
播放的电影是3D的你看不清楚,因此电影院跟你说你要想看清电影就必须戴3D眼镜。也就是说Handler满足一定的要求才可以被执行。
4、 Handler:后端控制器
Handler是后端控制器,在前端控制器的控制下后端控制器对具体的用户请求进行处理,Handler涉及到具体的用户业务请求,所以一般情况下需要程序员根据业务需求开发.
5、 ViewResolver:视图解析器
ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
2 第一个springMVC程序(掌握)
2.1 创建maven web工程
2.1.1 工程结构图
2.1.2 配置pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhiyou100</groupId>
<artifactId>springmvc01</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- junit start-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- junit end-->
<!--spring start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.4.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- JSP -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<finalName>springmvc01</finalName>
</build>
</project>
2.1.3 修改web.xml内容,修改为servlet3.0规范
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
2.1.4 在src/main/resources目录下创建applicationContext-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
</beans>
2.2 配置DispatcherServlet前端控制器
DispatcherServlet:前端控制器
用户请求首先到达前端控制器, DispatherServlet是整个流程的核心,它来调用其他组件来处理用户的请求,前端控制器的存在降低了其他组件之间的耦合度
在web.xml文件中添加如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- DispatcherServlet:前端控制器 配置前端控制器servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载前端控制器配置文件 上下文配置位置-->
<init-param>
<!--contextConfigLocation:指定springmvc配置的加载位置,
如果不指定则默认加 载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml(例如springmvc-servlet.xml)。
-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-servlet.xml</param-value>
</init-param>
<!-- 表示随WEB服务器启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 可以拦截二种请求
第一种:拦截固定后缀的url,比如设置为 *.do、*.action,
例如:/user/add.action 此方法最简单,不会导致静态资源(jpg,js,css)被拦截
第二种:拦截所有 设置为/,
例如:/user/add /user/add.action此方法可以实现REST风格的url
很多互联网类型的应用使用这种方式.但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示.需要特殊处理
错误设置:拦截所有,设置为/*,此设置方法错误,因为请求到Action,
当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功.
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.3 配置HandlerMapping处理器映射器
HandlerMapping:处理器映射器
它的作用就好比去看电影要拿着电影票根据电影票上面的座位号找到座位其中座位就是Handler,电影票以及上面的座位号就是URL
HandlerMapping 负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
在applicationContext-servlet.xml添加处理映射器的配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 处理器映射器 -->
<!-- 根据bean的name进行查找Handler处理器 将请求的url配置在bean的name中 -->
<!-- 这是一个默认的映射处理器,即使不配置,那么也是默认就是这个 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
</beans>
2.4 配置HandlerAdapter处理器适配器
HandlerAdapter:处理器适配器
通过HandlerAdapter对Handler(控制器)进行适配,通过适配器可以对更多类型的处理器进行适配。
播放的电影是3D的你看不清楚,因此电影院跟你说你要想看清电影就必须戴3D眼镜。也就是说Handler满足一定的要求才可以被执行。
在applicationContext-servlet.xml添加适配器的配置
<!-- HandlerAdapter适配器 -->
<!-- 注意:这个适配器不是必须配置的,这是默认的、他在servlet容器已启动就被加载-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
2.5 开发Handler后端控制器
Handler:后端控制器
Handler是后端控制器,在前端控制器的控制下后端控制器对具体的用户请求进行处理,Handler涉及到具体的用户业务请求,所以一般情况下需要程序员根据业务需求开发.
2.5.1 创建HelloController类
自定义的HelloController类需要实现springmvc的org.springframework.web.servlet.mvc.Controller接口
ackage com.zhiyou100.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//1.收集参数、验证参数
//2.绑定参数到命令对象
//3.将命令对象传入业务对象进行处理
//4.选择视图返回
ModelAndView mv = new ModelAndView();
//添加模型数据,那么这个数据可以是任意的POJO对象。
mv.addObject("hello", "hello springmvc !!");//request.setAtt..(“hello”,”hello springmvc!!”)
//设置逻辑视图路径
mv.setViewName("/WEB-INF/view/hello.jsp");//
//返回模型和视图
return mv;
}
}
ModelAndView对象封装了模型数据和视图对象,有一个组件叫视图解析器,就是用来解析这个对象的,它可以把这个对象解析成两部分一个为Model另一个为View然后将model渲染到View上面(简单点就是将model里面的数据放到页面),最终返回给用户。
2.5.2 配置自定义Handler控制器
在applicationContext-servlet.xml添加HelloController控制器的配置
<!-- Handler后端控制器 -->
<!-- 配置controller ,使用beanName:name="/hello.do"进行进行请求映射匹配-->
<bean name="/hello.do" class="com.zhiyou100.controller.HelloController"/>
2.6 定义一个响应页面
在WEB-INF/view/下创建hello.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello SpringMVC</title>
</head>
<body>
${hello}
</body>
</html>
2.7 发布项目
在浏览器输入http://localhost:8080/hello,显示如下内容,表示配置成功
2.8 配置视图解析器
ViewResolver:视图解析器
ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户
在applicationContext-servlet.xml添加视图解析器的配置
<!-- InternalResourceViewResolver:支持JSP视图解析 -->
<!-- viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar包; -->
<!-- prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为: -->
<!-- 前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,-->
<!-- 则最终返回的jsp视图地址 "WEB-INF/view/hello.jsp" -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
2.9 修改HelloController控制器
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//1.收集参数、验证参数
//2.绑定参数到命令对象
//3.将命令对象传入业务对象进行处理
//4.选择视图返回
ModelAndView mv = new ModelAndView();
//添加模型数据,那么这个数据可以是任意的POJO对象。
mv.addObject("hello", "hello springmvc !!");
//mv.setViewName("/WEB-INF/view/hello.jsp");
//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图界面
mv.setViewName("hello");
//返回模型和视图
return mv;
}
}
重复2.7章节测试过程
2.10 总结
到此HelloSpringmvc就完成了,我们主要进行了如下配置:
1、 前端控制器DispatcherServlet(在web.xml文件中配置);
2、 处理器映射器HandlerMapping(可不配置,使用默认)
3、 处理器适配器HandlerAdapter(可不配置,使用默认)
4、 处理器(后端控制器)Handler (需要编程开发和配置)
5、 视图解析器ViewResolver(只需要配置一次)
6、 视图(需要编程开发)