Spring溫故知新:WEB篇(二)Hello,World! – JAVA編程語言程序開發技術文章

在準備寫代碼之前,我們首先得把下列必備的庫導入項目:
spring-framework-2.5.6\dist\spring.jar
spring-framework-2.5.6\dist\modules\spring-webmvc.jar
spring-framework-2.5.6\lib\jakarta-commons\commons-logging.jar
spring-framework-2.5.6\lib\j2ee\jstl.jar

      隻要把這幾個文件拷貝到項目的WebContent\WEB-INF\lib目錄下,然後在eclipse裡刷新一下項目,就可以自動導入庫。

        這時候我們可以開始修改項目的WebContent\WEB-INF文件夾下的web.xml這個配置文件。
        要使用Spring來制作一個web,首先我們得在web.xml裡新建一個servlet,這個servlet的作用就是告訴tomcat容器,當一個請求符合某一種規則的時候就用Spring來負責處理這個請求。

        例如我們需要讓Spring來接管所有以.do為後綴的url請求,那麼就需要修改web.xml為以下內容:
web.xml:
Xml代碼 
<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="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"> 
    <display-name>SpringWeb</display-name> 
    <welcome-file-list> 
        <welcome-file>index.html</welcome-file> 
        <welcome-file>index.htm</welcome-file> 
        <welcome-file>index.jsp</welcome-file> 
        <welcome-file>default.html</welcome-file> 
        <welcome-file>default.htm</welcome-file> 
        <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
        <servlet-name>dispatcherServlet</servlet-name> 
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>dispatcherServlet</servlet-name> 
        <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 
</web-app> 


        如果有servlet編程基礎的話就可以知道,servlet-name節點的內容是可以自定義的,不過<servlet>和對應的<servlet-mapping>一定要有相同的servlet-name。它們分別代表瞭一個servlet的定義和servlet的映射關系。

以上這個servlet的作用,就是告訴tomcat隻要url請求是以.do為後綴的,就交給org.springframework.web.servlet.DispatcherServlet這個Spring的類來處理,而DispatcherServlet看字面意思就能明白它的作用就是一個分配器。

 

        隻要在web.xml裡成功配置好以後,我們就可以正式進入spring部分。首先我們得在web.xml的同一目錄下新建一個dispatcherServlet-servlet.xml文件。

        當然你可以在任意目錄新建一個任意文件名的xml,而且一般都會放在WEB-INF文件夾下的一個新建的自定義文件夾裡,一般為WEB-INF\conf文件夾。不過這樣的話你還得在web.xml文件裡修改一下servlet的參數。
這裡就把這個內容作為自學內容交給你自己去google吧,學會google要比學會編程更重要啊!

        那麼默認情況下是不是這個xml的文件名必須是dispatcherServlet-servlet.xml呢?回答是肯定的。
        在默認情況下,Spring會首先自動查找web.xml同一目錄下、而且文件名為servlet的名稱再加上-servlet的xml文件。
        這時候你就會發現dispatcherServlet-servlet.xml這個文件名的橫桿前部分就是之前web.xml裡的servlet-name的值、後半部分就是恒定的servlet這個單詞。
        如果之前你自定義瞭servlet-name,比如改成瞭bolide74Servlet,那麼這裡的文件名就必須是bolide74Servlet-servlet.xml。

dispatcherServlet-servlet.xml:
Xml代碼 
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 
    <!– 視圖 –> 
    <bean id="viewResolver" 
        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> 
 
    <!– 映射 –> 
    <bean id="urlMapping" 
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
        <property name="mappings"> 
            <props> 
                <prop key="helloWorld.do">helloWorld</prop> 
            </props> 
        </property> 
    </bean> 
 
    <!– action –> 
    <bean id="helloWorld" class="com.iteye.bolide74.action.HelloWorld"> 
        <property name="viewPage" value="helloWorld" /> 
    </bean> 
</beans> 


        你會發現,這個dispatcherServlet-servlet.xml其實就是一個Spring配置文件,裡面都是一個個的bean,很親切吧!
        viewResolver這個bean的作用就是告訴Spring我們的web視圖文件都是以.jsp為後綴也就是jsp頁面,它們都存放在/WEB-INF/jsp/這個文件夾下面。隻要有瞭這個bean那麼接下來的action部分就不用這麼麻煩的每次都把jsp頁面的路徑和文件名都寫全瞭。
        urlMapping就是一個映射表,它告訴瞭Spring哪種url請求對應瞭哪一個action,例如我們這裡是告訴Spring隻要url請求為helloWorld.do,那麼調用helloWorld這個bean。
        helloWorld這個bean我就不多做解釋瞭。它的註入參數為viewPage,值為helloWorld。這個helloWorld的值代表瞭這個action對應的視圖文件為/WEB-INF/jsp/helloWorld.jsp,由於上面我們在viewResolver設置過路徑和後綴,所以我們這裡隻需要輸入helloWorld就可以瞭。

最後我們總結一下這個xml的作用,就是告訴Spring我們的視圖文件為存放在/WEB-INF/jsp/目錄下的所有jsp文件,並且設置當url請求為helloWorld.do的時候就調用helloWorld這個bean來處理,並把helloWorld這個值註入瞭viewPage這個參數。

 

接下來我們新建com.iteye.bolide74.action.HelloWorld這個action類:

HelloWorld.java:
Java代碼 
package com.iteye.bolide74.action; 
 
import java.util.HashMap; 
import java.util.Map; 
 
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 HelloWorld implements Controller { 
    private String viewPage; 
 
    public String getViewPage() { 
        return viewPage; 
    } 
 
    public void setViewPage(String viewPage) { 
        this.viewPage = viewPage; 
    } 
 
 
    @Override 
    public ModelAndView handleRequest(HttpServletRequest arg0, 
            HttpServletResponse arg1) throws Exception { 
        String msg=arg0.getParameter("msgValue"); 
        msg="你輸入的值為"+msg; 
        Map model = new HashMap(); 
        model.put("msg", msg); 
        return new ModelAndView(getViewPage(), model); 
    } 


這個類實現瞭Controller接口,這個接口是由Spring提供的。它其實是起到瞭一個代理作用,還記得以前的AOP代理麼?忘記瞭的話可以回頭復習一下。

這個類有一個viewPage成員屬性,使用瞭set/get註入。當然你也可以用自定義的屬性。它的值代表瞭這個action所對應的視圖文件的文件名,這個我們之前有提到過。

Controller接口有一個handleRequest抽象方法,它的類型為ModelAndView,這個類型是Spring提供的,它的命名就是它的作用,後面我會詳細介紹一下這個類型。簡單的說就是這個類包含瞭一個url請求的參數數據和視圖內容。如果你知道MVC,那麼這個類就包含瞭其中的M和V而Controller接口就是那個C。
這裡的handleRequest方法我們在"原Model"裡嵌入瞭一個msg參數,它的值為HttpServletRequest獲取的msgValue這個URL參數的值。


最後在/WEB-INF/jsp/目錄下新建一個helloWorld.jsp視圖文件:
helloWorld.jsp:
Html代碼 
<%@ 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>Insert title here</title> 
</head> 
<body> 
    <form action="helloWorld.do"> 
        <input type="text"  name="msgValue"  value="" />  
        <input type="submit"  value="speak" /> 
    </form> 
    <%=request.getAttribute("msg")%> 
</body> 
</html> 

這個我想都看的懂吧,就是一個傳統的jsp頁面。裡面就一個form,註意到name為msgValue的文本輸入框瞭沒?上面的HelloWorld.java的作用獲取的就是這裡的msgValue的值然後處理瞭一下再返回給客戶端。

 

好瞭,大功告成,我們直接F11啟動,註意是Run on Server,這時候eclipse會新建一個內置瀏覽器標簽,瀏覽器裡的url地址為http://localhost:8080/SpringWeb/WEB-INF/jsp/helloWorld.jsp但是頁面內容卻顯示的是404錯誤。
這是由於tomcat的安全機制,客戶端是無法直接訪問WEB-INF這個文件夾以及它下面的所有文件的,因此我們才會把所有重要的配置文件、視圖源碼之類的都放在這個文件夾下面。

我們要看到勞動成功,就得在地址欄裡輸入URL為:http://localhost:8080/SpringWeb/helloWorld.do  如果你全部按步驟進行,那麼現在你就能看到頁面內容為

 

在輸入框裡輸入Hello,World!再點擊Speak按鈕,你就能看到“你輸入的值為Hello,World!”
恭喜你,終於入門Spring Web編程瞭。

 


最後再拋出一個問題,當你在輸入框內輸入中文“你好!”的時候,頁面返回給你的內容卻是一段亂碼,這該怎麼辦呢?這就是我們下一篇必須要解決的問題,你可以先自己google一下。

發佈留言