2.5、Hello World入門
2.5.1、準備開發環境和運行環境:
☆開發工具:eclipse
☆運行環境:tomcat6.0.20
☆工程:動態web工程(springmvc-chapter2)
☆spring框架下載:
spring-framework-3.1.1.RELEASE-with-docs.zip
☆依賴jar包:
1、? Spring框架jar包:
為了簡單,將spring-framework-3.1.1.RELEASE-with-docs.zip/dist/下的所有jar包拷貝到項目的WEB-INF/lib目錄下;
2、? Spring框架依賴的jar包:
需要添加Apache commons logging日志,此處使用的是commons.logging-1.1.1.jar;
需要添加jstl標簽庫支持,此處使用的是jstl-1.1.2.jar和standard-1.1.2.jar;
2.5.2、前端控制器的配置
在我們的web.xml中添加如下配置:
<servlet> <servlet-name>chapter2</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>chapter2</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
load-on-startup:表示啟動容器時初始化該Servlet;
url-pattern:表示哪些請求交給Spring Web MVC處理, “/” 是用來定義默認servlet映射的。也可以如“*.html”表示攔截所有以html為擴展名的請求。
?
自此請求已交給Spring Web MVC框架處理,因此我們需要配置Spring的配置文件,默認DispatcherServlet會加載WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。本示例為WEB-INF/ chapter2-servlet.xml。
?
2.5.3、在Spring配置文件中配置HandlerMapping、HandlerAdapter
具體配置在WEB-INF/ chapter2-servlet.xml文件中:
<!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
BeanNameUrlHandlerMapping:表示將請求的URL和Bean名字映射,如URL為 “上下文/hello”,則Spring配置文件必須有一個名字為“/hello”的Bean,上下文默認忽略。
SimpleControllerHandlerAdapter:表示所有實現了org.springframework.web.servlet.mvc.Controller接口的Bean可以作為Spring Web MVC中的處理器。如果需要其他類型的處理器可以通過實現HadlerAdapter來解決。
2.5.4、在Spring配置文件中配置ViewResolver
具體配置在WEB-INF/ chapter2-servlet.xml文件中:
<!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
InternalResourceViewResolver:用于支持Servlet、JSP視圖解析;
??? viewClass:JstlView表示JSP模板頁面需要使用JSTL標簽庫,classpath中必須包含jstl的相關jar包;
??? prefix和suffix:查找視圖頁面的前綴和后綴(前綴[邏輯視圖名]后綴),比如傳進來的邏輯視圖名為hello,則該該jsp視圖頁面應該存放在“WEB-INF/jsp/hello.jsp”;
?
2.5.5、開發處理器/頁面控制器
package cn.javass.chapter2.web.controller; 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 HelloWorldController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { //1、收集參數、驗證參數 //2、綁定參數到命令對象 //3、將命令對象傳入業務對象進行業務處理 //4、選擇下一個頁面 ModelAndView mv = new ModelAndView(); //添加模型數據 可以是任意的POJO對象 mv.addObject("message", "Hello World!"); //設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面 mv.setViewName("hello"); return mv; } }
org.springframework.web.servlet.mvc.Controller:頁面控制器/處理器必須實現Controller接口,注意別選錯了;后邊我們會學習其他的處理器實現方式;
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) :功能處理方法,實現相應的功能處理,比如收集參數、驗證參數、綁定參數到命令對象、將命令對象傳入業務對象進行業務處理、最后返回ModelAndView對象;
ModelAndView:包含了視圖要實現的模型數據和邏輯視圖名;
“mv.addObject("message", "Hello World!");”表示添加模型數據,此處可以是任意POJO對象;
“mv.setViewName("hello");”表示設置邏輯視圖名為“hello”,視圖解析器會將其解析為具體的視圖,如前邊的視圖解析器InternalResourceViewResolver會將其解析為“WEB-INF/jsp/hello.jsp”。
?
我們需要將其添加到Spring配置文件(WEB-INF/chapter2-servlet.xml),讓其接受Spring IoC容器管理:
<!-- 處理器 --> <bean name="/hello" class="cn.javass.chapter2.web.controller.HelloWorldController"/>
name="/hello":前邊配置的BeanNameUrlHandlerMapping,表示如過請求的URL為 “上下文/hello”,則將會交給該Bean進行處理。?
2.5.6、開發視圖頁面
創建 /WEB-INF/jsp/hello.jsp視圖頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title> </head> <body> ${message} </body> </html>
${message}:表示顯示由HelloWorldController處理器傳過來的模型數據。
2.5.6、啟動服務器運行測試
通過請求:http://localhost:9080/springmvc-chapter2/hello,如果頁面輸出“Hello World! ”就表明我們成功了!
?
?
2.5.7、運行流程分析
如圖2-3
圖2-3
運行步驟:
1、? 首先用戶發送請求http://localhost:9080/springmvc-chapter2/hello——>web容器,web容器根據“/hello”路徑映射到DispatcherServlet(url-pattern為/)進行處理;
2、? DispatcherServlet——>BeanNameUrlHandlerMapping進行請求到處理的映射,BeanNameUrlHandlerMapping將“/hello”路徑直接映射到名字為“/hello”的Bean進行處理,即HelloWorldController,BeanNameUrlHandlerMapping將其包裝為HandlerExecutionChain(只包括HelloWorldController處理器,沒有攔截器);
3、? DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter將HandlerExecutionChain中的處理器(HelloWorldController)適配為SimpleControllerHandlerAdapter;
4、? SimpleControllerHandlerAdapter——> HelloWorldController處理器功能處理方法的調用,SimpleControllerHandlerAdapter將會調用處理器的handleRequest方法進行功能處理,該處理方法返回一個ModelAndView給DispatcherServlet;
5、? hello(ModelAndView的邏輯視圖名)——>InternalResourceViewResolver, InternalResourceViewResolver使用JstlView,具體視圖頁面在/WEB-INF/jsp/hello.jsp;
6、? JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,將在處理器傳入的模型數據(message=HelloWorld!)在視圖中展示出來;
7、? 返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。
?
到此HelloWorld就完成了,步驟是不是有點多?而且回憶下我們主要進行了如下配置:
?
1、? 前端控制器DispatcherServlet;
2、? HandlerMapping
3、? HandlerAdapter
4、? ViewResolver
5、? 處理器/頁面控制器
6、? 視圖
?
因此,接下來幾章讓我們詳細看看這些配置,先從DispatcherServlet開始吧。