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插件来方便地序列化和反序列化Java对象为JSON格式,从而实现在Ajax请求中发送和接收数据。 **3. jQuery库** jQuery是一个高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理...
然后,在Struts2的配置文件struts.xml中启用JSON插件,通常通过以下配置实现: ```xml <constant name="struts.enable.SlashesInActionNames" value="true"/> <constant name="struts.action.extension" value=...
描述中提到的第一步是将Struts2的JSON插件加入到Web项目的lib目录下。这一步非常重要,因为JSON插件为Struts2提供了处理JSON数据的能力。插件的下载地址为:[http://code.google.com/p/jsonplugin/downloads/list]...
首先,为了在Struts2中使用Ajax和JSON,我们需要引入以下库: 1. Struts2的核心库:`struts2-core.jar` 2. Struts2的JSON插件:`struts2-json-plugin.jar` 3. JSON处理库:`json-lib.jar`(通常在Struts2的JSON插件...
在Struts2中,JSON插件允许我们在Action中返回JSON格式的数据,以便于JavaScript进行异步处理。要使用JSON插件,你需要下载并添加相应的JAR文件到项目的类路径中,例如`jsonplugin-0.33.jar`和其他Struts2的核心库。...
在Struts2框架中整合Ajax以实现异步数据交互,JSON(JavaScript Object Notation)扮演了关键角色。JSON是一种轻量级的数据交换格式,它允许Web应用与服务器之间高效地传输数据,而无需进行繁琐的HTTP请求。在这个...
【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和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集成概览 在Web开发中,Struts 2框架因其强大的MVC架构支持和丰富的插件生态,被广泛应用于构建动态网页应用。而随着Ajax技术的发展...
在这个主题中,“struts2乱码与json插件”主要关注两个方面:字符编码问题和JSON数据交互。 **字符编码问题** 在开发web应用时,乱码问题经常出现,尤其是在处理用户输入或显示非ASCII字符时。Struts2框架默认使用...
在Struts2中集成JSON支持,首先需要添加相应的依赖,比如struts2-json-plugin,这个插件提供了JSON结果类型。当Action执行完毕后,可以返回一个JSON结果类型,Struts2会自动将Action的属性转换为JSON格式并返回给...
在Struts2中,配合JSON插件,可以实现更高级别的数据封装,不仅限于简单的属性值传递,还能处理多层级的对象数据,为复杂的业务逻辑提供数据支撑。 #### 三、jQuery:Ajax交互的最佳拍档 jQuery是一个快速、简洁的...
在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插件的实现库。这个插件为...
6. **整合Struts2 JSON插件**:`struts2-json-plugin-2.3.4.1.jar`是Struts2用于JSON支持的插件。确保这个插件已添加到项目的类路径中,它能帮助Struts2更方便地处理JSON数据,并将其作为Action结果返回。 7. **...
在Struts 2的早期版本中,如2.0和2.1,为了支持JSON(JavaScript Object Notation)数据交换格式,开发者需要额外安装和配置JSON插件。JSON在Web应用中广泛用于前后端的数据传输,因为它轻量级、易于阅读和编写,...
在Struts2中,可以通过配置Action类的返回类型为"json",使得Action执行后返回JSON对象。JSON数据在Ajax请求和响应中起到关键作用,它可以将登录验证的结果(例如,成功或失败信息、错误消息等)以结构化的方式传递...
在Struts2中使用JSON(JavaScript Object Notation)可以方便地将服务器端的数据传输到客户端,通常用于AJAX请求或者创建RESTful API。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成...
1. 在Struts2中,确保已经添加了JSON插件,如struts2-json-plugin,以便支持JSON结果类型。 2. 配置Struts2的struts-default.xml,启用JSON结果类型。 3. 前端需要设置Content-Type为"application/json",以表明发送...
值得注意的是,随着技术的发展,如今很多开发者可能会选择Spring Boot或React等现代框架进行开发,但了解如何在Struts 2中使用JSON和AJAX仍然是有价值的知识,尤其是对于维护旧项目或者理解Web应用基础架构时。