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
原创文章,可以随意复制发表,版权问题,请注明作者和出处!谢谢合作
有一种解决方案是将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() {
}
}
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() {
}
}
原创文章,可以随意复制发表,版权问题,请注明作者和出处!谢谢合作