在第一篇文章《Jakarta Struts簡介》中
我大致分析了Struts框架
討論了它所能完成的功能
還浏覽了組成Struts的各個組成部分
在第二篇文章《學習Jakarta Struts》中
我開始詳細描述如何利用Struts來構建一個簡單應用的過程步驟
而本篇文章將會向大家演示如何將ApplicationResource文件中的文本信息
通過Struts標簽在JSP頁面中顯示出來
Action類是連接Struts架構和應用中業務邏輯代碼的橋梁
所以你應該盡可能讓Action類小巧簡單
因為真實應用中的邏輯處理應該是由單獨分離出來的邏輯層來完成的
如果你正在從事n層應用的開發
你當然希望層與層之間的接口越簡單越好
而事實上
Action類中的主要方法
perform()
(
中為execute())卻有點暗示應該在本方法中做點什麼的意思
我們知道
每個Action類都需要從 org
apache
struts
action
Action 繼承而來
在小型應用中
我們的Action類很可能就只要繼承org
apache
struts
action
Action就足夠了
而在某些特定的復雜應用中
我就從我們所實現的Action類中總結出來了一些通用特性
因此
在我看來
構造一個基類將這些通用特性的代碼實現出來
讓應用中所用到的所有Action類不直接繼承org
apache
struts
action
Action
而繼承這個完成了一些通用特性的基類以實現代碼重用
是一個相當不錯的設計
我在StrutsSample中就應用了這種方法
構造了這樣的一個基類
該基類的方法在完成復雜邏輯的和簡單轉發請求的Action類中都可以使用
package com
oreilly
actions;
import java
io
IOException;
import java
util
Properties;
import java
util
ResourceBundle;
import java
util
MissingResourceException;
import java
util
Enumeration;
import java
util
Properties;
import java
rmi
RemoteException;
import javax
ejb
EJBHome;
import javax
ejb
CreateException;
import javax
naming
Context;
import javax
naming
InitialContext;
import javax
naming
NamingException;
import javax
servlet
ServletException;
import javax
servlet
http
HttpServletRequest;
import javax
servlet
http
HttpServletResponse;
import org
apache
struts
action
Action;
import org
apache
struts
action
ActionServlet;
import org
apache
struts
action
ActionForm;
import org
apache
struts
action
ActionForward;
import org
apache
struts
action
ActionMapping;
這個類就是使用Struts開發時
所有Action類都要繼承的基類
它把一些通常在實際應用中最有可能被用到的東西都考慮進來了
就這篇文章而言
類中一些與Struts並不是太緊密相關的方法將只做注釋而不會完整的實現
而從事開發工作的你
有興趣的話
請完成這些方法並應用這個類
將為你在實際項目中的開發快馬加鞭
注意
因為所有的Action類都要從org
apache
struts
action
Action 繼承而來
所以我們的這個類同樣
public abstract class AbstStrutsActionBase extends Action {
/ * 定義一些在struts
config
xml中記錄在案的
* 全局應用中皆可可通用的forward標識*/
protected static final String SUCCESS =
success
;
protected static final String FAILURE =
failure
;
protected static final String ERROR =
error
;
protected static final String LOGIN =
login
;
protected static final String CONFIRM =
confirm
;
protected Context jndiContext = null;
/**
* 默認構造方法
*/
public AbstStrutsActionBase() {
}
/**
下面這個查找EJB實例的方法將不會完整實現
一般來說
Action類應該調用實現了應用的商務邏輯的EJB會話bean(或僅僅普通JavaBean)
在大型項目中
開發人員必須劃清層與層之間的界限
在Action類中
我們應該拿到獲取含有JNDI信息的環境的實例
然後通過EJB的JNDI名字去查詢獲取它的home接口
過程並不簡單
所以下面這個代碼片斷只是個給出了必要實現的小例子
; 參數類型String
傳入的要查詢JNDI的名字
; 返回類型Object
即查找到的home接口
; 如果查找失敗
拋出NamingException異常
; 如果獲取資源信息失敗
拋出MissingResourceException異常
*/
public Object lookup(String jndiName)
throws NamingException
MissingResourceException {
// 為調用EJB對象
通過構建記錄JNDI信息的Properties對象
// 來獲得初始環境信息
if (jndiContext == null) {
ResourceBundle resource =
ResourceBundle
getBundle(
strutssample
properties
);
Properties properties = new Properties();
properties
setProperty(
Context
INITIAL_CONTEXT_FACTORY
resource
getString(Context
INITIAL_CONTEXT_FACTORY));
properties
setProperty(
Context
PROVIDER_URL
resource
getString(Context
PROVIDER_URL));
properties
setProperty(
Context
SECURITY_PRINCIPAL
resource
getString(Context
SECURITY_PRINCIPAL));
properties
setProperty(
Context
SECURITY_CREDENTIALS
resource
getString(Context
SECURITY_CREDENTIALS));
jndiContext = new InitialContext(properties);
}
注意
在真正的產品中
我們應該在此處考慮代碼的健壯性
將代碼加入到try/catch塊內
並記錄所有錯誤或重要信息到系統log中
而本例中
我們僅僅把異常往外拋
並假定一定會找到EJB對象的home接口並返回
return (jndiContext
lookup(jndiName));
}
由於Action類將是由Struts來調用的
所以它的主要方法應該是一個抽象方法
而由每個繼承的子類來具體實現
或者在其中做一些所有Action都會做的通用機制
例如記錄log信息
在本例中
我們一切從簡
將其抽象之
; 參數mapping
其類型為ActionMapping
將在本Action做跳轉選擇用
; 參數actionForm
由Struts根據本次HTTP請求數據填充完成的ActionForm對象(可選
如果存在請求數據的話)
; 參數request
此Action所有處理的本次HTTP請求(對象)
; 參數response
此Action輸出數據所要用到的HTTP響應(對象)
; 如果有I/O錯誤出現
則本方法拋出IOException異常
; 如果處理時發生servlet異常
則本方法拋出ServletException異常
; 本方法處理完請求後按照處理邏輯返回相應的頁面導向(對象)
public abstract ActionForward perform(
ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws IOException
ServletException;
}
或者讓這個抽象方法更有用一點
那就在裡面干點什麼吧
比如像下面這樣在其中記錄log
{
ActionForward forward = null;
// 只是簡單的記錄一些提示信息到servlet log
getServlet()
log(
AbstStrutsActionBase
perform() [Action Class:
+ this
getClass()
getName()
+
]
);
getServlet()
log(
AbstStrutsActionBase
perform() [Form Class :
+ (form == null ?
null
: form
getClass()
getName())
+
]
);
}
然後
我們再編寫的每個Action類都應該從AbstStrutsActionBase繼承
並依照處理邏輯編寫各自的perform方法
讓我們用LoginAction為例
看看具體應該怎麼應用吧
package com
oreilly
actions;
import java
io
IOException;
import java
rmi
RemoteException;
import javax
ejb
CreateException;
import javax
servlet
ServletException;
import javax
servlet
http
HttpServletRequest;
import javax
servlet
http
HttpServletResponse;
import org
apache
struts
action
ActionError;
import org
apache
struts
action
ActionErrors;
import org
apache
struts
action
ActionForm;
import org
apache
struts
action
ActionMapping;
import org
apache
struts
action
ActionForward;
import com
oreilly
forms
LoginForm;
/*
LoginAction 將演示一個Action將如何被Struts架構所調用
在這個例子中
我們只是簡單的演示perform方法是如何調用
執行並返回的
*/
public class LoginAction extends AbstStrutsActionBase {
接下來這個是驗證用戶的方法
本例中沒有具體實現
但一個典型的應用方案是調用JavaBean或者EJB來完成
用來查找EJB的lookup方法(在基類中完成的)應該在本方法中被調用
其返回一個依據後台數據庫驗證用戶的接口
; 參數類型String
要驗證的用戶名
;
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28250.html