• Struts2之ajax初析


    Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单,并且可以简单的融入到Struts2框架中,当然这只是在我们需要JSON的时候才会显得流光溢彩。

    首先不谈Struts2的原生支持,我们自己写一个ajax示例,使用异步请求,直接请求action动作:

    InfoAction.java

    package cn.codeplus.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class InfoAction extends ActionSupport {
        private static final long serialVersionUID = 1359090410097337654L;
    
        public String loadInfo() {
            return SUCCESS;
        }
    
    }

    InfoAction仅仅是简单的返回"success"。

    index.jsp

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
            <base href="<%=basePath%>">
            <title>获取</title>
            <script type="text/javascript" src="js/jquery.js">
    </script>
            <script type="text/javascript">
    function loadInfo() {
        $("#info").load("loadInfo");
    }
    </script>
        </head>
        <body>
            <input type="button" value="获取" id="btnGet" onclick="loadInfo()" />
            <div id="info"></div>
        </body>
    </html>

    index.jsp包含一个按钮,点击按钮则会触发异步请求事件。

    struts.xml

    <package name="ajaxDemo" extends="struts-default">
        <action name="loadInfo" class="cn.codeplus.action.InfoAction" method="loadInfo">
            <result name="success">/info.jsp</result>
        </action>
    </package>

    可见上面的异步请求的结果将会是加载info.jsp,info.jsp只是一个简单网页,不列出了。

    运行效果如下:

    单击获取之后:

    此时的页面源代码:

    Struts2之ajax初析

    Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单,并且可以简单的融入到Struts2框架中,当然这只是在我们需要JSON的时候才会显得流光溢彩。

    首先不谈Struts2的原生支持,我们自己写一个ajax示例,使用异步请求,直接请求action动作:

    InfoAction.java

    按 Ctrl+C 复制代码
    按 Ctrl+C 复制代码

    InfoAction仅仅是简单的返回"success"。

    index.jsp

    按 Ctrl+C 复制代码
    按 Ctrl+C 复制代码

    index.jsp包含一个按钮,点击按钮则会触发异步请求事件。

    struts.xml

    <package name="ajaxDemo" extends="struts-default">
    <action name="loadInfo" class="cn.codeplus.action.InfoAction" method="loadInfo">
    <result name="success">/info.jsp</result>
    </action>
    </package>

    可见上面的异步请求的结果将会是加载info.jsp,info.jsp只是一个简单网页,不列出了。

    运行效果如下:

    单击获取之后:

    此时的页面源代码:

    <div>标签中嵌套了<title>标签,不符合规范,其实我们只要吧info.jsp写的没有<title>之类的标签,就不会出现这种情况了。

    以上说的异步请求仅适用于请求单个文件,如果我们请求的是动态数据,并且数据需要以JSON格式返回,上面的方法将会显得力不从心,这是struts2的原生支持就得出马了。

    使用struts2的ajax,必须在项目中引入struts2-json-plugin-2.2.1.jar,在版本2.1.7+都一句绑定在struts2发行包里面了(之前的版本可以在这下载)。记住,要引入struts2-json-plugin-2.2.1.jar。

    这次我们使用另一个例子,模拟加载评论:

    dto对象,Comment.java

    package cn.codeplus.po;
    
    public class Comment {
        private long id;
        private String nickname;
        private String content;
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getNickname() {
            return nickname;
        }
    
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }

    新的InfoAction.java

    package cn.codeplus.action;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import cn.codeplus.po.Comment;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class InfoAction extends ActionSupport {
        private static final long serialVersionUID = 1359090410097337654L;
    
        private List<Comment> comments = new ArrayList<Comment>();
        //没getter and setter方法的属性不会被串行化到JSON
        @SuppressWarnings("unused")
        private String title;
        //!!!使用transient修饰的属性也会被串行化到JSON
        private transient String content;
    
        public String loadInfo() {
            title="123木头人";
            content="你是木头人,哈哈。";
            loadComments();
            return SUCCESS;
        }
    
        /**
         * 加载留言信息
         */
        private void loadComments() {
            Comment com1 = new Comment();
            com1.setContent("很不错嘛");
            com1.setId(1);
            com1.setNickname("纳尼");
            Comment com2 = new Comment();
            com2.setContent("哟西哟西");
            com2.setId(2);
            com2.setNickname("小强");
            comments.add(com1);
            comments.add(com2);
        }
    
        public List<Comment> getComments() {
            return comments;
        }
    
        public void setComments(List<Comment> comments) {
            this.comments = comments;
        }
    
        public static long getSerialversionuid() {
            return serialVersionUID;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        
    }

    index.jsp还是那个index.jsp。(*^__^*) 嘻嘻……

    struts.xml变化挺大:

    <package name="ajaxDemo" extends="json-default">
        <action name="loadInfo" class="cn.codeplus.action.InfoAction" method="loadInfo">
            <result name="success" type="json"></result>
        </action>
    </package>

    在struts.xml中:

    首先,package extends由struts-default转变为json-default,这是必须的,只用在json-default中才包含下面使用的result type为 json。

    然后就是result类型需显示指明为json,result标签内,无需指明视图指向的界面。

    最后就是运行结果啦:

    点击“获取”按钮之后:

    可见comments对象和content对象都被串行化到JSON数据了,不知道是不是版本的问题,很多资料都说使用transient修饰的属性不会被串行化到JSON的。

    为了使content对象不被串行化到JSON,在不能舍弃其getter setter方法的时候,我们可以这样在content的getter方法上面加上注解:@JSON(serialize=false)

    ...
    @JSON(serialize=false)
    public String getContent() {
        return content;
    }
    
    public void setContent(String content) {
        this.content = content;
    }
    ...

    这时的结果如下:

    @JSON和json类型的result都还有很多可选项,无非就是串行化谁,不串行化谁,返回数据的MIME类型,读者可以自行参考相关文档。

    获取到JSON数据了,下一步就是在前台使用js处理JSON数据了,小弟js不精,喜欢使用jQuery解析,如有兴趣,且听下回分解jQuery解析JSON数据。

  • 相关阅读:
    Elasticsearch 架构解析与最佳实践
    Redis一键安装脚本
    Android——GridView(网格视图)相关知识总结贴
    Android——TabHost(标签容器)相关知识总结贴
    Android——RatingBar(评价条)相关知识总结贴
    Android——SeekBar(拖动条)相关知识总结贴
    Android——SQLite/数据库 相关知识总结贴
    Android——媒体库 相关知识总结贴
    Android——Broadcast Receive 相关知识总结贴
    Android——进程通信/ AIDL/Message相关知识总结贴
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4521467.html
Copyright © 2020-2023  润新知