Spring 角色:
1、核心控制器DispatcherServlet
它類似于struts中的ActionServlet,WebWork中的ServletDispacher.
負責攔截主求,將請求參數封裝成對象,然后根據處理器映射策略,將請求轉發給不同的業務控制器。DispatcherServlet應該配置成load-on-startup Servlet方式,它不僅負責處理請求,而且負責創建ApplicationContext,核心控制器啟動時加載,在web.xml配置如下。
<servlet>
<servlet-name>firstmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>firstmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如上面配置,DispatcherServlet應對的配置文件是firstmvc-servlet.xml文件。<servlet-name>firstmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>firstmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2、業務控制器
不管直接實現還是繼承實現類,Spring的業務控制器都必須實現Controller接口,Spring提供了多種控制器實現的接口。這個業務控制器等同于Struts中的Action類,但兩者實現方法不一樣.Struts使用了類繼承,Spring使用了接口。并提供了以下實現類
AbstractController 功以有限通常不支持使用
ParameterizableViewController :與上面那個類相似,但可以返回視圖名,而不是硬編碼的視圖名
UrlFilenameViewController : 根據URL并獲取請求的文件名
ServletForwardingController: 將請求轉發給某Servlet。
SimpleFormController : 用于處理表單參數的控制器
MultiActionController : 多動作控制器
AbstractCommandController :命令控制器
在這里詳說MultiActionController,其它控制器自己找資料
MultiActionController有兩種使用方式
1、繼承MultiActionController,并在子類中指定MethodNameResolver解析的方法,在這種情況下,不需要配置Delegate參數
2、不繼承MultiActionController,將動作定義在代理對象里,由代理調用Resolver解析的方法。
MethodNameResolver主要有如下三種實現,需要的時候可以也可以自己提供
1、ParameterMethodNameResolver,解析特定參數值,將參數值作為方法名。
2、InternalPathMethodNameResolver:從請求路徑中解析文件名作為方法名。
3、PropertiesMethodNameResolver:使用自定義屬性對象,將請求的URL景射到方法名.
firstmvc-servlet.xml配置如下:
<!-- 動作代理 -->
<bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>method</value>
</property>
</bean>
<bean name="/paramMultiController.do" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<property name="methodNameResolver">
<ref bean="paramResolver"/>
</property>
<property name="delegate">
<ref bean="sampleDelegate"/>
</property>
</bean>
<bean id="sampleDelegate" class="com.mvc.SampleDelegate" />
<bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>method</value>
</property>
</bean>
<bean name="/paramMultiController.do" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<property name="methodNameResolver">
<ref bean="paramResolver"/>
</property>
<property name="delegate">
<ref bean="sampleDelegate"/>
</property>
</bean>
<bean id="sampleDelegate" class="com.mvc.SampleDelegate" />
3、處理影射
控制器根據該策略,將請求轉發給對應的業務控制器。通常有下面兩種策略
BeanNameUrlHandlerMapping 根據請求名轉發
SimpleUrlHandlerMapping 根據定義轉發請求
HandlerMapping 的基本功能是將請求傳遞到HandlerExecutionChain。BeanNameUrlHandlerMapping 是一個簡單而強大的控制映射器,它將HTTP的請求映射轉發給context中同名的bean。firstmvc-servlet.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean name="/hello.do" class="com.mvc.HelloAction">
<property name="jsp">
<value>WEB-INF/jsp/hello.jsp</value>
</property>
</bean>
</beans>
HelloAction.java代碼如下:<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean name="/hello.do" class="com.mvc.HelloAction">
<property name="jsp">
<value>WEB-INF/jsp/hello.jsp</value>
</property>
</bean>
</beans>
package com.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloAction implements Controller{
public String jsp;
public void setJsp(String jsp){
this.jsp=jsp;
}
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
return new ModelAndView(jsp,"model",null);
}
}
SimpleUrlHandlerMapping 是功能強大的控制器映射,但不喜歡用,import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloAction implements Controller{
public String jsp;
public void setJsp(String jsp){
this.jsp=jsp;
}
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
return new ModelAndView(jsp,"model",null);
}
}
用的時候再找資料吧。。。。
4、視圖和視圖解析
5、模型
Spring根本沒提供專門的模型角色,Spring的Model對象由普通map對象充當,Key不能為空,值可以為空
6、Command對象
Command對象是普通的java對象,用于封裝用記請求參數