在JSP開發中類比.NET WebForm

來源:互聯網
上載者:User

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()));
  }
 }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.