【原创】实现POST方法往代理内传输大容量数据
昨天终于在朋友以及自己的努力下完成了POST方式的中文数据传输,实在非常开心,在此我特地来发贴分享一下我的成果,呵呵~~希望大家喜欢
第一、介绍一下我所用的语言为javascript、java
第二、POST调用代理的模式,代码如下:
if(document.all.ACTIVITYOS.value == "提案申请")
{
var DataString = CaseCheckNullData();
/*----------------------------------------------------------------------------------------------------------------*/
/*主要用于定义ActiveX控件Microsoft.XMLHTTP进行数据上传
/*----------------------------------------------------------------------------------------------------------------*/
try
{
var XmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(E){}
if(DataString != "")
{
/*----------------------------------------------------------------------------------------------------------------*/
/*主要用于上传数据
/*----------------------------------------------------------------------------------------------------------------*/
if(XmlHttp == null)
{
alert("你未曾开启ActiveX控制,请迅速与资讯联系!");
}
else
{
/*-----------------------------------------------------------------------------------------------------------*/
/*主要用于数据上传
/*-----------------------------------------------------------------------------------------------------------*/
var url = "http://192.168.1.10/data3/applicat.nsf/ShowMessage?OpenForm";
XmlHttp.Open('POST',"http://192.168.1.10/data5/ResCaseA.nsf/ResWrDataIn?OpenAgent",false);
XmlHttp.Send(escape(DataString));
window.showModalDialog(url,"","dialogWidth:300px;dialogHeight:1px;center:yes;status:no;help:no");
var ResVal = XmlHttp.responseText.split("_|_");
document.all.CaseNum.value = ResVal[1];
}
LWFActivityComplete("",true,"","")
/*----------------------------------------------------------------------------------------------------------------*/
}
}
从上面的代码可以清晰的看到利用XmlHttp的POST方式调用代理,然后利用SEND来进行数据的传输,不过由于是中文,传输前需要用函数escape进行数据编码,然后只需要在代理当中进行解码就可以获取到相应的中文,在文档之中需要加入CGI域Request_Content,用于接受send过来的数据
(二楼讲解JAVA代理)
问题点数:0、回复次数:15Top
1 楼ChinaMake2008(Notes)回复于 2005-07-02 10:51:38 得分 0
代理里面有分为两段,第一段是代理的主体用于分析数据传输后台,代码如下:
/////////////////////////////////////
//提案系统申请数据提交代理
/////////////////////////////////////
import lotus.domino.*;
import java.io.*;
import java.sql.*;
import java.util.Vector;
import java.lang.String;
import java.lang.Integer;
import java.lang.*;
import java.util.*;
public class JavaAgent extends AgentBase
{
public void NotesMain()
{
try
{
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
//-----------------------------添加自己编写的代码-----------------------------//
/*------------------------------- 定义文档变量 -------------------------------*/
PrintWriter out = getAgentOutput();
Document udoc = agentContext.getDocumentContext();
/*------------------------------- 处理传入字串 -------------------------------*/
//String DataXml = udoc.getItemValueString("Query_String_Decoded");
String DataTest = Escape.unescape(udoc.getItemValueString("Request_Content"));
//System.out.println(DataTest);
//int index = DataXml.indexOf("=");
//DataXml = DataXml.substring(index + 1,DataXml.length());
//System.out.println(DataXml);
Vector ResStrlist = new Vector();
ResStrlist = Get_Div_StrList(DataTest,"_|_");
//ResStrlist = Get_Div_StrList(DataXml,"_|_");
/*-------------------------------- 连接数据库 -------------------------------*/
/*-------------------------------- 注册驱动 -------------------------------*/
DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
/*-------------------------------- URL链接 -------------------------------*/
String url = "jdbc:mysql://127.0.0.1:3306/ghscase?useUnicode=true&characterEncoding=gb2312";
/*------------------------------- MYSQL数据库链接 -------------------------------*/
java.sql.Connection con=java.sql.DriverManager.getConnection(url,"developer","MarketNetwork");
java.sql.Statement stmt=con.createStatement();
String ResNum = ResStrlist.elementAt(0).toString();
String ResName = ResStrlist.elementAt(1).toString();
String ResDate = ResStrlist.elementAt(2).toString();
String ResEmp = ResStrlist.elementAt(3).toString();
String ResUser = ResStrlist.elementAt(4).toString();
String Proposer = ResStrlist.elementAt(5).toString();
String ResTel = ResStrlist.elementAt(6).toString();
String ResDept = ResStrlist.elementAt(7).toString();
String ResTang = ResStrlist.elementAt(8).toString();
String ResNowThing = ResStrlist.elementAt(9).toString();
String ResMendPro = ResStrlist.elementAt(10).toString();
String ResAffix = ResStrlist.elementAt(11).toString();
String ResDeDept = ResStrlist.elementAt(12).toString();
//String NowDate = udoc.getItemValueString("NowDate");
System.out.println(ResNowThing);
System.out.println(ResMendPro);
String sql = "select * from ResDataBase where ResNum = '" + ResNum + "'";
java.sql.ResultSet rs=stmt.executeQuery(sql);
String CycNum = "";
int CycLen = 0;
if(rs.next() == true)
{
sql = "";
int ret = stmt.executeUpdate(sql);
}
else
{
/*如果数据重没有进行过提交则进行数据提交*/
/*获取提案编号*/
sql = "select * from CaseCycNum";
rs=stmt.executeQuery(sql);
while(rs.next())
{
ResNum = ResDate.substring(0,4)+ResDate.substring(5,7)+rs.getString("CycNum");
CycNum = rs.getString("CycNum");
CycNum = Integer.toString((Integer.parseInt(CycNum)+1));
}
//udoc.replaceItemValue("CaseNum",ResNum);
/*更新数据库中的参数变量*/
CycLen = CycNum.length();
switch (CycLen)
{
case 1:
CycNum = "000" + CycNum;
break;
case 2:
CycNum = "00" + CycNum;
break;
case 3:
CycNum = "0" + CycNum;
break;
}
sql = "update CaseCycNum set CycNum = '" + CycNum + "'";
int ret = stmt.executeUpdate(sql);
/*导入单据中的数据*/
sql = "insert into ResDataBase(ResNum,ResName,ResDate,ResEmp,ResUser,Proposer,ResTel,ResDept,ResTang,ResNowThing,ResMendPro,ResAffix,ResDeDept) values ('"+ResNum+"','"+ResName+"','"+ResDate+"','"+ResEmp+"','"+ResUser+"','"+Proposer+"','"+ResTel+"','"+ResDept+"','"+ResTang+"','"+ResNowThing+"','"+ResMendPro+"','"+ResAffix+"','"+ResDeDept+"')";
ret = stmt.executeUpdate(sql);
out.println("_|_"+ResNum+"_|_");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
/*---------------------------------------------------------------------------------------------------------*/
/*代理子函数列表*/
/*---------------------------------------------------------------------------------------------------------*/
/*函数名: Get_Div_StrList----------------------------------------------------------------------------------*/
/*用于获取分割后的数组-------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------*/
public Vector Get_Div_StrList(String StrList,String Mark)
{
//用于存放返回值的字符串数组
Vector ResStrlist = new Vector();
//备用字符串
String curstr = "";
//状态位(起始位置)
int index = 0;
StrList = StrList.trim();
//获取"="位置
index = StrList.indexOf(Mark);
//循环取得"="前的数据
while(index >= 0)
{
curstr = StrList.substring(0,index);
StrList = StrList.substring(index + 3,StrList.length());
ResStrlist.addElement(curstr);
index = StrList.indexOf(Mark);
}
ResStrlist.addElement(StrList);
return ResStrlist;
}
}Top
2 楼ChinaMake2008(Notes)回复于 2005-07-02 10:51:52 得分 0
第二段代码是进行中文数据编码解码,代码如下:
public class Escape {
private final static String[] hex = {
"00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F",
"10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F",
"20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F",
"30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F",
"40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F",
"50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F",
"60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F",
"70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F",
"80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F",
"90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F",
"A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF",
"B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF",
"C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF",
"D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF",
"E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF",
"F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF"
};
private final static byte[] val = {
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
};
public static String escape(String s) {
StringBuffer sbuf = new StringBuffer();
int len = s.length();
for (int i = 0; i < len; i++) {
int ch = s.charAt(i);
if (ch == ' ') { // space : map to '+'
sbuf.append('+');
} else if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' : as it was
sbuf.append((char)ch);
} else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it was
sbuf.append((char)ch);
} else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it was
sbuf.append((char)ch);
} else if (ch == '-' || ch == '_' // unreserved : as it was
|| ch == '.' || ch == '!'
|| ch == '~' || ch == '*'
|| ch == '\'' || ch == '('
|| ch == ')') {
sbuf.append((char)ch);
} else if (ch <= 0x007F) { // other ASCII : map to %XX
sbuf.append('%');
sbuf.append(hex[ch]);
} else { // unicode : map to %uXXXX
sbuf.append('%');
sbuf.append('u');
sbuf.append(hex[(ch >>> 8)]);
sbuf.append(hex[(0x00FF & ch)]);
}
}
return sbuf.toString();
}
public static String unescape(String s) {
StringBuffer sbuf = new StringBuffer();
int i = 0;
int len = s.length();
while (i < len) {
int ch = s.charAt(i);
if (ch == '+') { // + : map to ' '
sbuf.append(' ');
} else if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' : as it was
sbuf.append((char)ch);
} else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it was
sbuf.append((char)ch);
} else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it was
sbuf.append((char)ch);
} else if (ch == '-' || ch == '_' // unreserved : as it was
|| ch == '.' || ch == '!'
|| ch == '~' || ch == '*'
|| ch == '\'' || ch == '('
|| ch == ')') {
sbuf.append((char)ch);
} else if (ch == '%') {
int cint = 0;
if ('u' != s.charAt(i+1)) { // %XX : map to ascii(XX)
cint = (cint << 4) | val[s.charAt(i+1)];
cint = (cint << 4) | val[s.charAt(i+2)];
i+=2;
} else { // %uXXXX : map to unicode(XXXX)
cint = (cint << 4) | val[s.charAt(i+2)];
cint = (cint << 4) | val[s.charAt(i+3)];
cint = (cint << 4) | val[s.charAt(i+4)];
cint = (cint << 4) | val[s.charAt(i+5)];
i+=5;
}
sbuf.append((char)cint);
}
i++;
}
return sbuf.toString();
}
public static void main(String[] args) {
String stest = "中文1234 abcd[]()<+>,.~\\";
System.out.println(stest);
System.out.println(escape(stest));
System.out.println(unescape(escape(stest)));
}
}Top
3 楼ChinaMake2008(Notes)回复于 2005-07-02 10:56:12 得分 0
最后说明一下 如何你想数据量传输的很大 需要在服务器端配置一下POST的容量大小 呵呵~~
全文到此结束 希望大家喜欢 如果有什么不理解 可以来我的QQ群 群号:3481206Top
4 楼zengxianfeng(冲星中......)回复于 2005-07-04 09:05:36 得分 0
顶Top
5 楼kingchang2000(骠骑大将)回复于 2005-07-04 11:25:58 得分 0
喜欢,很不错。学习学习。Top
6 楼chenzb(long long ago)回复于 2005-07-04 14:44:55 得分 0
解码好像可以这样吧:
在web上,通过js函数,对中文的内容进行编码
在服务器中,直接使用公式@urldecode(.......)进行解码Top
7 楼simware(菜包子)回复于 2005-07-05 14:05:02 得分 0
哦Top
8 楼firewangcool(fire)回复于 2005-07-05 15:58:55 得分 0
学习,顶!Top
9 楼fanyufanyu(反语)回复于 2005-07-06 13:16:35 得分 0
学习,此贴我收藏了。Top
10 楼kcw(黑黑)回复于 2005-07-06 13:16:40 得分 0
台湾同胞吧。Top
11 楼tottilou(阿飞)回复于 2005-07-22 13:16:22 得分 0
@urldecode(.......)这个公式有字符限制,好像不能超过512个字节,这个公式里面的限制!!Top
12 楼tnda(虎头)回复于 2005-07-22 13:50:11 得分 0
楼主,为啥不用java.net.URLDecoder,这个类,而要自己写?Top
13 楼tnda(虎头)回复于 2005-07-22 14:20:10 得分 0
哦,我测试了下,发现楼主是用js的UNCODE编码 加密算法,和java.net.URLEncoder不一样
所以不能使用java.net.URLDecoder解密
不过楼主的解密方法有问题,
如果源码里面包括“/”字符,则无法解密
ss = "中文1234 abcd[]()<+>,.~\\aaa/";
ss1 = escape(ss)
document.forms[0].aaaa.value = ss1;
这个是JS加密后的字符:%u4E2D%u65871234%20abcd%5B%5D%28%29%3C+%3E%2C.%7E%5Caaa/
说明JS加密时,“/”是不加密的,
而使用楼主的类解密时:会丢失“/”这个字符,
解码后的字符为:中文1234 abcd[]()< >,.~\aaa
如果用楼主自己的加密算法加密,再解密,则没有问题,
Top
14 楼tnda(虎头)回复于 2005-07-22 14:31:54 得分 0
我发现你使用
//String DataXml = udoc.getItemValueString("Query_String_Decoded");
也完全可以自动解码,而没有任何错误,不需要自己写解码算法,
不知道你为啥不用,也许你认为URL的长度有限制而不好用吧
Top
15 楼chenyg2000(从心开始)回复于 2005-07-23 00:53:26 得分 0
支持一下Top




