Struts2之ajax初析

来源:互联网 发布:sx2150k基本数据 编辑:程序博客网 时间:2024/04/30 08:12

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只是一个简单网页,不列出了。

运行效果如下:

单击获取之后:

此时的页面源代码:

<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解析

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信转账退款没有收到怎么办 礼物跟人家送重复怎么办 你已被steam封禁怎么办 武装突袭3被锁定怎么办 绝地求生右下角小地图变大怎么办 ctrl z 误删了怎么办 武装突袭3渴了怎么办 武装突袭3枪卡壳怎么办 玩武装突袭3CPU不好怎么办? 户户通001信号中断怎么办 电脑运行速度特别慢怎么办 win8.1电脑太卡怎么办 电线厂非法战地没拆够怎么办 久笔记本电脑玩彩虹六号卡怎么办 彩虹六号一直建立小队进不去怎么办 小佩喂食器离线怎么办 手机打游戏掉帧怎么办 电脑打游戏掉帧怎么办 武装突袭3太卡怎么办 英语b级考不过怎么办 绝地求生被燃烧瓶烧了怎么办 搜狗输入法打字出现问好怎么办 全民k歌解码失败怎么办 视频声音小怎么办调大 乐视2视频声音小怎么办 录视频声音太小怎么办 显卡装了没反应怎么办 笔记本关闭核显黑屏怎么办 驱动补丁被卸了怎么办 网络驱动被删了怎么办 新装系统网卡没驱动怎么办 核显没有dp口怎么办 苹果7屏幕太小了怎么办 苹果装系统卡住了怎么办 苹果7手机白屏黑苹果怎么办 衣服破了个洞怎么办 黑苹果自带升级怎么办 双显卡都禁用了怎么办 win10优盘识别不出来怎么办 黑苹果无限重启怎么办 水泥地面起砂怎么办?这几招很有用