http://download.csdn.net/download/zyw_java/7101821
http://www.poluoluo.com/jzxy/201402/261573.html
在开发中我们经常遇到客户端和后台数据的交互,使用比较多的就是json格式了。在这里以简单的Demo总结两种ssh返回Json格式的数据
项目目录如下
主要是看 上图选择的部分 WebRoot里面就是平常的配置
第一种方法是使用com.google.gson.Gson 将对象转化为Json字符串 (gson-1.6.jar) 主要的代码如下
1 package com.javen.tool; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.http.HttpServletResponse; 7 8 import com.google.gson.Gson; 9 10 public class ResultUtils { 11 public static void toJson(HttpServletResponse response, Object data) 12 throws IOException { 13 Gson gson = new Gson(); 14 String result = gson.toJson(data); 15 response.setContentType("text/json; charset=utf-8"); 16 response.setHeader("Cache-Control", "no-cache"); //取消浏览器缓存 17 PrintWriter out = response.getWriter(); 18 out.print(result); 19 out.flush(); 20 out.close(); 21 } 22 23 24 }
在Action中我们直接将返回的数据封装成Map对象即可 再使用上面的工具类即可
1 public String execute() { 2 Map<String, Object> map = new HashMap<String, Object>(); 3 String status = null; 4 try { 5 System.out.println(name + "" + pass); 6 if (!Tools.isEmpty(name) && !Tools.isEmpty(pass)) { 7 User user = new User(); 8 user.setName(name); 9 user.setPassword(pass); 10 List<User> list = userHander.getUserDAO().findByExample(user); 11 System.out.println(list.size()); 12 if (list.size() > 0) { 13 status = "1"; 14 map.put("users", list); 15 } else { 16 status = "null"; 17 } 18 } else { 19 status = "0"; 20 } 21 map.put("status", status); 22 ResultUtils.toJson(ServletActionContext.getResponse(), map); 23 } catch (IOException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 return null; 28 }
struts 配置如下
1 <package name="default" extends="struts-default" namespace="/"> 2 <global-results> 3 <result name="error">/Error.jsp</result> 4 </global-results> 5 6 <action name="userAction" class="userAction"> 7 </action> 8 </package>
通过浏览器访问返回的数据如下(http://127.0.0.1:8080/DataJson/userAction?name=javen&pass=123)
第一种方法是使用Struts配置实现 将对象转化为Json字符串 主要的代码如下
1、private Map<String, Object> jsonResult; 将声明的对象封装生成get和set方法
2、封装查询的数据到Map集合中 代码如下
1 public String userToJson(){ 2 Map<String, Object> map = new HashMap<String, Object>(); 3 String status = null; 4 try { 5 System.out.println(name + "" + pass); 6 if (!Tools.isEmpty(name) && !Tools.isEmpty(pass)){ 7 User user = new User(); 8 user.setName(name); 9 user.setPassword(pass); 10 List<User> list = userHander.getUserDAO().findByExample(user); 11 System.out.println(list.size()); 12 if (list.size() > 0) { 13 status = "1"; 14 map.put("users", list); 15 } else { 16 status = "null"; 17 } 18 } else { 19 status = "0"; 20 } 21 map.put("status", status); 22 jsonResult=map; 23 return "success"; 24 } catch (Exception e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 return null; 29 }
3、配置struts (注意要extends >>>json-default)
<!-- 使用struts2 配置来实现 返回Json数据 --> <package name="json" extends="struts-default,json-default" namespace="/"> <global-results> <result name="error">/Error.jsp</result> </global-results> <action name="userjson" class="userAction" method="userToJson"> <result type="json" > <param name="root">jsonResult</param> </result> </action> </package>
通过浏览器访问返回的数据如下
源码下载地址 http://download.csdn.net/detail/zyw_java/7101821
-----------------------------
<SCRIPT type=text/javascript>
$(function () {
//隐藏母板页的tab搜索标签
$("#searchBar").html("");
$("#searchBar").css("background-color","white");
$(".search_btn_vv").click(function(){
var keywords = $("#ctl00_CPH1_txtKeyWords").val();
if(keywords == '请输入关键字' || keywords == ""){
alert('请输入关键字');
}
else{
turnToSubSearchPage($(".text1").attr("name"));
//searchClick('search.aspx');
}
});
// 文档框输入后按Enter自动搜索
$("#ctl00_CPH1_txtKeyWords").keydown(function(){
if (event.keyCode == 13) {
event.returnValue = false;
$(".search_btn_vv").click();
return false;
}
});
//将footer置底
$("#footer").attr("style",'position: fixed; bottom: 0px');
//By COoL
//定义全局变量用于储存提示层
var liketips;
//监听改动或得到焦点事件
//禁用chrome和firefox浏览器自带的自动提示
$('.getsearchjson').attr("autocomplete","off");
$('.getsearchjson').bind("propertychange input focus",function(event){
$this=$(this);
if(event.type!='focus'){
//如果有改变,则状态定为必须重新选择,因为纯人手输入会导致value无法插入
$this.data('ok',false);
}
//获取input框位置并计算提示层应出现的位置
var top=1*$this.offset().top+25;
var left=1*$this.offset().left;
var width=1*$this.width()+12;
//重建储存提示层并让其在适当位置显示
$(liketips).remove();
liketips=document.createElement('div');
$liketips=$(liketips);
//class样式这里不提供,最主要是position:absolute
$liketips.addClass("liketips");
$liketips.css({top:top+'px',left:left+'px',width:width+'px'});
//加载前先显示loading动态图
$liketips.append('<img src="/images/loading.gif" border="0" />');
$liketips.appendTo($this.parent());
$liketips.show();
//定义ajax去获取json,type参数通过data-type设置,keyword则是目前已输入的值
//返回值以table形式展示
$.post('/data/search.do',{type:$this.data('type'),keyword:$this.val()},function(json){
$liketips.empty();
var htmlcode="<table cellspacing='0' cellpadding='2'><tbody>";
for(var i=0;i<json.datas.length;i++){
//这里我需要用到value和title两项,所以用data-value传递多一个参数,在回车或鼠标点击后赋值到相应的地方,以此完美地替代select
htmlcode+='<tr data-value="'+json.datas[i][0]+'"><td>'+json.datas[i][1]+'</td></tr>';
}
htmlcode+="</tbody></table><span>请务必在此下拉框中选择</span>";
//把loading动态图替换成内容
$liketips.html(htmlcode);
},"json");
});
//焦点消失时确保数据来自选项,隐藏提示框体
$('.getsearchjson').blur(function(){
//因为鼠标点击时blur动作结算在click之前,setTimeout是为了解决这个问题
$oldthis=$(this);
setTimeout(function(){
// if($oldthis.data('ok'))
$(liketips).fadeOut('fast');
// else{
// alert('为保证数据准确性,请务必在下拉提示中选择一项,谢谢合作');
// $oldthis.focus();
// }
},200);
});
//监听键盘动作
$('.getsearchjson').keydown(function(event){
//console.log(event.keyCode);
$this=$(this);
if(event.keyCode==40){
//按键是向下
$nowtr=$('tr.selectedtr');
//如果已存在选中,则向下,否则,选中选单中第一个
if($nowtr.length>0){
$nexttr=$nowtr.next('tr')
//如果不是最后选项,向下个tr移动,否则跳到第一个tr
if($nexttr.length>0){
$('tr.selectedtr').removeClass();
$nexttr.addClass('selectedtr');
}
else{
$('tr.selectedtr').removeClass();
$nowtr.parent().find('tr:first').addClass('selectedtr');
}
}
else{
$('.liketips').find('tr:first').addClass('selectedtr');
}
}
else if(event.keyCode==38){
//按键是向上
$nowtr=$('tr.selectedtr');
//如果已存在选中,则向下,否则,选中选单中第一个
if($nowtr.length>0){
$prevtr=$nowtr.prev('tr')
//如果不是最后选项,向下个tr移动,否则跳到第一个tr
if($prevtr.length>0){
$('tr.selectedtr').removeClass();
$prevtr.addClass('selectedtr');
}
else{
$('tr.selectedtr').removeClass();
$nowtr.parent().find('tr:last').addClass('selectedtr');
}
}
else{
$('.liketips').find('tr:last').addClass('selectedtr');
}
}
else if(event.keyCode==13){
//按键是回车,则确定返回并隐藏选框
$nowtr=$('tr.selectedtr');
if($nowtr.length==1){
//设置value值到input框通过参数data-valueto配置的value值存储项中去,一般是hidden项
$valuefield=$('input[name='+$this.data('valueto')+']');
$valuefield.val($nowtr.data('value'));
$this.val($nowtr.text());
//设置状态是从选项中选择,允许blur
$this.data('ok',true);
}
$(liketips).fadeOut('fast');
return false;
}
//console.log(event.keyCode);
return true;
});
//监听鼠标动作,mouseover改变选中项
$(document).delegate('.liketips td','mouseover',function(){
$nowtr=$(this).parent();
$nowtr.siblings('tr').removeClass();
$nowtr.addClass('selectedtr');
});
//监听鼠标动作,click选定
$(document).delegate('.liketips td','click',function(){
$nowtr=$(this).parent();
if($nowtr.length==1){
//取得该提示层对应的input框
$inputfield=$nowtr.parent().parent().parent().siblings('input.getsearchjson');
//设置value值到input框通过参数data-valueto配置的value值存储项中去,一般是hidden项
$valuefield=$('input[name='+$inputfield.data('valueto')+']');
$valuefield.val($nowtr.data('value'));
$inputfield.val($nowtr.text());
//设置状态是从选项中选择,允许blur
$inputfield.data('ok',true);
}
$(liketips).fadeOut('fast');
});
});
</SCRIPT>
<DIV class=content>
<DIV class=contentLogo></DIV>
<DIV class=searchList>
<DIV class=ser_bar>
<DIV class=ser_txt_vv>
<INPUT οnblur="if(this.value==''){this.value='请输入关键字';this.style.color='#999'}"
style="COLOR: #999" id=ctl00_CPH1_txtKeyWords88 class="ser_input_vv88 getsearchjson"
οnfοcus="if(this.value=='请输入关键字'){this.value='';this.style.color='#000'}"
value=请输入关键字 name=ctl00$CPH1$txtKeyWords> </DIV>
<DIV class=ser_img_vv><INPUT id=ctl00_CPH1_searchBtn class=search_btn_vv value=易搜 type=button>
</DIV></DIV></DIV></DIV></DIV></DIV>
</DIV>
</FORM>
</BODY></HTML>