WebForm是事件驅動的,控件狀態可以在http請求之間自動保持,並且使用後置代碼很好地實現了頁面外觀與頁面邏輯控制的分離,一改以往html,服務器段代碼、javaScript混雜在一起的web開發方式。stucts提供了大量的定制標簽,由tag、form、bean、action及配置文件構建了一個優秀的MVC模式的web開發方式。但相比較其WebForm來,竊以為stucts更為復雜,需要協同工作的元素較多,解決問題的效果不如WebForm顯著(僅是個人看法)。
在現實開發中,常常需要在某個頁面中處理很多Form控件,且要處理這個頁面可能引發的多個事件,在事件觸發後,又請求同一個頁面,又需要在請求之間保持狀態,在頁面中處理所有這些,真實不勝其煩。受到WebForm啟發,我在用JSP進行開發時,借鑒了了其一些思想。本質上我們就是想讓頁面顯示代碼與頁面控制代碼分離,要作到這一點並不困難,有很多辦法。
可以為頁面定義一個“頁面處理器(PageHandler)”,它類似WebForm的後置代碼,它的接口基本是下面這個樣子:
public class PageHandler
{
protected HttpServletRequest request;
protected HttpServletResponse response;
protected JspWriter out;
protected PageContext pageContext;
protected HttpSession session = null;
protected ServletContext application = null;
protected ServletConfig config = null;
protected String event_action = null; //頁面事件
protected String event_params = null; //頁面參數
//取得操作頁面的基本組件
public PageHandler(PageContext page)
{
this.pageContext = page;
this.request = (HttpServletRequest) pageContext.getRequest();
this.response = (HttpServletResponse) pageContext.getResponse();
this.pageContext = page;
out = pageContext.getOut();
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
try{
request.setCharacterEncoding("gb2312");//設定頁面編碼
}
catch(Exception e)
{
e.printStackTrace();
}
}
//初始化頁面的參數,具體的頁面處理器類可以重寫這
//個方法進行頁面初始化
protected void onLoad() throws Exception
{
}
//根據頁面指定的事件進行處理
private final void eventBind() throws Exception
{
//event_action從從頁面的名為event_action的hidden字段取得,它意為事件的稱,
//當此事件觸發時,他會尋找在"頁面處理器類中"與event_action同名的方法加
// 以調用。
if (event_action != null && !event_action.equals(Format.Empty))
{
event_params = request.getParameter("parameters"); //事件參數參數,從頁面
//的名為parameters的hidden字段取得
if (paramTypes[0] == null)
{
paramTypes[0] = Class.forName("java.lang.String");
}
Object paramValues[] = new Object[1];
paramValues[0] = event_params;
Method method = null;
try
{
method = this.getClass().getDeclaredMethod(event_action, paramTypes);
method.setAccessible(true);
}
catch (Exception e)
{
throw new UserException("系統缺少對您的請求的處理機制: + event_action);
}
if (method != null)
{
method.invoke(this, paramValues); //調用web時間
}
}
}
//處理頁面
public void process() throws Exception
{
try
{
event_action = request.getParameter("action"); //得頁面事件
onLoad();//頁面加載時的初始化
eventBind();//處理事件
}
catch (Exception e)
{
e.printStackTrace(); ///////////////
Format.alert(out, "發生了未知錯誤:" + Format.getString(e.getMessage()));
}
}
}