`
jsx112
  • 浏览: 315310 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

struts2中使用JSON插件实现AJAX

阅读更多
1.下载JSON插件jsonplugin-0.32.jar,并导入到工程中

  http://code.google.com/p/jsonplugin/downloads/list

2.下载prototype.js(可选),并放到WebContent/js中

  http://www.prototypejs.org/assets/2007/11/6/prototype.js

  这个脚本里有调用ajax的方法,并封装了一些实用的方法(如提取Form中要提交的参数), 如果不用到这些方法可以不用,本文没有用到

3.问题说明

  (1)Form.serialize中文乱码

  其中Form.serialize($('converge')),是把converge表单中所有的字段,拼成method=xxx&type=sss的形式。

  在prototype的函数中,会把key和value分别用encodeURIComponent 来把一个字符串转成utf-8的URL编码形式。比如,“中文”会被编码成:%E4%B8%AD%E6%96%87

但该字符串传到后台时,会被识别成乱码. 用request.getParameter取到的字符串也是乱码,而不是本身的字符。

  主要原因是%号,如果该串改成%22E4%22B8%22AD%22E6%2296%2287 也是可以识别的.

  解决方法: 在prototype文件中找到 encodeURIComponent  这段, 在encodeURIComponent 后,再将该字符串用escape方法再编码一次。 这时候传到后台,用request.getParameter,可以得到编码后的正确的字符串。即 %E4%B8%AD%E6%96%87 .

这时,可以用java.net.URLDecoder.decode(keyword, "UTF-8");  对这个字符串进行解码,从而得到正确的中文。

  (2)页面中的request.readyState 是 HTTP 的就绪状态。

  request.readyState == 0 :请求没有发出(在调用 open() 之前)。
  request.readyState == 1 :请求已经建立但还没有发出(调用 send() 之前)。
  request.readyState == 2 :请求已经发出正在处理之中(这里通常可以从响应得到内容头部)。
    request.readyState ==3 :请求已经处理,响应中通常有部分数据可用,但是服务器还没有完成响应。
  request.readyState == 4 :响应已完成,可以访问服务器响应并使用它。



4.源码

配置struts

web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <display-name>SampleSS</display-name>    <filter>    <filter-name>struts2</filter-name>    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  </filter>    <filter-mapping>    <filter-name>struts2</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>    <welcome-file-list>      <welcome-file>/jsp/SampleJsp.jsp</welcome-file>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list></web-app>


SampleJsp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script src="<%=request.getContextPath()%>/js/Prototype.js" type="text/javascript"></script><script type="text/javascript">    var xmlHttpSupport = (typeof XMLHttpRequest != "undefined" || window.ActiveXObject);    if (typeof XMLHttpRequest == "undefined" && window.ActiveXObject) {        function XMLHttpRequest() {            var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",                                 "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",                                 "Microsoft.XMLHTTP"];            for (var i=0; i < arrSignatures.length; i++) {                try {                    var oRequest = new ActiveXObject(arrSignatures[i]);                    return oRequest;                } catch (oError) { /*ignore*/ }            }            throw new Error("MSXML is not installed on your system.");        }    }    function appendXmlValue(key, value) {        var str = "\n<" + key + ">" + value + "</" + key + ">";        return str;    }    function ajaxSubmit() {        if(xmlHttpSupport) {            var sUrl = "SampleAction.action";            var request = new XMLHttpRequest();            request.onreadystatechange = function() {                if(request.readyState == 4) {                    var result = eval("(" + request.responseText + ")");                    document.getElementById("result").innerHTML = "<span>" + result.sum + "</span>";                }            };            request.open('POST', sUrl);            var xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><RequestInfo>";            var params = Form.serialize("sampleForm");//通过prototype.js脚本获取Form表单中提交的数据(也可以手动完成如下面注释掉的部分)//          xmlStr += appendXmlValue("id", document.getElementById("id").value);//          xmlStr += appendXmlValue("name", document.getElementById("name").value);            var paraList = params.split("&");            for(var i=0; i<paraList.length; i++) {                var temp = paraList[i].split("=");                xmlStr +=  appendXmlValue(temp[0], temp[1]);            }            xmlStr += "</RequestInfo>";            request.send(xmlStr);        }    }</script></head><body>    <label>输入字符判断界面是否刷新</label><input>    <form action="SampleAction_add.action" method="post" id="sampleForm">        <label>id</label><input id="id" type="text" name="id">        <label>name</label><input id="name" type="text" name="name">        <input type="button" value="ajaxSubmit" onclick="ajaxSubmit()" />    </form>    <label>IdAndName:</label>    <label id="result"></label></body></html>


struts配置文件,package的extends改为"json-default"

struts.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>    <package name="struts" extends="json-default">        <action name="SampleAction" class="com.zz.action.SampleAction">            <result type="json"></result>        </action>    </package></struts>


SampleAction.java
package com.zz.action;import com.opensymphony.xwork2.ActionSupport;import com.zz.vo.SampleVo;import com.zz.util.DocObject;@SuppressWarnings({"serial", "unchecked"})public class SampleAction extends ActionSupport {        private SampleVo svo;    String sum;    @Override    public String execute() {        DocObject doc = null;        try {            javax.servlet.ServletInputStream inputStream = org.apache.struts2.ServletActionContext.getRequest().getInputStream();            doc = new DocObject(inputStream);            svo = new SampleVo();            svo.setId(doc.getNodeValue("id"));            svo.setName(doc.getNodeValue("name"));                    } catch (Exception e) {            e.printStackTrace();        } finally {            if (doc != null)                doc.close();        }                if(svo!=null) {            sum = svo.getId() + svo.getName();        }        return com.opensymphony.xwork2.Action.SUCCESS;    }        public SampleVo getSvo() {        return svo;    }    public void setSvo(SampleVo nvo) {        this.svo = nvo;    }    public String getSum() {        return sum;    }    public void setSum(String sum) {        this.sum = sum;    }    }


DocObject.java
package com.zz.util;import java.io.IOException;import java.io.InputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;/** * 使用ajax时解析xml文件 * @author zz *  */public class DocObject {    private Node rootNode;    private InputStream stream;    public DocObject(InputStream stream) throws ParserConfigurationException,            SAXException, IOException {        this.stream = stream;        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory                .newInstance();        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();        Document doc = docBuilder.parse(stream);        NodeList parameters = doc.getElementsByTagName("RequestInfo");        if (parameters != null)            rootNode = parameters.item(0);    }    public String getNodeValue(String nodeName) {        String s = "";        if (rootNode.getNodeType() == Node.ELEMENT_NODE) {            Element rootElement = (Element) rootNode;            NodeList childList = rootElement.getElementsByTagName(nodeName);            Element childElement = (Element) childList.item(0);            if (childElement != null) {                NodeList textFNList = childElement.getChildNodes();                if (textFNList != null){                    Node temp = (Node) textFNList.item(0);                    if(temp != null){                        s = temp.getNodeValue();                        if (s != null)                            s = s.trim();                    }                }            }        }        return s;    }    public void close() {        if (stream != null) {            try {                stream.close();            } catch (Exception e) {            }        }    }}


SampleVo.java
package com.zz.vo;public class SampleVo {        private String id;    private String name;        public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    }
分享到:
评论

相关推荐

    struts2+json+jquery实现ajax数据的存取

    在Struts2中,我们可以使用JSON插件来方便地序列化和反序列化Java对象为JSON格式,从而实现在Ajax请求中发送和接收数据。 **3. jQuery库** jQuery是一个高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理...

    使用Struts2的JSON插件来实现JSON数据传递

    然后,在Struts2的配置文件struts.xml中启用JSON插件,通常通过以下配置实现: ```xml &lt;constant name="struts.enable.SlashesInActionNames" value="true"/&gt; &lt;constant name="struts.action.extension" value=...

    Struts2 + jQuery+JSON 实现ajax

    描述中提到的第一步是将Struts2的JSON插件加入到Web项目的lib目录下。这一步非常重要,因为JSON插件为Struts2提供了处理JSON数据的能力。插件的下载地址为:[http://code.google.com/p/jsonplugin/downloads/list]...

    Struts2 ajax json使用介绍

    首先,为了在Struts2中使用Ajax和JSON,我们需要引入以下库: 1. Struts2的核心库:`struts2-core.jar` 2. Struts2的JSON插件:`struts2-json-plugin.jar` 3. JSON处理库:`json-lib.jar`(通常在Struts2的JSON插件...

    Struts2+JSON_实现AJAX_返回对象和列表

    在Struts2中,JSON插件允许我们在Action中返回JSON格式的数据,以便于JavaScript进行异步处理。要使用JSON插件,你需要下载并添加相应的JAR文件到项目的类路径中,例如`jsonplugin-0.33.jar`和其他Struts2的核心库。...

    json2+jsonplugin struts2整合ajax时,使用json时需要的jar包

    在Struts2框架中整合Ajax以实现异步数据交互,JSON(JavaScript Object Notation)扮演了关键角色。JSON是一种轻量级的数据交换格式,它允许Web应用与服务器之间高效地传输数据,而无需进行繁琐的HTTP请求。在这个...

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    struts2的json插件

    4. **与AJAX集成**:JSON插件使得Struts2与jQuery、Dojo等库的AJAX请求无缝集成,能够快速响应前端的动态请求。 在提供的压缩包中,有两个不同版本的JSON插件:`jsonplugin-0.34.jar` 和 `jsonplugin-0.32.jar`。...

    在Struts 2中使用JSON Ajax支持

    ### 在Struts 2中使用JSON Ajax支持的关键知识点 #### 一、Struts 2与JSON Ajax集成概览 在Web开发中,Struts 2框架因其强大的MVC架构支持和丰富的插件生态,被广泛应用于构建动态网页应用。而随着Ajax技术的发展...

    struts2乱码与json插件(1)

    在这个主题中,“struts2乱码与json插件”主要关注两个方面:字符编码问题和JSON数据交互。 **字符编码问题** 在开发web应用时,乱码问题经常出现,尤其是在处理用户输入或显示非ASCII字符时。Struts2框架默认使用...

    struts2+json

    在Struts2中集成JSON支持,首先需要添加相应的依赖,比如struts2-json-plugin,这个插件提供了JSON结果类型。当Action执行完毕后,可以返回一个JSON结果类型,Struts2会自动将Action的属性转换为JSON格式并返回给...

    struts2+json+jquery实现ajax登录和注册功能

    在Struts2中,配合JSON插件,可以实现更高级别的数据封装,不仅限于简单的属性值传递,还能处理多层级的对象数据,为复杂的业务逻辑提供数据支撑。 #### 三、jQuery:Ajax交互的最佳拍档 jQuery是一个快速、简洁的...

    struts2要使用json必须的两个包

    在Struts2中使用JSON,有两个关键的JAR包是必不可少的,这些正是`struts2-json-plugin-2.2.1.jar`和`json-lib-2.3-jdk15.jar`。 首先,`struts2-json-plugin-2.2.1.jar`是Struts2 JSON插件的实现库。这个插件为...

    struts2的Ajax实现注册验证

    6. **整合Struts2 JSON插件**:`struts2-json-plugin-2.3.4.1.jar`是Struts2用于JSON支持的插件。确保这个插件已添加到项目的类路径中,它能帮助Struts2更方便地处理JSON数据,并将其作为Action结果返回。 7. **...

    struts 2.0 与 2.1 需要的json插件

    在Struts 2的早期版本中,如2.0和2.1,为了支持JSON(JavaScript Object Notation)数据交换格式,开发者需要额外安装和配置JSON插件。JSON在Web应用中广泛用于前后端的数据传输,因为它轻量级、易于阅读和编写,...

    struts2+jquery+json+ajax例子

    在Struts2中,可以通过配置Action类的返回类型为"json",使得Action执行后返回JSON对象。JSON数据在Ajax请求和响应中起到关键作用,它可以将登录验证的结果(例如,成功或失败信息、错误消息等)以结构化的方式传递...

    Struts2中使用JSON

    在Struts2中使用JSON(JavaScript Object Notation)可以方便地将服务器端的数据传输到客户端,通常用于AJAX请求或者创建RESTful API。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成...

    使用struts2 和ajax进行传递json数据

    1. 在Struts2中,确保已经添加了JSON插件,如struts2-json-plugin,以便支持JSON结果类型。 2. 配置Struts2的struts-default.xml,启用JSON结果类型。 3. 前端需要设置Content-Type为"application/json",以表明发送...

    Struts 2中启用json ajax支持

    值得注意的是,随着技术的发展,如今很多开发者可能会选择Spring Boot或React等现代框架进行开发,但了解如何在Struts 2中使用JSON和AJAX仍然是有价值的知识,尤其是对于维护旧项目或者理解Web应用基础架构时。

Global site tag (gtag.js) - Google Analytics