servlet远程操作内存

思想:项目中有一块字典表的维护功能,其中字典表的数据第一次从数据库中查出之后为了减轻数据库的压力将数据放到内存中去,而对字典表的改变之后不仅要求改变数据库的值,同时也要去更新内存中字典的数据,而且项目上线的时候是部署在很多服务器上的,这样在一次更改之后必须改变每一个服务器内存的数据,为此专门研究了一下通过servlet地址操作内存,下面是实现方法:


在实现的过程中走了不少弯路,但最后成功做出来了,以下详细记录一下:
1.在后台通过重定向的方式调用servlet,但是该种方式将页面重定向了(跳走了)--该方式不符合要求
在后台的调用方式如下:
  response.sendRedirect(response.getContextPath())
其中response.getContextPath()为servlet地址,例如:http://localhost:8090/aaa/dictionary?dropName=name
当然在执行完servlet后可以再对页面进行重定向,但是该种方式不提倡
该方式传递的参数中文乱码问题的解决方案:
在传递参数和接收参数的时候都要转码即可解决,如下所示:
参数传递:
URL servleturl = new java.net.URL(url.get(i).get("address").toString() + "?dropName=" + URLDecoder.decode(entity.get("TYPE").toString(),"UTF-8"));
参数接收:
String dropparam = URLDecoder.decode(request.getParameter("DropString").toString(), "UTF-8");

2.通过前台页面调用后台servlet的方式
(1)通过ajax函数实现,js代码如下:
function servlettest(obj,objName) {
var xmlHttpReq ;
if (window.ActiveXObject) {
try 
           {
               xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
           } 
           catch(e) 
           {
               try 
               {
                   xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
               } 
               catch(e) 
               {
                alert(e);
               }
           }
} else {
if (window.XMLHttpRequest) {
xmlHttpReq = new XMLHttpRequest();
}
}

var url=obj.substr(1,obj.length-2);
var servleturl= new Array(); 
servleturl=url.split(",");
for(var i=0;i<servleturl.length;i++){
var req_url = "servleturl[i]?dropName="+objName;
xmlHttpReq.onreadystatechange = callBack;
xmlHttpReq.open("GET", req_url, true);
xmlHttpReq.send(null);
}
}
function callBack() {
alert(xmlHttpReq.readyState);
if (xmlHttpReq.readyState == 4) {
if (xmlHttpReq.status == 200) {
this.result_cur = xmlHttpReq.responseText;
//logMsg("called createDrop...");
//处理数据结果
setOptions();
//logMsg("called setOptions...");
} else {
if (xmlHttpReq.status == 204) {
alert("\u8bf7\u6c42\u9519\u8bef\uff1a\u72b6\u6001\uff12\uff10\uff14");
} else {
alert(xmlHttpReq.statu);
}
}
}
}
该种方式也有局限性,该种方式不能跨域访问,即var req_url = "servleturl[i]?dropName="+objName;中的servlet地址只能是本机的地址,例如:http://localhost:8090/aaa/dictionary,这种方式是可以的,但是如果servlet地址为http://186.67.54.21:8090/aaa/dictionary 则不能访问,这是不支持跨域访问的问题。


(2)此外还可以通过ext-js调用后台servlet,好像也有这种跨域访问的问题,我也没有试验过,大家可以自己试验一下


(3)jquery调用servlet---其中jquery与richfaces有冲突,大家灵活使用
$.ajax({
   type:"post",//请求方式
  url:"./test",//发送请求地址
   data:{//发送给数据库的数据
   username:$("#username").val(),
   content:$("#content").val()
   },
   //请求成功后的回调函数有两个参数
   success:function(data,textStatus){
    $("#resText").html(data);
   }
   });
<http://blog.sina.com.cn/s/blog_57bf66e80100qzfq.html>
 
(4)在后台通过HttpURLConnection类调用servlet,其主要代码如下:
  
                        请求的servlet地址和参数
            URL servleturl = new java.net.URL(url.get(i).get("address").toString()+"?dropName="+dropName);
            HttpURLConnection connection = (java.net.HttpURLConnection) servleturl
                    .openConnection();
            connection.connect();
            InputStream urlStream = connection.getInputStream();
            String strLine = "";
            StringBuffer sb = new StringBuffer("");
            BufferedReader reader = null;
            reader = new java.io.BufferedReader(new java.io.InputStreamReader(
                    urlStream));
            while ((strLine = reader.readLine()) != null)
                sb.append(strLine).append("\n");
            reader.close();
如果参数有中文的话,该种方式针对中文乱码问题的解决方式如下:
使用这个函数转码:URLEncoder.encode(dropName,"UTF-8")//其中dropName为传递的参数

但是在servlet中接收参数的时候不需要转码,否则会出现乱码的问题


这就是我解决该问题的思路,希望对大家有所帮助




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值