解决JavaScript 与Servlet之间的通讯

来源:互联网 发布:游戏编程 编辑:程序博客网 时间:2024/05/10 01:32

转贴地址:http://blog.csdn.net/dxmdxs/archive/2006/03/23/636170.aspx

http://blog.csdn.net/crackcell/archive/2007/09/03/1769654.aspx

解决JavaScript Servlet之间的通讯.通过测试,得出如下代码不会出现中文问题,当然这断代码有很多不足之处,或许是巧合.由此,系统可以通过JavaScript直接访问JavaBeans 读取数据库的记录并进行操作.
JavaScript代码如下:
URL="http://localhost:8080/xml/servlet/xml"
 function SendXML()
 {
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      xmlhttp.Open("GET",URL,false);       
      xmlhttp.setRequestHeader("Charset","gb2312");
      xmlhttp.send("唯思");    
      // 测试发送是否成功
      if ( xmlhttp.status == 200 )
      {
alert(xmlhttp.responseText);
      } else{
alert("服务器错误,状态代码:"+xmlhttp.status+",原因:"+xmlhttp.reason);
}
 }
 
Servlet代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class xml extends HttpServlet {
      public xml() {
           super();
      }
public void doPost(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
           PrintWriter out = response.getWriter();        
           out.print(request.getReader().readLine());               
           out.flush();
           out.close();
      }
}
 

解决JavaScript 通过XMLServlet之间的通讯.即可以传递一个XMLDOM交给Servlet进行处理.
JavaScript源代码如下:
<script>
 URL="http://localhost:8080/xml/servlet/xml"
 var xml="<?xml version='1.0' encoding='utf-8'?><root>唯思</root>" 
 function SendXML()
 {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.Open("POST",URL,false);
    xmlhttp.setRequestHeader("charset", "utf-8");
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async="false";
    xmlDoc.loadXML(xml);
    xmlhttp.send(xmlDoc);   
    // 测试发送是否成功?
     if ( xmlhttp.status == 200 )
         //alert(SendMessage);           
             xmlDoc.loadXML(xmlhttp.responseText); document.getElementById("ws").innerHTML=xmlDoc.selectSingleNode("/root").text;
         } else
        {
        alert("服务器错误,状态代码:"+xmlhttp.status+",原因:"+xmlhttp.reason);
        }
 }
</script>
Servlet代码如下:
public class xml extends HttpServlet {
      public void doGet(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
      }
      public void doPost(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
           response.setCharacterEncoding("utf-8");
           PrintWriter out = response.getWriter();
           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
           factory.setValidating(false);
           Document doc;
           try {
                 doc = factory.newDocumentBuilder().parse(request.getInputStream());
                 DOMSource source = new DOMSource(doc);
                 Result result = new StreamResult(out);
                 Transformer xformer = TransformerFactory.newInstance()
                            .newTransformer();           
                 xformer.transform(source, result);             
           } catch (SAXException e) {
                 e.printStackTrace();
           } catch (IOException e) {
                 e.printStackTrace();
           } catch (ParserConfigurationException e) {
                 e.printStackTrace();
           } catch (TransformerException e) {             
                 e.printStackTrace();
           } catch (TransformerFactoryConfigurationError e) {              
                 e.printStackTrace();
           }
           out.flush();
           out.close();
      }
}
测试结果:唯思. 由此,我们可以通过javax.xml.parsersorg.w3c.domServlet内部解析XML并将所要求的请求发送到Hibernate操作MySQL实现更方便快速的进行查询及更改.
注意: 1.在写JavaScript验证的时候,并不能完全代替后台的数据验证,这是因为攻击者完全可以伪造浏览进行非法递交. 对于安全非常重要的环节,绝对不可以忽略这一点. 2.在写JavaScript生成XMLServlet进行通讯的时候,当递交和返回都含有整个数据库的内容时,此方法并不可取. 这是因为,当需求发生更改时,将导致大理代码的修改. 所以,此方法只比较合适用于简单操作上,如用户名是否重复,删除某一用户等,只需要简单数据,并且这些数据的变更非常小.