SpringMVC简介
表示层框架
SpringMVC本身是Spring3.x表示层的一部分,
SpringMVC不强制要求使用jsp页面作为视图层(因为它有视图定位器),
struts1和struts2要求使用jsp页面作为视图层
MVC :Model-View-Control
框架性质的C 层要完成的主要工作:封装web 请求为一个数据对象、调用业务逻辑层来处理数据对象、返回处理数据结果及相应的视图给用户。
简要概述springmvc
Spring C 层框架的核心是 DispatcherServlet,它的作用是将请求分发给不同的后端处理器,也即 使用了一种被称为Front Controller 的模式(后面对此模式有简要说明)。 Spring 的C 层框架使用了后端控制器来、映射处理器和视图解析器来共同完成C 层框架的主要工作。并且spring 的C 层框架还真正地把业务层处理的数据结果和相应的视图拼成一个对象,即我们后面会经常用到的ModelAndView 对象。
优点:
使用简单
编写程序容易
使用灵活
常见的MVC框架比较
1、运行性能上:
Jsp+servlet > struts1 > spring mvc > struts2+freemarker> struts2,ognl,值栈。
2、开发效率上,基本正好相反
值得强调的是,spring mvc开发效率和struts2不相上下。
Struts2的性能低的原因是因为OGNL和值栈造成的。所以,如果你的系统并发量高,可以使用freemaker进行显示,而不是采用OGNL和值栈。这样,在性能上会有相当大得提高。
SpringMVC开发环境搭建步骤
pringmvc项目需在tomcat6.0以上服务器上工作
1、找到开发spring3mvc应用需要使用到的jar文件.
下载spring-framework-3.x.x.RELEASE.zip.
下载完后解压文件,开发spring3mvc应用需要依赖的jar文件在解压目录的lib文件夹下。
不同的应用需要的JAR包是不同的。下面给出了开发spring3mvc程序最少需要的JAR及相关作用
org.springframework.aop-3.0.5.RELEASE.jar :与Aop 编程相关的包
org.springframework.beans-3.0.5.RELEASE.jar :提供了简捷操作bean 的接口
org.springframework.context-3.0.5.RELEASE.jar :构建在beans 包基础上,用来处理资源文件及国际化。
org.springframework.core-3.0.5.RELEASE.jar :spring 核心包
org.springframework.web-3.0.5.RELEASE.jar :web 核心包,提供了web 层接口
org.springframework.web.servlet-3.0.5.RELEASE.jar :web 层的一个具体实现包,DispatcherServlet也位于此包中。
为了方便,建议在搭建环境中导入spring3.0 的所有jar 包(所有jar 包位于dist 目录下)。
2、编写spring3mvc的配置文件
spring3mvc中,框架是通过DispatcherServlet启动的。
在web.xml中的配置如下:
<servlet>
<servlet-name>spmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
简要说明 :
DispatcherServlet 就是一个Servlet ,也是对请求进行转发的核心Servlet 。在这里即所有.do 的请求将首先被DispatcherServlet 处理。
而DispatcherServlet 它要作的工作就是对请求进行分发(也即是说把请求转发给具体的Controller )。
可以简单地认为,它就是一个总控处理器,但事实上它除了具备总控处理理器对请求进行分发的能力外,还与spring 的IOC 容器完全集成在一起,从而可以更好地使用spring 的其它功能。
在这里还需留意DispatcherServlet 命名为 spmvc
< servlet-name > spmvc 因为我们将在在 WEB-INF 目录下建立一个名为 spmvc -servlet.xml 的文件
spring3mvc的配置文件的命名规则: servlet-name-servlet.xml 。
DispatcherServlet在初始化时将会在WEB-INF/下寻找该文件,该文件的配置模版如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
</beans>
在配置文件spmvc-servlet.xml 中加入如下配置:
<beans>
helloControl
</beans>
它配置了以下功能:
1、配置 SimpleUrlHandlerMapping(处理器映射器,又叫指令分派器)
在上面的配置文件中, /hello.do 的请求将被 helloController 处理。 “/hello.do”和“helloController” 是变量, 你可以更改。
但是你注意到了吗, hello.do 以 .do 作为后缀名。 如果这里(本文的条件下)你不使用.do 作为后缀名, 就没有程序来处理这个请求了。因为 DispatcherServlet 将收到的请求转交给 SimpleUrlHandlerMapping, DispatcherServlet 收不到的请求,SimpleUrlHandlerMapping 当然也收不到了。
2、你可以在 props 标签内配置多个 prop 标签.
hello.do的请求将交由名字为helloControl的bean本例为com.asm.HelloWord进行处理
例子中使用到com.asm.HelloWord类如下:
package com.asm;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWord implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
ModelAndView mav = new ModelAndView("hello.jsp");
mav.addObject("message", "Hello World!");
return mav;
}
说明 :
ModelAndView 对象是包含视图和业务数据的混合对象,即是说通过此对象,我们可以知道所返回的相应页面(比如这里返回hello.jsp 页面),也可以在相应的页面中获取此对象所包含的业务数据(比如这里message world )。
例子中使用到的web 根目录下/hello.jsp主要代码如下:
<body>
世界,你好!获取值: ${message }<br>
</body>
注: spring3mvc可以直接使用EL表达式访问ModelAndView对象中的属性。
访问HelloWorld应用的url:http://127.0.0.1:8080/springMVC_01_helloword/hello.do
SpringMVC执行流程
1、tomcat一启动,读取web.xml,创建DispatcherServlet对象
2、到项目的WEB-INF下找到主配文件,创建web工厂,一创建web工厂就会创建指令分派器对象、业务层前端控制器对象
3、浏览器发请求,tomcat首先创建request对象接收请求参数,然后看到是请求是.do,根据web.xml配置就把请求交给DispatcherServlet。DispatcherServlet拿到请求后,首先进行截取(/hello.do),然后到web工厂里拿到请求分派器(simpleUrlHandlerMapping),根据请求分派器里的prop的key(截取的请求信息)找到对应的value(后台控制器的id),然后根据value到web工厂里找到对应的控制器对象(相当于struts里的action),自动执行这个对象的handleRequest方法,把request和response注入。返回值类型是ModelAndView(相当于struts里的ActionForward)。最后返回给DispatcherServlet。
DispatcherServlet如何处理返回的结果
1、DispatcherServlet从ModelAndView里拿到view,map。
2、又把从map里拿到的key和value设到request内置对象里。
3、最后服务端跳转到视图组件所标识的页面上
ModelAndView的数据结构
有一个view(存放转向视图的字符串)和一个map(存放结果信息)
SimpleUrlHandlerMapping:处理器/映射器/指令分派器
@Controller 标明的类是:后端控制器(服务器一启动就创建)
创建web工厂创建三个对象
请求分派器对象
后端控制器对象(单例的,1个)
视图定位器对象
异常处理器
先生成bean工厂然后生成session工厂