在Jsp中模拟WebForm(一)

原创 2004年04月12日 12:26:00

在Jsp中模拟WebForm(一)

     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; //页面参数

  static Class paramTypes[] = new Class[1];//页面事件的参数类型

       //取得操作页面的基本组件
       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()));//向用户给出出错提示.
        }
     }
  }
  
     当然,实用的 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)
      {
         window.form1.action.value=action;
         window.form1.parameters.value=params;
         window.form1.submit();
      }
   </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','')">
   &nbsp;&nbsp;&nbsp;
   <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)
        {
            super(page);
        }

        protected void onLoad() throws Exception
        {
           t_value=0;
           result="";
           //在实际应用中,这里应作许多的初始化工作(如,得到页面参数)
        }
       
        //双倍
        private void onTwo(String str_params) throws Exception
        {
            try
            {
                t_value=Integer.parseInt(request.getParameter("t_value"));
            }
            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
        {
            try
            {
                t_value=Integer.parseInt(request.getParameter("t_value"));
            }
            catch(Exception e)
            {
                out.println("<script language='javaScript'>alert('您输入的不是有效的整
               数.');</script>");
            }
            int i=10*t_value;
            result="计算结果为:"+i;
       }
   }

      WebForm的基本思想也就在于此,当然,WebForm中的服务器端控件的状态可以自动保持(而我们的实现为保持状态还需作一些工作),WebForm的控件属性可以在后置代码中进行操作,服务器端事件可以在后置代码中进行邦定,服务器端控件支持数据邦定等等,我们的实现还无法做到。
   如果能在Jsp中定义类似服务器端控件的东东,以上的功能在Jsp中可以得以实现。
  (待续..)

 相关文章:

在Jsp中模拟WebForm(二)
在Jsp中模拟WebForm(三)
在Jsp中模拟WebForm(四)
在Jsp中模拟WebForm(五)

在Jsp中模拟WebForm(四)

                             在Jsp中模拟WebForm(四)实际上我也相信,不能在后置代码(在我们的实现中应是PageHandler及其子类)中访问自定义标签也没什么大...
  • Fancimage
  • Fancimage
  • 2004年04月02日 15:46
  • 652

在Jsp中模拟WebForm(三)

                                    在Jsp中模拟WebForm(三)   至此,我们还面临另外几个问题:在Jsp中实现类似WebForm中的服务器端控件、自动状态...
  • Fancimage
  • Fancimage
  • 2004年04月02日 15:46
  • 784

在Jsp中模拟WebForm(二)

                                                     在Jsp中模拟WebForm(二)     用“页面处理器”的方式组织页面代码,起到了将页面显...
  • Fancimage
  • Fancimage
  • 2004年04月02日 15:40
  • 687

在Jsp中模拟WebForm(五)

                                           在Jsp中模拟WebForm(五)    在第4步还存在困扰我们的问题。按照JSP规范对Tag的定义,tag的do...
  • Fancimage
  • Fancimage
  • 2004年04月02日 15:46
  • 695

JSP Debug 过程

1. 现在server 窗口切换DEBUG 模式, SERVER 会启动并且切换到DEBUG, 如果超时可以重启ECLIPSE. 2. 再在网页中敲击JSP网址,ECLIPSE会监听并且自动跳到ECL...
  • wy358509
  • wy358509
  • 2017年04月14日 20:49
  • 83

为已有的 WebForm 项目引入 Asp.Net MVC 框架

Asp.Net 的项目多数还是应用的 WebForm 进行开发,MVC 框架随着在其他语言中的兴起,也进入了 Asp.Net 领域,那就是 Asp.Net MVC,现在的正式版本是 2.0,已经出了 ...
  • ddxkjddx
  • ddxkjddx
  • 2011年08月15日 10:16
  • 1276

在asp.net web form 中使用ajax

在asp.net web form 中使用ajax 首先可以先去看看一篇兄弟文章:http://blog.csdn.net/mfcdestoryer/article/details/22041975...
  • MFCdestoryer
  • MFCdestoryer
  • 2014年03月25日 12:30
  • 2812

转: 如何向WebForm下的ReportViewer传递身份凭证

转自:http://space.itpub.net/9079672/viewspace-416169 WebForm下的ReportViewer控件不能直接传入身份凭证,因为其ServerReport...
  • DJ2008
  • DJ2008
  • 2010年03月25日 18:42
  • 1652

不用asp.net MVC,用WebForm照样可以实现MVC

在《避开WebForm天坑,拥抱ASP.Net MVC吧》这篇博客中我讲到了ASP.net WebForm由于一些先天的“诱导犯罪”的缺陷,现在用ASP.net MVC的公司越来越多。但是根据那篇文章...
  • cownew
  • cownew
  • 2015年12月25日 08:35
  • 4371

如何在WebForm上显示图像缩略图

要想在WebForm显示一组图像的缩略图,则需要一些技巧。即用DataList来完成。        首先,要定义主页面,大致如下:                                  ...
  • Knight94
  • Knight94
  • 2006年03月31日 16:19
  • 5585
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Jsp中模拟WebForm(一)
举报原因:
原因补充:

(最多只允许输入30个字)