许多情况下,通过form提交表单是满足不了需求的,因此需要使用ajax进行异步提交,所谓异步通信,就是告诉服务器你的消息的起点和终点,服务器通过起点和终点来识别待处理的信息,然后通过回调函数告诉你他接受到了,异步处理的时候是第二个线程,对主线程不造成影响;同步通信则是双发一直处于准备状态,时时刻刻准备接受你的请求,处理请求的时候其他代码是无法继续运行下去的。
使用原生js的ajax有些麻烦,因此这里使用的是jquery自带的ajax方法。
首先在jsp文件中创建一个表单,这里要注意,由于我们想通过ajax提交表单,因此
- 可以使用div代替form标签,form标签的method和action参数也不用写了
- 提交按钮的类型千万不能写成"submit",只要button即可,否则他还是会自动提交这个表单,由于没有为他指定action参数因此页面会刷新
<form>
<input type="text"></input>
<input type="button" value="提交"></input>
</form>
随后我们在js中为提交按钮绑定事件,并在其中写上ajax函数,ajax函数里面需要指定若干个参数
async:默认为true,表示异步,如果需要同步处理,设为false即可
type:默认为get,使用post方法似乎传递不了(不清楚原因)
url:处理数据的action,使用${pageContext.request.contextPath}/可以定位到项目的根目录
data:需要传输的数据,用键值对的方式书写即可
datatype:返回的数据格式,一般为json格式
success:成功回调函数,如果action接收到了数据则会进入success的回调函数,该函数的参数是返回的json数据,可以使用参数.名称来获取数据,这里用data来接受json,然后用data.result获取返回的结果值,result是action中的成员变量
error:传输错误时的回调函数,参数说明略
$.ajax({
type: "get",
url: "${pageContext.request.contextPath}/commentaction.action",
data: {
doubanid: doubanid,
commenter: username,
commenttime: date,
commentcontent: commentcontent
},
dataType: "json",
success: function (data) {
if (data.result == "success") {
alert("评论成功!");
} else {
alert("评论失败!");
}
},
error: function () {
alert("评论失败!");
}
})
那么处理ajax传输的数据的action该怎么写呢?
只需要创建与ajax的data中键名一样的成员变量并生成其set和get方法即可
public class CommentAction extends ActionSupport {
private String doubanid;
private String commenter;
private String commenttime;
private String commentcontent;
private String result;
@Override
public String execute() throws Exception {
Dbconnection dbconn=new Dbconnection();
Connection conn=dbconn.connect();
if(conn==null) {
System.out.println("连接失败");
}else {
System.out.println("连接成功");
}
Comment com=new Comment();
if(com.comment(conn,doubanid,commenter,commenttime,commentcontent)==true){
result="success";
}else{
result="error";
}
return SUCCESS;
}
public String getDoubanid() {
return doubanid;
}
public void setDoubanid(String doubanid) {
this.doubanid = doubanid;
}
public String getCommenter() {
return commenter;
}
public void setCommenter(String commenter) {
this.commenter = commenter;
}
...其他set和get省略
}