struts2,ajax,json传json给Action中的类对象,并返回需要的数据

一.准备

1.json所需jar包:(有时候内容没问题,仔细检查jar包,是不是少了,各种版本杂交....我用的是struts2-2.5.8里jar包,可以成功)

commons-lang.jar

json-lib-2.3-jdk15.jar

struts2-json-plugin-2.2.3.jar

ezmorph-1.0.1.jar

commons-beanutils-1.9.2.jar

commons-collections-3.1.jar

除此之外,stuts2环境不用多说了。

二.内容

1.说明

就一个html页面test.html。流程就是在提交部分输入数据,点击提交,把数据传到TestAction,这个Action里没有对应提交数据的属性(username,password),而是一个Mytest类的对象,Mytest封装了username和password属性。因为考虑到实际上,可能一个Action中有很多需要接收的数据时,Action里要写很多属性,杂乱臃肿不堪,很不舒服,所以用专门类封装起来,用类对象去接收,舒服很多。然后在execute方法里,简单处理下上传接收到的数据,然后把它封装成一个json字符串,返回给前台调用的Ajax,前台仍旧那个test.html页面显示部分再简单显示下返回json数据。

2.代码

(1)test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>

<script src="js/jquery-3.1.1.js"></script>
</head>
<body>
    <h3 style="color:red">提交数据部分</h3>
    <table style="border:1px solid black;width:300px;height:150px;">
        <tr>
            <td>username:</td>
            <td><input type="text" id="username"></td>
        </tr>
        <tr>
            <td>password:</td>
            <td><input type="password" id="pass"></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" onclick="test()"></td>
        </tr>
    </table>
    <h3 style="color:red">显示下传回的json数据</h3>
    <table style="border:1px solid blue;width:300px;height:100px;">
        <tr>
            <td>传回的username:</td>
            <td><div id='backusername' style='color:red;'></div></td>
        </tr>
        <tr>
            <td>传回的password:</td>
            <td><div id='backpassword' style='color:red;'></div></td>
        </tr>
        
    </table>
    <script>
        function test(){
            //下面这个是我们上传时候用到的对象,这里一定要注意的是,我们后台用的是类对象去接受这些上传的数据
            //所以里面的属性名要写成Action里的'对象名.属性名',千万别直接写成'属性名',不然后台那个对象接收不到
            var mytest={
                'mytest.username':$('#username').val(),
                'mytest.password':$('#pass').val()
            };
            $.ajax({
                url:'usertest.action',
                type:'post',
                data:mytest,
                dataType:"json",
                success:function(data){
                    //有时候感觉接受的数据总是显示各种乱七八糟的错误,你可以先alert看下,传回的是什么东西
                    alert(data);
                    //随便的显示一下传回的数据喽
                    var backdata=JSON.parse(data); //传回的是json字符串,要先把它转换成js中的类对象,对于json字符串和json对象自己去百度
                    $('#backusername').html(backdata.backusername);//将json字符串转换成json对象后,就可以这样获取其中的值。
                    $('#backpassword').html(backdata.backpassword);
                }
            });
        }
    </script>
</body>
</html>

(2)Mytest.java(封装了Action里需要接收用的属性username和password)

package com.st.model;

public class Mytest {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

(3)TestAction(关键的地方了)

package com.st.action;

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

import com.opensymphony.xwork2.ActionSupport;
import com.st.model.Mytest;

import net.sf.json.JSONObject;

public class TestAction extends ActionSupport {
    
    private Mytest mytest;
    //在此action里需要用到的属性,当要用到的属性多到一定数量,坏处大家都知道,所以用个类来封装那些属性,当然小例子嘛,随便写几个属性。
    private String returndata;
    //从Action返回json数据给调用的Ajax,毕竟用用Ajax基本上要交互下嘛。
    
    //对应getter,setter
    public String getReturndata() {
        return returndata;
    }

    public void setReturndata(String returndata) {
        this.returndata = returndata;
    }

    public Mytest getMytest() {
        return mytest;
    }

    public void setMytest(Mytest mytest) {
        this.mytest = mytest;
    }

    //下面是用来处理业务,返回所想要的json给Ajax的函数
    @Override
    public String execute(){
        System.out.println(mytest);
        System.out.println("下面传上来的name:"+mytest.getUsername());
        System.out.println("下面传上来的password:"+mytest.getPassword());
        //把前台页面上传的数据封装成json再传回去显示下
        Map<String,String> map=new HashMap<String,String>();
        map.put("backusername", mytest.getUsername());
        map.put("backpassword", mytest.getPassword());
        
        //上面的map不是json当然是不可以用于返回的,于是呢我们要把它搞成json字符串,你也可以自己去拼json字符串。
        JSONObject json=JSONObject.fromObject(map);
        returndata=json.toString();
        
        //result默认的name就是SUCCESS
        return SUCCESS;
    }
    
    
}

(4)struts.xml(对应action的配置,需要注意的细节部分。ps:我是整合了spring的,不过也就一点地方不一样)

<!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.objectFactory" value="spring"></constant>
    
    <!-- 下面是我们要写的地方了 -->
    <package name="default" extends="json-default">
        <!-- 下面是我们要声明配置的action -->
         <action name="usertest" class="usertestAction" method="execute">
             <!-- 注意2个地方,最上面package继承(extends)的是json-default,下面result的type是json -->
            <result name="success" type="json">
                <!-- 这里的name=root是返回json数据时的一种类型,root是json字符串中只包含该对象的属性,而其他类型,可能会在返回的json类型中额外包含其他的属性和值 ,不一一说了-->
                <!-- 然后这个returndata 是我们action里定义的返回的json。 -->
                <param name="root">returndata</param>
            </result>
        </action>
    </package>
    
    
</struts>

 

此文章只为记录学习和帮助和我一样的菜鸟,前辈们路过发现不雅之处,可以指教下我,谢谢大家了。

 

posted @ 2017-04-15 17:31  Horsen  阅读(14219)  评论(3编辑  收藏  举报