欢迎光临郝学武的blog。

JSON实例(AJAX+STRUTS )

Posted on 2008-06-02 13:11 陕西BOY 阅读(14716) 评论(9)  编辑  收藏

前段时间做项目用到了json,今天我抽时间写了一个struts+ajax+json的例子.
个人感觉ajax+json在很大程度上降低了网络和服务器的IO,是一个很不错的组合!
1:json的lib我用的是json-lib-2.1-jdk15.jar,它可以在
2:struts用的是1.2
3:用到了js第三方prototype.js,主要用它包装的ajax对象,大家也没必要用这个,可以直接在js里用XMLHttpRequest。


以下是例子中所用到的相关文件:
/////////////////////////////////////// toolhxw.js
/**
@hxw  20080602
*/
//回调函数  简单回调函数
function showesay(dataResponse)
{
 var data = eval('(' + dataResponse.responseText + ')');
 var str='';
 str+='<ul>';
 str+='<li>'+data.param1;+'</li>';
 str+='<li>'+data.param2;+'</li>';
 str+='</ul>';
 document.getElementById("content").innerHTML=str;
}
//回调函数  复杂回调函数
function showcomplex(dataResponse)
{
 var data = eval('(' + dataResponse.responseText + ')');
 var str='';
 for(var i=0;i<data.js.length;i++)
 {
 str+='<ul>';
 str+='<li>'+data.js[i].id+'</li>';
 str+='<li>'+data.js[i].age+'</li>';
 str+='<li>'+data.js[i].name+'</li>';
 str+='<li>'+data.js[i].address+'</li>';
 str+='</ul>';
 }
 document.getElementById("content").innerHTML=str;
}
//获取简单的json数据
function getesay(){
 var url = 'test.do';
  var pars = 'method=getEasy';
  var ajax = new Ajax.Request(
   url,
   {method:'post',parameters:pars,onComplete:showesay}
  );  
}
//获取对象级复杂数据
function getcomplex(){
 var url = 'test.do';
  var pars = 'method=getComplex';
  var ajax = new Ajax.Request(
   url,
   {method:'post',parameters:pars,onComplete:showcomplex}
  );  
}

///////////////////////////////////////struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />
  <form-beans />
  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action path="/test" parameter="method" type="com.json.struts.action.TestAction">
   </action>
   
  </action-mappings>

  <message-resources parameter="com.json.struts.ApplicationResources" />
</struts-config>

 ////////////////////////////////TestAction.java

/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 */
package com.json.struts.action;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import net.sf.json.*;

/**
 * @author hxw
 *
 */
public class TestAction extends DispatchAction {
 

 /**
  * 获取简单组合数据
  */
 public ActionForward getEasy(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  response.setContentType("text/html; charset=GBK");
  try
  {
   PrintWriter out = response.getWriter();
   //这里的数据拼装一般是从数据库查询来的
   JSONObject jsonObject = new JSONObject();
      jsonObject.put("param1", "变量一");
      jsonObject.put("param2", "变量二");
   out.print(jsonObject.toString());
   out.flush();
   out.close();
   return null;
  }catch(Exception e)
  {
   e.printStackTrace();
   return null;
  }
  }
 /**
  * 获取复杂组合数据
  */
 public ActionForward getComplex(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  response.setContentType("text/html; charset=GBK");
  try
  {
   PrintWriter out = response.getWriter();
   JSONObject obj = new JSONObject();
   JSONArray js = new JSONArray();
   //这里的数据拼装一般是从数据库查询来的
    for(int i=0;i<3;i++)
    {
     JSONObject objtemp = new JSONObject();
     objtemp.put("id", i);
     objtemp.put("age", "23");
     objtemp.put("name", "test"+i);
     objtemp.put("address", "test");
     js.add(objtemp);
    }
   obj.put("js",js);
         out.print(obj.toString());
  }catch(Exception e)
  {
   e.printStackTrace();
   System.out.print("消费明细json存储异常");
  }
  return null;
 }
}

////////////////////////////test.jsp
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>json练习</title>
   
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <script type="text/javascript"  src="js/prototype.js"></script>
    <script type="text/javascript"  src="js/toolhxw.js"></script>
    </head>
 
  <body>
  <div id="func" >
  <a href='javascript:getesay()'>获取简单组合数据</a>
  <a href='javascript:getcomplex()'>获取复杂组合数据</a>
  </div>
    <div id="content">
    正在获取内容...
    </div>
  </body>
</html>
大家将这几个文件拷贝到你的myeclipse的web项目中,发布运行即可。

Feedback

# re: JSON例子(struts+ajax+json)  回复  更多评论   

2008-06-02 17:00 by 隔叶黄莺
请教个简单的问题,当 Java 给 JS 生成的字符串中含有单引号或双引号是如何处理的。

比如:out.println("var str='"+name+"'");

name 可能包含单引号也可能包含双引号,这个要交给 js 的输出一般如何写的,单引号或双引号怎么转义更简洁些。

# re: JSON例子(struts+ajax+json)[未登录]  回复  更多评论   

2008-06-03 09:12 by 陕西boy
json里面的数据全是键-值对,它和java有对应的数据类型。比如String,你在数据填装的时候全是按照java的规则,json只不过做为一种包装容器,暂时把你填装的东西放进来,比如:
JSONObject jsonObject = new JSONObject();
jsonObject.put("param1", "\'变量一\"");
jsonObject.put("param2", "变量二");
out.print(jsonObject.toString());
你可以看一下运行结果,和java中的输出是一模一样的,也就是说对于逗号等操作完全由你的业务类负责,满足java语法。

# re: JSON实例(AJAX+STRUTS )  回复  更多评论   

2008-06-27 15:38 by young.jiandong
我现在碰到个问题,照你的代码改写我的程序时,如果中文信息是双数的话,正常,单数时,最后一个字就花了。

# re: JSON实例(AJAX+STRUTS )  回复  更多评论   

2008-06-30 16:12 by 陕西BOY
不会哪样的,我刚做了一个奇数和偶数汉字的例子,完全正常,你再看看你是否是其他设置而引起了这个问题~~~~~

# re: JSON实例(AJAX+STRUTS )  回复  更多评论   

2008-07-01 17:20 by young.jiandong
我的环境:tomcat5.5.23,struts1.2(采用了expresso5.5),jdk1.5,采用GBK过滤器。
页面:
var p = $('theId').value;
var pas = "theId=" + p;
new Ajax.Request('<html:rewrite page="/util/namelookup.do?state=NameLookup"/>', {
parameters: pas,
method:'post',
//encoding: 'GBK',
onComplete: function(dataResponse){
var data = eval('(' + dataResponse.responseText + ')');
alert(data.fullName);
$('fullName').value = data.fullName;
}
});

程序处理部分:
String theId = request.getParameter("theId");
ServletControllerRequest sr = (ServletControllerRequest) request;
HttpServletResponse hres = (HttpServletResponse) sr.getServletResponse();
hres.setContentType("text/html;charset=GBK");
try{
String ss = new String(theId.getBytes("GBK"),"UTF-8");
//到了这步,如果中文信息为单数时,最后一个汉字就花了。
PrintWriter out = hres.getWriter();
JSONObject json = new com.jsite.json.JSONObject();
json.put("fullName", "Input : "+ss);
out.print(json.toString());
out.flush();
out.close();
}catch(Exception e){
e.printStackTrace();
}

# re: JSON实例(AJAX+STRUTS )  回复  更多评论   

2008-07-01 17:23 by young.jiandong
不好意思,我没讲明白,我的意思是通过ajax得到提交信息时才会出现这个情况。

# re: JSON实例(AJAX+STRUTS )  回复  更多评论   

2008-07-01 17:45 by young.jiandong
参考 http://blog.csdn.net/zhangyunbo1116/archive/2007/04/29/1589684.aspx ,已解决。
谢谢。

# re: JSON实例(AJAX+STRUTS )[未登录]  回复  更多评论   

2008-07-21 22:55 by 陕西BOY
哦,最近忙,没时间上blog,解决了就好。

# re: JSON实例(AJAX+STRUTS )[未登录]  回复  更多评论   

2009-03-31 15:41 by dada
不知道为什么按这么操作在页面上点了连接他跳不到action里面去

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 17, comments - 65, trackbacks - 0, articles - 28

Copyright © 陕西BOY