在JSP开发中模拟.NET WebForm(一)

ZDNet软件频道 时间:2008-06-29 作者: | 中国IT实验室 我要评论()
本文关键词:WebForm NET JSP
 WebForm是事件驱动的,控件状态可以在http请求之间自动保持,并且使用后置代码很好地实现了页面外观与页面逻辑控制的分离,一改以往html,服务器段代码、javaScript混杂在一起的web开发方式。
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
    catch(Exception e)
    
   }
  
   //初始化页面的参数,具体的页面处理器类可以重写这
   //个方法进行页面初始化
   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()));
    }
   }
  }
  
  当然,实用的 PageHandler应提供更为复杂的功能。
  
  具体的页面处理器类从此类继承下来,现在,我们用一个简单的例子说明页面处理器的用法:假设有这样一个页面,有一个文本框要求用户输入一个数字,有两个按钮,点击一个要求计算出用户输入数字的2倍,点击另外一个按钮要求计算出用户输入数字的10倍。再假设此页面的页面处理器类为JSPTest.
  
  //test.JSP
  <%@ page contentType="text/html; charset=GB2312" %>
  <%@ page import="youpackage.JSPTest" %>
  <%
   JSPTest handler=new JSPTest(pageContext);
   handler.process();//调用页面处理器
   String formAction=request.getRequestURI()+"?"+request.getQueryString();
  %>
  <html>
  <head>
  <title>测试页面处理器</title>
   <script language="javascript">
    function on_event(action,params)
    
   </script>
  </head>
  <body bgcolor="#ffffff">
  <form name="form1" method="post" action="<%=formAction%>">
  请输入数字:<input type="text" name="t_value" value="<%=handler.t_value%>">
  <br><br>
  <font color="red"><%=handler.result%></font>
  <br><br>
  <input type="button" name="b1" value="2倍" onclick="on_event('onTwo','')">
    
  <input type="button" name="b2" value="10倍" onclick="on_event('onTen','')">
  
  <input type="hidden" name="action" value=""/>
  <input type="hidden" name="parameters" value=""/>
  </form>
  </body>
  </html>
  
  则,我们为以上页面定义其页面处理器:JSPTest
  //JSPTest.java
  public class JSPTest extends PageHandler
  {
   //定义页面变量
   public int t_value;//用户输入的整数
   public String result;//存储计算结果
   
   public JSPTest(PageContext page)
   
  
   protected void onLoad() throws Exception
   
  
   //双倍
   private void onTwo(String str_params) throws Exception
   
    catch(Exception e)
    {
     out.println("<script language='javaScript'>alert('您输入的不是有效的整数.');</script>");
  }
    int i=2*t_value;
    result="计算结果为:"+i;
   }
  
  
   //10倍
   private void onTen(String str_params) throws Exception
   
    catch(Exception e)
    {
     out.println("<script language='javaScript'>alert('您输入的不是有效的整数.');</script>");
    }
   int i=10*t_value;
   result="计算结果为:"+i;
  }
  }
  
  WebForm的基本思想也就在于此,当然,WebForm中的服务器端控件的状态可以自动保持(而我们的实现为保持状态还需作一些工作),WebForm的控件属性可以在后置代码中进行操作,服务器端事件可以在后置代码中进行邦定,服务器端控件支持数据邦定等等,我们的实现还无法做到。
  
  如果能在JSP中定义类似服务器端控件的东东,以上的功能在JSP中可以得以实现。
  
  用“页面处理器”的方式组织页面代码,起到了将页面显示元素与服务器端控制代码分离的目的,使得我们的代码更为清晰。在页面上,需要例行公事地调用页面相应的处理器(多个页面可以具有相同的处理器),声明一个类似on_event的javaScript函数,并在需要进行“回调”(提交本页面,并重新请求本页面)的Form控件的事件中调用on_event(同时指定事件的名称和参数),还需要指定Form的Action指向本页面,并在form中放置两个隐藏字段,分别持有页面发生的事件名称和需要向服务器传递的参数。
  
  是的,需要例行公事作这么

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134