SpringMVC簡介
表示層框架
SpringMVC本身是Spring3.x表示層的一部分,
SpringMVC不強制要求使用jsp頁面作為視圖層(因為它有視圖定位器),struts1和struts2要求使用jsp頁面作為視圖層
MVC :Model-View-Control
框架性質(zhì)的C 層要完成的主要工作:封裝web 請求為一個數(shù)據(jù)對象、調(diào)用業(yè)務邏輯層來處理數(shù)據(jù)對象、返回處理數(shù)據(jù)結(jié)果及相應的視圖給用戶。
簡要概述springmvc
Spring C 層框架的核心是 DispatcherServlet,它的作用是將請求分發(fā)給不同的后端處理器,也即 使用了一種被稱為Front Controller 的模式(后面對此模式有簡要說明)。 Spring 的C 層框架使用了后端控制器來、映射處理器和視圖解析器來共同完成C 層框架的主要工作。并且spring 的C 層框架還真正地把業(yè)務層處理的數(shù)據(jù)結(jié)果和相應的視圖拼成一個對象,即我們后面會經(jīng)常用到的ModelAndView 對象。
SpringMVC優(yōu)點
1、代碼量少,配置量少,學習難度小
2、編寫程序快,流程清晰
3、靈活
4、開發(fā)效率和struts2不相上下,但是運行性能上比struts2快
常見的MVC框架比較
1、運行性能上:
Jsp+servlet > struts1 > spring mvc > struts2+freemarker> struts2,ognl,值棧。
2、開發(fā)效率上,基本正好相反
值得強調(diào)的是,spring mvc開發(fā)效率和struts2不相上下。
Struts2的性能低的原因是因為OGNL和值棧造成的。所以,如果你的系統(tǒng)并發(fā)量高,可以使用freemaker進行顯示,而不是采用OGNL和值棧。這樣,在性能上會有相當大得提高。
SpringMVC開發(fā)環(huán)境搭建步驟
Springmvc項目需在tomcat6.0以上服務器上工作
1、找到開發(fā)spring3mvc應用需要使用到的jar文件.
下載spring-framework-3.x.x.RELEASE.zip.
下載完后解壓文件,開發(fā)spring3mvc應用需要依賴的jar文件在解壓目錄的lib文件夾下。
不同的應用需要的JAR包是不同的。下面給出了開發(fā)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 :構(gòu)建在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 層的一個具體實現(xiàn)包,DispatcherServlet也位于此包中。
為了方便,建議在搭建環(huán)境中導入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 ,也是對請求進行轉(zhuǎn)發(fā)的核心Servlet 。在這里即所有.do 的請求將首先被DispatcherServlet 處理。
而DispatcherServlet 它要作的工作就是對請求進行分發(fā)(也即是說把請求轉(zhuǎn)發(fā)給具體的Controller )。
可以簡單地認為,它就是一個總控處理器,但事實上它除了具備總控處理理器對請求進行分發(fā)的能力外,還與spring 的IOC 容器完全集成在一起,從而可以更好地使用spring 的其它功能。
在這里還需留意DispatcherServlet 命名為 spmvc
< servlet-name > spmvc 因為我們將在在 WEB-INF 目錄下建立一個名為 spmvc -servlet.xml 的文件
spring3mvc的配置文件的命名規(guī)則: 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>
<bean id = "simpleUrlHandlerMapping" class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name ="mappings">
<props>
<prop key ="/hello.do">helloControl</prop>
</props>
</property>
</bean>
<bean id ="helloControl" class ="com.asm.HelloWord"/>
</beans>
它配置了以下功能:
1、配置 SimpleUrlHandlerMapping(處理器映射器,又叫指令分派器)
在上面的配置文件中, /hello.do 的請求將被 helloController 處理。 “/hello.do”和“helloController” 是變量, 你可以更改。
但是你注意到了嗎, hello.do 以 .do 作為后綴名。 如果這里(本文的條件下)你不使用.do 作為后綴名, 就沒有程序來處理這個請求了。因為 DispatcherServlet 將收到的請求轉(zhuǎn)交給 SimpleUrlHandlerMapping, DispatcherServlet 收不到的請求,SimpleUrlHandlerMapping 當然也收不到了。
2、你可以在 props 標簽內(nèi)配置多個 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 對象是包含視圖和業(yè)務數(shù)據(jù)的混合對象,即是說通過此對象,我們可以知道所返回的相應頁面(比如這里返回hello.jsp 頁面),也可以在相應的頁面中獲取此對象所包含的業(yè)務數(shù)據(jù)(比如這里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執(zhí)行流程
1、tomcat一啟動,讀取web.xml,創(chuàng)建DispatcherServlet對象
2、到項目的WEB-INF下找到主配文件,創(chuàng)建web工廠,一創(chuàng)建web工廠就會創(chuàng)建指令分派器對象、業(yè)務層前端控制器對象
3、瀏覽器發(fā)請求,tomcat首先創(chuàng)建request對象接收請求參數(shù),然后看到是請求是.do,根據(jù)web.xml配置就把請求交給DispatcherServlet。DispatcherServlet拿到請求后,首先進行截?。?hello.do),然后到web工廠里拿到請求分派器(simpleUrlHandlerMapping),根據(jù)請求分派器里的prop的key(截取的請求信息)找到對應的value(后臺控制器的id),然后根據(jù)value到web工廠里找到對應的控制器對象(相當于struts里的action),自動執(zhí)行這個對象的handleRequest方法,把request和response注入。返回值類型是ModelAndView(相當于struts里的ActionForward)。最后返回給DispatcherServlet。
DispatcherServlet如何處理返回的結(jié)果
1、DispatcherServlet從ModelAndView里拿到view,map。
2、又把從map里拿到的key和value設到request內(nèi)置對象里。
3、最后服務端跳轉(zhuǎn)到視圖組件所標識的頁面上
ModelAndView的數(shù)據(jù)結(jié)構(gòu)
有一個view和一個map(存放結(jié)果信息)