JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java Tools  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 第一個Spring MVC Web程式
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2004-11-01 20:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在進行這個程式之前,請您先完成「第一個Spring程式」:
http://www.javaworld.com.tw/jute/post/view?bid=11&id=75390&sty=1&tpg=1&age=0

我們的第一個Spring MVC Web程式將使用Tomcat 5.0.28來示範,我們在webapps目錄下建立一個springapp目錄,這次為了方便,我們直接使用spring.jar,以及其相依的commons-logging.jar,請將這兩個jar放到 springapp/WEB-INF/lib下。

Spring MVC框架的中心是dispatcher:org.springframework.web.servlet.DispatcherServlet。DispatcherServlet負責將Web請求分派(dispatch)給handler,Spring為handler定義了預設介面:org.springframework.web.servlet.mvc.Controller:
1
2
3
public interface Controller {
    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception;
}


DispatcherServlet分派請求的根據是委託給實作org.springframework.web.servlet.HandlerMapping介面的物件來處理,例如org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,請求與handler之間的映射是撰寫在Bean定義檔中。

DispatcherServlet本身是一個Servlet,我們要先在web.xml中定義:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="ISO-8859-1"?>
                                                                               
<web-app 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"
    version="2.4">
                                                                               
    <description>
        Spring App Examples.
    </description>
    <display-name>Spring App Examples</display-name>
    
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
                                                                               
</web-app>


在web.xml中,我們定義了一個DispatcherServlet的實例hello,所有*.do結尾的請求都會由它來處理,DispatcherServlet預設會使用Servlet的名稱為前置,讀取name-servlet.xml作為其Bean定義檔,以上面的設定即讀取hello-servlet.xml。依這個機制,如果您要多個模組,可以定義不同的名稱來使用多個DispatcherServlet的實例,並分別讀取不同的Bean定義檔。

您也可以自行定義Bean定義檔的名稱,像是:
1
2
3
4
5
6
7
8
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/hello1-servlet.xml, /WEB-INF/hello2-servlet.xml</param-value>
    </init-param>      
</servlet>


我們這邊使用預設的hello-servlet.xml作為Bean定義檔的名稱,其內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hellouser.do">helloUserAction</prop>
            </props>
        </property>
    </bean>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.InternalResourceView</value>
        </property>
    </bean>
    
    <bean id="helloUserAction" class="onlyfun.caterpillar.HelloUserAction">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
        <property name="viewPage">
            <value>/WEB-INF/jsp/hellouser.jsp</value>
        </property>
    </bean>
</beans>


DispatcherServlet將請求與handler的映射交給HandlerMapping的實作org.springframework.web.servlet.view.InternalResourceViewResolver,在上面的設定中,我們將/hellouser.do的請求交給名稱為helloUserAction的handler,它是個實作Controller介面的類別,我們待會再來看看它。

先來關心一下viewResolver,Spring可以讓您使用不同的表示層技術,透過viewResolver的轉換,您的表示層可以使用純綷的JSP/Servlet、JSTL、Velocity、Tiles等等,在這邊我們使用JSP/Servlet,您只要簡單的設定viewClass屬性為org.springframework.web.servlet.view.InternalResourceView。如果您的表示層使用JSTL,則可以設定org.springframework.web.servlet.view.JstlView,同樣的,對於Spring支援的其它表示層技術,Spring都提供有一個viewClass可以設定。

來看看helloUserAction,它實作了Controller介面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package onlyfun.caterpillar;
 
import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.RequestUtils;
 
public class HelloUserAction implements Controller {
  private String helloWord;
    private String viewPage;
    
  public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) 
        throws ServletException, IOException {
    String user = RequestUtils.getRequiredStringParameter(req, "user");
    Map model = new HashMap();
    model.put("helloWord", getHelloWord());
    model.put("user", user);
  
      return new ModelAndView(getViewPage(), model);
    }
    
    public void setViewPage(String viewPage) {
      this.viewPage = viewPage;
    }
    
    public String getViewPage() {
      return viewPage;
    }
 
    public void setHelloWord(String helloWord) {
      this.helloWord = helloWord;
    }
    
    public String getHelloWord() {
      return helloWord;
    }
}


handlerRequest()在MVC/Model2中扮演的作用,在於處理請求內容、呼叫商務物件、準備Model,它必須返回一個ModelAndView的實例,表示最後要顯示給使用者觀看的表示層資源。

在上面的例子中,我們只是將請求中的user參數取出,填入Model中,ModelAndView接受一個Map物件作為請求,之後viewResolver會根據所設定的viewClass將之轉換為View層可以抽取出來的資料源。

在上面的例子中,我們使用了依賴注入的方式設定helloWord,以及View的位址,利用依賴注入的方式,我們可以避免將View的資源位址寫死在程式中,而請您回顧一下viewPage屬性,我們設定其為/WEB-INF/jsp/hellouser.jsp,將資源設定在WEB-INF中,可以避免使用者直接存取資源,以獲得較高的安全性與資源訪問控制

hellouser.jsp的內容如下,我們使用了JSP 2.0的Expression Language將Model取出以顯示在頁面上:
1
2
3
4
5
6
<html>
<head><title>HelloPage</title></head>
<body>
    <H1> ${helloWord}, ${user}!!</H2>
</body>
</html>


現在可以啟動您的Servlet容器了,在網址列輸入本地測試位址:
1
http://localhost:8080/springapp/hellouser.do?user=Justin


我們給了一個請求參數user=Justin,程式執行的結果如下:
1
2
3
4
5
6
<html>
<head><title>HelloPage</title></head>
<body>
    <H1> Hello!, Justin!!</H2>
</body>
</html>


caterpillar edited on 2004-11-01 21:20
reply to postreply to post
良葛格學習筆記
話題樹型展開
人氣 標題 作者 字數 發文時間
5510 第一個Spring MVC Web程式 caterpillar 6076 2004-11-01 20:34
4649 Re:第一個Spring MVC Web程式 lthwie 936 2005-05-29 09:57
4613 Re:第一個Spring MVC Web程式 lthwie 898 2005-05-29 12:54
7820 Re:第一個Spring MVC Web程式 elviscat 8509 2005-10-04 14:22
4273 Re:第一個Spring MVC Web程式 elviscat 274 2005-10-18 09:02
4233 Re:第一個Spring MVC Web程式 elviscat 184 2005-10-24 13:36
» JWorld@TW »  Java Tools

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8