现在的位置: 首页 > 综合 > 正文

并发请求解决Form的异步提交

2012年10月25日 ⁄ 综合 ⁄ 共 2380字 ⁄ 字号 评论关闭
Ajax不支持Form的异步提交,至少在IE6.0还没有支持这个功能,但愿之后会有所支持。
  有一种解决方案是将Form里的参数都转化成Get提交,这样可以解决一部分的需求,但毕竟,Post提交有它独特的优势。
  这面,我用一种很笨的方法来模拟实现Form的异步提交。
  简单说明一下原理:
  首先在首页里建一个隐藏的IFrame。提交时,可以把数据提交到这里。但是关键的问题是,并不是直接把Form提交到要显示的界面,而是通过一个FormRedirect (转交)Servlet把请求转发给显示的界面。在发送提交Form的同时并发产生一个异步的监听线程启动 Proxy(代理)Servlet。Proxy Servlet负责监听HttpSession实例对象的活动,可以设定它定时去监听一个对象,当此对象产生时,也就是转发工作完成时,FormRedirect 返回一个空值(向隐藏的IFrame返回一个空值),FormRedirect 的任务结束了。
  此时,Proxy接收到信息,根据设定转向到显示界面。页面处理完成,通知回调函数。这样一波三折,实现了Form的模拟异步提交(其实Form是用普通提交的,主要是产生了一个并发的异步线程)。

  虽然是转来转去,但这样做的好处是:
  实现了异步提交的效果(无闪提交,刷新)
  不用去直接面对编码问题(其实通常情况下是用一个过滤器进行转码的)
  可以简单,快速地进行大数据的提交,这项与把Form转换成get提交时编码有明显的速度优势

  

  缺点
  比较复杂
  要处理转发和启动一个监听线程,给服务器增添了压力(用get重新编码提交是在客户端完成,因此几乎对服务器没有这额外的负担)

   

   FormRedirect.java

package com.ycoe.servlet.common;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.ycoe.common.EWebConfig;
import com.ycoe.common.Function;

public class FormRedirect extends HttpServlet {

    
//Initialize global variables
    public void init() throws ServletException {
    }


    
//Process the HTTP Get request
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException 
{
        request.setCharacterEncoding(
"GB2312");
        HttpSession session 
= request.getSession(true);
        Enumeration formNames 
= request.getParameterNames();
        Function function 
= new Function();
        function.setLocal(request.getLocale().toString());
        EWebConfig config 
= function.siteConfig;
        String url 
= "";
        
try{
            //
while (formNames.hasMoreElements()) {
               // String formName 
= (String) formNames.nextElement();
               // request.setAttribute(formName, request.getParameter(formName));
                session.setAttribute(
"request", request);
            }

            url 
= request.getParameter("url");
        }
catch(Exception ex){
            session.setAttribute(
"error",config.getProperties("FormRedirectFalse"));
        }

        session.setAttribute(
"url",url);
    }


    
//Process the HTTP Post request
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException 
{
        doGet(request, response);
    }


    
//Clean up resources
    public void destroy() {
    }

}

                                            原创文章,可以随意复制发表,版权问题,请注明作者和出处!谢谢合作

抱歉!评论已关闭.