入門 04 - 第一個Spring程式。

 

在進行這個程式之前,請您先完成入門 04 - 第一個Spring程式

 我們的第一個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:

Controller.java
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中定義:

web.xml
<?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定義檔的名稱,像是:

<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定義檔的名稱,其內容如下:

hello-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="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介面:

HelloUserAction.java
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取出以顯示在頁面上:

hellouser.jsp
<html> 

<head><title>HelloPage</title></head>

<body>

<H1> ${helloWord}, ${user}!!</H2>

</body>

</html>

現在可以啟動您的Servlet容器了,在網址列輸入本地測試位址:

http://localhost:8080/springapp/hellouser.do

?user=Justin

我們給了一個請求參數user=Justin,程式執行的結果如下:

<html> 

<head><title>HelloPage</title></head>

<body>

<H1> Hello!, Justin!!</H2>

</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值