1.1 spring mvc简介
Spring mvc是一个类似于struts的mvc框架。那么有程序猿会说,我学了struts,为啥还要学spring mvc?请看下面一组比较:
运行性能上:
Jsp+servlet>struts1>springmvc>struts2+freemarker>>struts2,ognl,值栈。
开发效率上,基本正好相反。值得强调的是,spring mvc开发效率和struts2不相上下。
采用spring mvc很容易就能写出性能优秀的代码,而采用struts2一不小心就会写出糟糕的代码,使程序的性能很低。
Springmvc C层框架的核心是 DispatcherServlet,它的作用是将请求分发给不同的后端处理器,也即使用了一种被称为Front Controller(前端控制器)的模式。Springmvc 的C 层框架使用了后端控制器来、映射处理器和视图解析器来共同完成C 层框架的主要工作。并且springmvc 的C 层框架还真正地把业务层处理的数据结果和相应的视图拼成一个对象,即我们后面会经常用到的ModelAndView对象。
1.2 开发环境
开发工具:myeclipse8.6.1
数据库:mysql5.5.23
服务器: tomcat6.0.37
框架版本: spring3.2.2
1.3 Hello world程序开发
步骤一:在myeclipse8.6中新建web工程springmvc01,拷贝如下包到lib目下:
说明:commons-logging-1.1.3.jar是日志包,在下载的struts2官方包里面可以找到。其它的包都在spring3.2.2版本官方包里面找到。
spring-aop-3.2.2.RELEASE.jar:与Aop 编程相关的包
spring-beans-3.2.2.RELEASE.jar:提供了简捷操作bean 的接口
spring-context-3.2.2.RELEASE.jar:构建在beans 包基础上,用来处理资源文件及国际化。
spring-core-3.2.2.RELEASE.jar:spring 核心包
spring-web-3.2.2.RELEASE.jar:web 核心包,提供了web 层接口
spring-webmvc-3.2.2.RELEASE.jar:web 层的一个具体实现包,DispatcherServlet也位于此包中。
注意:以上包是springmvc开发所需要的最基本包,不能再精简。
步骤二:编写web.xml 配置文件,代码如下:
=================================web.xml========================
<?xmlversion="1.0" encoding="UTF-8"?>
<web-appversion="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
================================================================
说明: org.springframework.web.servlet.DispatcherServlet这里其实是不需要及记住的,在src目录下随便新建一个类,然后输入dispa,按下快捷键,就会出现这串代码,然后拷贝过来即可。
知识讲解: DispatcherServlet 就是一个Servlet ,也是对请求进行转发的核心Servlet 。在这里即所有.do 的请求将首先被DispatcherServlet 处理,而DispatcherServlet它要作的工作就是对请求进行分发(也即是说把请求转发给具体的Controller )。可以简单地认为,它就是一个总控处理器,但事实上它除了具备总控处理理器对请求进行分发的能力外,还与spring 的IOC 容器完全集成在一起,从而可以更好地使用spring 的其它功能。在这里还需留意
<servlet-name > springmvc </ servlet-name > ,下面会用到。
当然我们也可以多加一个
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.php</url-pattern>
</servlet-mapping>
拦截后缀是.php的请求步骤三: 在web-inf目录下建立springmvc-servlet.xml的配置文件,它的命名规则{servlet-name}-servlet.xml ,注意下划线处。当DispatcherServlet启动的时候,它会默认根据此规则到web-inf目录下去找这个xml配置文件。
=========================springmvc-servlet.xml==========================
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<beanid="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<propertyname="mappings">
<props>
<propkey="/hello.do">helloControl</prop>
</props>
</property>
</bean>
<bean id="helloControl" class="com.wx.controls.HelloWorld"></bean>
</beans>
==========================================================
注意:<!DOCTYPEbeansPUBLIC"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
这段文档类型定义是不需要我们记的,在如图所示的地方可以找到。
知识讲解:[<beanid="simpleUrlHandlerMapping"]是配置一个映射处理器,把
/hello.do的请求交给名为helloControl的bean处理,注意上面画横线处。
步骤四:编写控制器HelloWord.java,如下所示:
================================== HelloWord.java===================
package com.wx.controls;
import javax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloWorld implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("hello.jsp");
mav.addObject("message","HelloWorld!");
return mav;
}
}
====================================================================
知识讲解:Controller是后端控制器的接口,springmvc会把对应的请求交给实现它的方法handleRequest去处理。ModelAndView 对象是包含视图和业务数据的混合对象,即是说通过此对象,我们可以知道所返回的相应页面(比如这里返回hello.jsp 页面),也可以在相应的页面中获取此对象所包含的业务数据(相当于完成了servlet中的 request.setAttribute()和request.getRequestDispatcher("hello.jsp")两个工作),当然我们也可以new ModelAndView("forward:hello.do")的方式进行转发请求,也可以new ModelAndView("redirect:hello.jsp")的方式重定向请求。
步骤五:在webroot根目录下编写hello.jsp,如下所示:
================================hello.jsp==========================
<body>
<h1>获取值:${requestScope.message}</h1>
</body>
==================================================================
步骤六: 启动tomcat,发布项目,在地址栏输入 http://localhost:8080/springmvc01/hello.do 进行测试。
Springmvc工作原理简析:
(1 )启动服务器,根据web.xml 的配置加载前端控制器(也称总控制器) DispatcherServlet 。加载(包括加载springmvc-servlet.xml)时会完成一系列的初始化动作。
(2 )根据servlet 的映射请求(上面的helloWorld 实例中针对.do 请求),并参照“控制器配置文件(即springmvc-servlet.xml 这样的配置文件),把具体的请求分发给特定的后端控制器进行处理(比如上例会分发给HelloWorld 控制器进行处理)
(3 )后端控制器调用相应的逻辑层代码,完成处理并返回视图对象(ModelAndView )给前端处理器。
(4 )前端控制器根据后端控制器返回的 ModelAndView 对象,并结合一些配置(后续有说明),返回一个相应的页面给客户端。
小结 :这种Front Controller 模式常应用在主流的web 框架中,比如典型的struts1.x 框架FrontController 模式:所有请求先交给一个前端处理器(总控处理器)处理,然后前端处理器会参照一些配置文件再把具体的请求交给相应的后端处理器。后端处理器调用逻辑层代码,并根据逻辑返回相应的视图对象给前端控制器。然后前端控制器再根据视图对象返回具体的页面给客户端(提示:和spring mvc一样,在struts1.x 中前端控制器是Servlet, 而在struts2 中前端控制器是Filter )。 概述FrontController 模式:前端控制器预处理并分发请求给后端控制器,后端控制器进行真正的逻辑处理并返回视图对象,前端控器器根据视图对象返回具体页面给客户端。
联系作者: