spring web mvc 感覺就是高大上啊!啥都是配置文件就可以了。所以第一步就是弄清楚配置文件使用和整體框架的流程!
Spring web mvc最重要的當然是Controller,也就是首先要明白的就是Dispatch,它將用戶的請求轉化成Controller處理的對象。在
在Spring的Web MVC中,擔任前段控制器角色的是org.springframework.web.servlet.DispatcherServlet.DispatcherServlet負責將客戶的請求分配給控制對象,所以使用Spring Web MVC的第一步就是在Web.xml中定義DispatcherServlet.
<span style="font-family:Courier New;font-size:14px;"><servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping></span>
DispatcherServlet 實例是 dispatcherServlet。從url-pattern可以知道它攔截.do的任意請求。“contextConfigLocation”初始參數用來設定Bean定義文件的位置與名稱,如果不設置“contextConfigLocation”初始參數,則DispatcherServlet默認會使用Servlet的名稱爲前置,讀取“Servlet名稱-servlet.xml”作爲其Bean定義文件,在上面的設定中則會讀取mvc-config.xml當然你也可以定義多個Bean定義文件的來源.
<span style="font-family:Courier New;"><servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-config.xml,/WEB-INF/other-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping></span>
DispatcherServlet負責分配請求至控制對象(Controller),在Spring Web MVC中,控制對象要實現org.springframework.web.servlet.mvc.Controller接口,Controller接口有一個不許實現的handleRequest()
<span style="font-family:Courier New;font-size:14px;">public interface Controller {
ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception;
}</span>
當Controller接收到DispatcherServlet分配的請求時,會執行handleRequest()方法來處理請求,處理完成後回傳一個org.springframework.web.servlet.ModelAndView的實例.ModelAndView包括了要呈現在View層的Model數據,以及其他View層的相關信息。
<span style="font-family:Courier New;font-size:14px;">public class HellowController implements Controller {
private String viewPage;
public void setViewPage(String viewPage) {
this.viewPage = viewPage;
}
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String user = request.getparameter("user");
retrun new ModelAndView(viewPage, "user", user);
}
}</span>
在這個Controller中,取得來自使用者的user請求參數,並設定在ModelAndView的實例中,在這個例子中,高見ModelAndView的第一個自變量爲要呈現的目標網頁(或資源)路徑,第二個自變量是設定用來取得Model對象的鍵(key),而第三個自變量是個View層呈現數據的Model對象我們可以在xml文件設定Controller請求處理完畢之後,所要呈現數據的網頁路徑,來看一下Bean定義文件的內容,依據web.xml中對dispatcherServlet的初始參數設定爲mvc-config.xml,如果沒有初始參數的話,默認會調用dispatcherServlet-servlet.xml文件
<span style="font-family:Microsoft YaHei;font-size:14px;"> </span><span style="font-family:Courier New;font-size:14px;"><bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean name="/hello.do"
class="包路徑.HellowController">
<property name="viewPage">
<value>hello</vlaue>
</property>
</bean></span>
實際上DispatcherServlet必須根據一個HandlerMapping對象,決定請求由哪一個Controller來處理,DispatcherServlet默認使用org.springframework.web.servlet.handler.BeanNameUrlHandlerMappin,也就是根據Bean在定義時的"name"屬性及使用者請求的URL,決定使用哪一個Controller實例,例如上面的例子,請求/.../hello.do時,DispatcherServlet根據"hello.do",決定要使用"name"爲"hello.do"的Bean實例,所以根據上面的設定,就會將請求交給HelloController的實例來處理。在Controller返回ModelAndView後,DispatcherServlet會交由ViewResolver對象來作View層的相關解析,因而你需要設置一個ViewResolver實例,在這個例子中將一jsp作爲View層技術,所以使用org.springframework.web.servlet.view.InternalResourceViewResolve, InternalResourceViewResolver需要設置"viewClass",默認是org.springframework.web.servlet.InternalResourceView,這個類支持Servlet技術的相關資源。InternalResourceViewResolver的"prefix"和"suffix"屬性會與ModelAndView返回的路徑信息借個,例如路徑信息返回爲"hello"字符串,則與以上的例子設定結合,實際路徑就是/WEB-INF/jsp/hello.jsp。