Struts2 Ajax JSON 结合使用 Demo

一、背景

由于项目的需要重拾Struts,做的时候发现好多东西都忘了,写一个小小的demo,就花了大半天,还好最后终于调通了。

场景描述:前段页面输入用户名,后端将用户名和其他信息通过Ajax以Json的格式回传回来

使用工具:IDE:Myeclipse2014,服务器:Apache-tomcat-7.0.57,Struts-2.3.20及其lib,jQuery:jquery-1.11.2.min.js

需要引入的Struts包:两者需要的包有共同的地方,注意不要重复引入

  Struts所需的包:

    commons-fileupload-1.3.1.jar

    commons-io-2.2.jar

    commons-lang-2.4.jar

    commons-lang3-3.2.jar

    commons-logging-1.1.3.jar

    commons-logging-api-1.1.jar

    freemarker-2.3.19.jar

    javassist-3.11.0.GA.jar

    ognl-3.0.6.jar

    struts2-core-2.3.20.jar

    xwork-core-2.3.20.jar

  JSON需要的包:

    commons-collections-3.1.jar

    commons-lang-2.4.jar

    commons-beanutils-1.8.0.jar

    commons-logging-1.1.3.jar

    ezmorph-1.0.6.jar

    json-lib-2.3-jdk15.jar

    struts-json-plugin-2.3.20.jar

二、页面代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>Welcome Login</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">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script type="text/javascript" src="./javascript/jquery-1.11.2.min.js"></script>
<!--此处引用jQuery-->

<!-- 此段为Ajax与后端交互部分--> <script type="text/javascript"> $(document).ready(function(){ $("#usrname").change(function(){ $("logtip").empty(); $.ajax({ url : "login", // 后台处理程序,对应Action   type : "post", // 数据发送方式 dataType : "json", // 接受数据格式 data:{ usrname : $("#usrname").val() }, // 要传递的数据    // 回传函数 timeout:20000, // 设置请求超时时间(毫秒)。 error: function () { //请求失败时调用函数。 $("#logtip").html("请求失败!"); }, success:function(dataObj){ //请求成功后回调函数。 //alert(dataObj); str = jQuery.parseJSON(dataObj); $("#echoname").html(str.usrname); $("#echowd").html(str.passwd); } }); }); }); </script> </head> <body> <div> 欢迎进入Struts2.3的世界 </div> <div> <div> <span>账号:</span> <span><input type="text" name="usrname" id="usrname"/></span> <span id="logtip"></span> </div> <div> <span>账号:</span> <span id="echoname"></span> <span>密码: </span> <span id="echowd"></span> </div> </div> </body> </html>

 

三、Struts.xml

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

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="Check" namespace="/" extends="json-default">
        <action name="login" class="demo.ajax.login.LoginAction" method="execute">
            <result type="json">
                <param name="root">result</param>
            </result>
        </action>
    </package>


    <!-- Add packages here -->

</struts>

 

四、java代码

package demo.ajax.login;

import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONObject;

public class LoginAction {
    private String usrname;
    private String result;
    
    
    public String execute(){
        String passwd="success";
        Map map = new HashMap();
        map.put("usrname", usrname);
        map.put("passwd", passwd);
        
        System.out.println(usrname);
        
     /*此处将map转换为json格式的String类型*/ JSONObject jsonObj
= JSONObject.fromObject(map); result = jsonObj.toString(); return "success"; } public String getUsrname() { return usrname; } public void setUsrname(String usrname) { this.usrname = usrname; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } }

 

五、遇到的问题与总结

1、result中type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用ajax的callback方法. 返回json数据。

  我的做法是将map转换成了json格式的字符串,使用 root 参数返回的格式为  {"passwd":"success", "usrname":"love"},

  可以使用 jQuery.parseJSON 将JSON类型的字符串解析为JSON对象,进行遍历。

  另外还有其他方法,使用eval()函数(eval('(' + str + ')') ),使用jQuery.parseJSON(str),或者使用JSON.parse(str)函数。

2、根对象在JSON中数据添加一个”root”标识。如果要使用它,Action必须遵循以下几点:

   1)返回的页面类型中”content-type”必须是”application/json”;

   2)JSON内容必须是符合格式要求的;

   3)Action中field必须有public的set方法(是不是没有set方法就不会将field添加到JSON数据中,有待验证);

   4)它支持的类型有: 基本类型(int,long...String), Date, List, Map, Primitive Arrays, 其它class, 对象数组;

   5)在JSON中任何的Object会被封装在list或map中,数据会被封装程Long,如果是含有的数据则会被封装程Double,数组会被封装程List。

3、除了root参数,另外还有includeProperties 参数,excludeProperties 参数,具体情况请查看参考文章中的 《struts2学习——struts2与json》

 

六、参考文章

《Struts2学习—struts2与json》 http://huing.blog.51cto.com/1669631/1286327

《使用JQuery解析Json基础知识》 http://www.cnblogs.com/madyina/p/3448518.html

《测试struts.xml中result参数的不同返回不同的json数据》 http://blog.csdn.net/hanxiaoshuang123/article/details/7404774
 
posted @ 2015-01-16 12:00  Madshaw  阅读(550)  评论(0编辑  收藏  举报