• Struts2 ajax json小例子


    1:首先要解决jar包的问题,我最近一直用maven搭建项目,所以把pom.xml复制到这。

    要有struts2的核心包,struts2和Json整合的包,以及json lib。刚才转载了一篇解决json lib老是报错的博客,问题完美解决。

        <dependencies>
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-json-plugin</artifactId>
                <version>2.3.28.1</version>
            </dependency>
            <dependency>
                <groupId>net.sf.ezmorph</groupId>
                <artifactId>ezmorph</artifactId>
                <version>1.0.6</version>
            </dependency>
    
            <dependency>
                <groupId>net.sf.json-lib</groupId>
                <artifactId>json-lib</artifactId>
                <version>2.2.2</version>
                <classifier>jdk15</classifier>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.0.1</version>
                <!-- 只在编译时和测试时运行 -->
                <scope>provided</scope>
            </dependency>
            <!-- Struts2 -->
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-core</artifactId>
                <version>2.3.24</version>
            </dependency>
        </dependencies>

    2:login.jsp

    先看看写好的表单,ajax一会再说吧。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>Login Page</title>
    <script type="text/javascript" src="jquery-1.12.2.min.js"></script>
    </head>
    <body>
        <form action="#" method="post">
    
            ID: <input type="text" name="id" id="id" />
            <br/>
            Password:<input type="text" name="name" id="name"/>
            <br/>
            <input type="submit" value="Submit" id="submit" name="submit"/>
            
        </form>
        <script>
    
            function login(){
                var $btn = $("#submit");
                $btn.bind("click",function(){
                    $.ajax({
                        type:"post",
                        url:"json.action",
                        data:{
                            id : $("#id").val(),
                            name : $("#name").val()
                        },
                        dataType:"json",
                        success:function(data){
                            var obj = eval ("(" + data + ")");
                            alert(obj.id);
                        },
                        error:function(){
                            alert("失败");
                        }
                    });
                });
            };
            $(document).ready(function(){
                login();
            });
        </script>
        
    </body>
    </html>

    3:JsonAction.

    在这里我们采取模型驱动的方式获取表单传递过来的值,然后在后台输出一下,当然我重写了Student的toString方法,Student类就不再展示了。

    我们在action里创建了一个map,map是一个键值对的形式,Map<String,Object>,抛开Struts2不谈,json也是一个键值对形式,JSON 数据的书写格式是:名称/值对。

    我们可以用JsonObject.fromObject()方法创建一个JSONObject对象 

        public static JSONObject fromObject(Object object)
         {
           return fromObject(object, new JsonConfig());
         }

    源码在这,明显是个static方法,我们用它获取对象。

    然后我们把这个对象转换成字符串存到了一个变量中。我们可以在后面的struts.xml中看到这个字符串变量有什么用。

    package com.oa.action;
    
    import java.util.HashMap;
    import java.util.Map;
    import com.oa.entity.Student;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    import net.sf.json.JSONObject;
    
    public class JsonAction extends ActionSupport implements ModelDriven<Student> {
        private static final long serialVersionUID = 1L;
        private Student student = new Student();
        private String result;
    
        public String getResult() {
            return result;
        }
    
        public void setResult(String result) {
            this.result = result;
        }
    
        /**
         * 
         * 处理ajax请求
         * 
         * @return SUCCESS
         * 
         */
        @Override
        public String execute() {
    
            try {
                System.out.println(student);
    
                Map<String, Object> info=new HashMap<String,Object>();
                info.put("id", student.getId());
                info.put("name", student.getName());
                JSONObject object=JSONObject.fromObject(info);
                result=object.toString();
                
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
            return SUCCESS;
        }
    
        @Override
        public Student getModel() {
            if (student == null) {
                student = new Student();
            }
            return student;
        }
    
    }

    4:struts.xml

    有几点是必须的,result的type是Json,有点像之前用的struts2的文件下载,type就说stream,我们能看到action里的字符串变量写在这里。我们把这个result返回给前端页面,当然,别忘记result的setter getter方法。

            <action name="json" class="com.oa.action.JsonAction">
                <result type="json">
                    <param name="root">
                        result
                    </param>
                </result>
            </action>

    5:ajax

    用的是jquery的ajax,要导入jquery的js文件,我用的是jquery-1.12.2.min.js。当然还有别的版本,用哪个都可以,去http://jquery.com/download/下载或者百度都可以。

    url就说我们要提交到的action。data是要传递的参数,这里的id  name和我实体类Student的属性是对应的。如果能正确返回,就执行success后面的方法,如果失败了,就执行error后面的方法。

    data是一个字符串,因为我们返回的是result就说一个字符串,不过这个字符串是由JsonObject对象转换来的。

    var obj = eval ("(" + data + ")");是用Javascript解析器,来解析Json文本,有兴趣可以看看http://www.w3school.com.cn/json/json_eval.asp,这里有详细介绍。我只想说Json也是键值对形式。我们可到了obj,然后就跟map差不多,你用key就可以得到value。obj.id就可以得到我们输入的id
    $.ajax({
                        type:"post",
                        url:"json.action",
                        data:{
                            id : $("#id").val(),
                            name : $("#name").val()
                        },
                        dataType:"json",
                        success:function(data){
                            var obj = eval ("(" + data + ")");
                            alert(obj.id);
                        },
                        error:function(){
                            alert("失败");
                        }
                    });

    6:页面效果

    然而,我发现个问题,在Eclipse 里面没问题,能正常运行,在chrome里却不行,我又在搜狗里面试了试,也是可以的。

    看来得研究研究为什么不能再chrome中运行了。

  • 相关阅读:
    jira:7.12.3版本搭建(破解版)
    traefik添加多证书
    人肉分析sorted(lst, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.islower(), x.isupper(), x))过程
    jquery实现checkbox全选/反选/取消
    k8s简单集群搭建
    第十二周编程总结
    第十周作业
    第九周编程总结
    第七周编程总结
    第五周编程总结
  • 原文地址:https://www.cnblogs.com/zhao307/p/5469161.html
Copyright © 2020-2023  润新知