[評論]
作者: 劉國棟 (dev2dev ID: yahoo163)
引言
最近在使用Struts,現在把個人的一點感悟寫下來,希望對各位有點幫助。習慣了翻譯文檔中老外們的書寫格式這裏不妨套用一下,這樣看起來也顯得條理清楚J。我在這裏不打算再介紹Struts的優點和什麼是MVC模式了,網上這樣的文章很多一定比我寫要好的多,我只具體講一個例子,結合這個例子把Struts的初級的一些東東Show一下(高級的我自己還沒搞懂就不現眼了J)。好了,廢話不講了要不然有人要扔磚頭了。
運行環境
還是忍不住要說兩句環境搭建的步驟,實在是我覺得這部分很重要,諸位仁兄只好忍一忍先。
1.所需軟件
爲了要運行這個例子你需要以下幾個軟件:
- WebLogic8.1sp2或者任何其他Web服務器,我用的Weblogic8.1sp2。你可以從BEA公司的網站上下載:http://commerce.bea.com/index.jsp
- Struts1.0,可以從www.apache.org上當。
- 一個好用的Java IDE,我用的是JBuilder,當然這不是必須的。
- 再有就是一個寫JSP的工具,一般的網頁編輯工具就可以。
2.環境搭建
- 安裝Struts
從Struts壓縮包中分別把幾個部署描述文件和標籤庫描述文件copy到你的DefaultApp/WEB-INF目錄下。
這些文件包括:
struts-config.xml:用來配置你的serlvet和映射java bean的文件。
struts-html.tld:這是一個標籤庫描述文件,他實現了html中跟請求響應有關的幾個標籤。
struts-logic.tld:這也是一個標籤庫描述文件,他實現了java中邏輯操作的功能,比如循環,判斷等等。
struts-template.tld:模板標記庫描述文件
struts-bean.tld:有關java bean映射所需的一些標籤庫。
再把struts.jar拷貝的DefaultApp/WEB-INF/lib目錄下。好了安裝完了,再配置一下web.xml就OK了。
配置web.xml文件
你可以從struts壓縮包中直接把這個文件copy到DefaultApp/WEB-INF目錄下,如果你想搞清楚他們的意思的話,其實也不難,你只要稍稍有一點JSP標籤庫的知識就會知道,他只不過是把你要使用的標籤庫加載到你的web應用中罷了。爲了節省空間,我就不再把他帖出來了。
開始
我們要講的這個例子是一個簡單的登錄驗證頁面,就是輸入用戶名和密碼,點擊“Submit“之後在控制檯打印出用戶名和密碼。既然說Struts是MVC結構我們不妨按照這個結構的順序開始我們的例子吧。
Struts的Model
所謂Model我理解就是存儲信息的一個容器,也許有些淺薄但是初學者不妨就這樣理解吧,這樣容易一些。說白了就是把用戶從jsp頁面上提交的信息保存到一個Java Bean中。當然這個Java Bean不是普通的Java Bean因爲它繼承自Struts的ActionForm,這樣那個Control類才能認識它並控制它。從ActionForm這個單詞的字面意思我們不難看出,它就像我們的Html中的Form標記一樣,一個ActionForm就可以代表一個Form體內的內容,比如我們例子中的這個類LoginForm:
package mytest.struct;
//導入必須的包
import org.apache.struts.action.*;
import javax.servlet.http.*;
//繼承ActionForm
public class LoginForm extends ActionForm {
private String name; //代表JSP頁面中的name,注意這裏的name和頁面中的name必須是一樣的
private String password;
//設置name的數值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//數據校驗,你可以自己進行處理。
public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
ActionErrors errors=new ActionErrors();
if(name==null){
errors.add("Name",new ActionError("Name can not be Null!"));
}
if(password.length()<3){
errors.add("Password",new ActionError("Password lengh at least 3 chars"));
}
return errors;
}
//數據重置的處理
public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
name = null;
password = null;
}
}
好了,這就是我們的一個Model,只有name和password兩個字段,它繼承了ActionForm並且有Java Bean標準的getter和setter方法。就這麼多,接下了讓我們看看View裏有些什麼?
Struts的View
View就是我們的JSP頁面,不過要使用Struts的話JSP寫起來就比較不同了。還是讓我們看看代碼吧:
Login.jsp
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<!-- 上面導入的是頁面所需的標記庫描述,要用struts就必須有這些 -->
<%@ page contentType="text/html; charset=GBK" %>
<html:html> <!-- 這相當於Html中的html標記,下面的凡是以html前綴開頭的都是這個意思 -->
<head>
<title>
login
</title>
</head>
<body>
<p>
<html:form action="/loginAction.do" method="POST">
<!-- 這裏的/loginAction.do一會兒會講到,相當於我們要請求的serlvet -->
UserName:
<html:text property="name"/>
<!-- 放一個文本框,名叫name,注意它必須與LoginForm中的字段相同 -->
<br>
PassWord:
<html: password property="password"/>
<br>
<table border="1">
<tr >
<td><html:submit property="submit" value="Submit"/></td>
<td><html:reset value ="Reset"/></td>
</tr>
</table>
<br>
</html:form>
</body>
</html:html>
View 中的內容就這麼多了,說白了就是吧原來Html中的標籤用struts中的標籤代替,那麼這樣作有什麼用呢?先不要着急後面講到Struts的部署時你就會明白了。在這裏我強烈建議,在學習Struts之前最好先了解一下JSP標籤庫的知識。
Struts的Control
這裏的這個Control,是我們處理頁面信息的一個Servlet,當然他和我們通常的Servlet還是有區別的,它繼承了Struts的Action。而且實現了perform方法:
LoginAction.java
package mytest.struct;
import org.apache.struts.action.*;
import javax.servlet.http.*;
public class LoginAction extends Action {
public ActionForward perform(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
LoginForm loginForm = (LoginForm) actionForm;
System.out.println("UserName:"+loginForm.getName());
System.out.println("PassWord:"+loginForm.getPassword());
return actionMapping.findForward("logok");
}
}
說明:
LoginForm loginForm = (LoginForm) actionForm;
這一句獲得了一個LoginForm 容器對象,這樣就可以從頁面上獲得數據了,比方說要得到jsp頁面中name文本框的數據就使用:loginForm.getName();最後一句return actionMapping.findForward("logok");是返回一個鏈接。其中的“logok”是在struts-config.xml中定義的。就是說,執行完邏輯操作後頁面跳轉到什麼地方。
Struts的部署:
Struts的部署信息是在struts-config.xml中進行描述的。現在講到了Struts的最關鍵的部分,要想我們前面寫的程序能夠運行起來關鍵就看這一步了,我先把這個它帖出來再講:
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="mytest.struct.LoginForm" />
</form-beans>
<global-forwards>
<forward name="logok" path="/login.jsp" />
</global-forwards>
<action-mappings>
<action name="loginForm" type="mytest.struct.LoginAction" validate="true" scope="request" path="/loginAction" />
</action-mappings>
</struts-config>
說明:
<form-beans>標籤描述了容器bean的信息就是我們寫的那個LoginForm
<global-forwards>標籤描述了頁面跳轉的位置,他的name屬性就是我們在LoginAction類中actionMapping.findForward("logok")方法的參數,這代表執行完這個請求之後頁面將跳轉到什麼地方,我這裏設置爲/login.jsp就是告訴Struts運行請求之後頁面還返回原來的位置。
<action-mappings>中描述了所有的控制類的信息,我們的例子中只有一個控制類那就是,LoginAction, 其中path屬性的值描述了控制類在瀏覽器中的url路徑,而那個name描述的是這個控制類要處理的是那個FormBean。
運行:
好了所有的工作都完成了,現在啓動Weblogic8.1,然後在瀏覽器中輸入http://localhost:7001/applications/Login.jsp。可以看到如下的頁面:
輸入用戶名和密碼,點擊Submit按鈕。Weblogic的控制檯將顯示:
結論
一個簡單的Struts程序就是這樣了,由於篇幅的限制我只是簡單的把從頁面得到的信息打印到控制檯上,當然你也可以在控制層把得到的數據保存到數據庫或進行復雜的業務處理等等。不過通過這個簡單的例子你應該明白了Struts是如何運行的,也應該瞭解如何在Weblogic8.1下部署和使用Struts。希望這篇文章能夠帶你進入Struts的世界。
作者:
姓名:劉國棟
通信地址:北京市海淀區學院路20號910信箱
郵編:100083
個人介紹:
2000年大學畢業之後一直從事軟件開發。先後參與開發了多個項目,使用技術包括EJB,Selvlet,JSP,Struts,JDO,Web Services等。在最近主持設計的項目中使用Weblogic Server作爲應用服務器,採用Struts的MVC結構進行設計開發,使用EJB2.0技術作爲持久層的數據存儲。