AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新。
编写常规的 AJAX 代码并不容易,因为不同的浏览器对 AJAX 的实现并不相同。
这意味着您必须编写额外的代码对浏览器进行测试。不过,jQuery 团队为我们解决了这个难题,我们只需要一行简单的代码,就可以实现 AJAX 功能。

现在来看一下3个常用的ajax方法
$(selector).load(URL,data,callback);
必需的 URL 参数规定您希望加载的 URL。
可选的 data 参数规定与请求一同发送的查询字符串键/值对集合。是一个json格式的数据。
可选的 callback 参数是 load() 方法完成后所执行的函数名称。
看一个获取服务端时间的例子
jsp:

  <script type="text/javascript" src="${basePath }/js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
$(":button").click(function(){
var url = "${basePath}/timeServlet";
//最简单的ajax, 默认以get方式提交, 返回值自动填充到标签中
$("#time").load(url);
});
});
</script>
</head>
<body>
当前时间:<span id="time"></span><br>
<input type="button" value="获取时间">
</body>

页面是这样的:

其中basePath是这样的:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
pageContext.setAttribute("basePath", path);
%>

servlet:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
String formatTime = sdf.format(new Date());
PrintWriter pw = response.getWriter();
pw.println(formatTime);
pw.flush();
pw.close();
}

这样就完成了一个最简单的ajax,如果有第2个参数data,提交方式就是post,否则就是get。
看一下效果,点击获取时间就可以获取到服务端的时间:

后2个参数怎么使用,别急,下面在$.post中讲解
定义和用法
post() 方法通过 HTTP POST 请求从服务器载入数据。

语法
jQuery.post(url,data,success(data, textStatus, jqXHR),dataType)

参数 描述
url 必需。规定把请求发送到哪个 URL。
data
可选。映射或字符串值。规定连同请求发送到服务器的数据。
success(data, textStatus, jqXHR)   可选。请求成功时执行的回调函数。
dataType 可选。规定预期的服务器响应的数据类型。默认执行智能判断(xml、json、script 或 html)。

看一个判断登录的例子来了解它的用法,这个例子通过验证登录然后返回一个图片的路径,如果输入正确,如果输入正确,则图片显示一个对号,否则显示一个叉:

jsp:

    <script type="text/javascript">
$(function(){
$(":button").click(function(){
var url = "${basePath}/userServlet"; //先用servlet来做
//var url = "${basePath}/user_login.action"; //然后用struts2来做
var username = $(":text").val();
var password = $(":password").val();
var data_servlet = {"username" : username, "password" : password};
var data_struts2 = {"user.username" : username, "user.password" : password};
//先测试servlet, 测试struts2的时候将第2个data参数改为data_struts2即可
$.post(url, data_servlet, function(data, statusTxt, jqXHR){
alert("data-=-"+data);
alert("data.src-=-="+data.src);
alert("statusTxt-=-"+statusTxt);
alert("jqXHR.status-=-"+jqXHR.status); //状态码, 如200
alert("jqXHR.readyState-=-"+jqXHR.readyState);//请求执行的状态, 如4
alert("jqXHR.statusText-=-"+jqXHR.statusText); //状态字符串, 如ok
alert("jqXHR.responseText-=-"+jqXHR.responseText);//返回的字符串值
alert("jqXHR.responseXML-=-"+jqXHR.responseXML);//返回的XML数据
$("img").attr("src", '${basePath}'+data);//返回的字符串
//$("img").attr("src", '${basePath}'+data.src); //返回的是json数据
});
});
});
</script>
</head>
<body>
<form>
用户名<input type="text"><br>
密码<input type="password"><br>
<input type="button" value="点我验证">
<img>
</form>
</body>

页面是这样的:

先看用servlet做的:

    public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); String username = request.getParameter("username");
String password = request.getParameter("password");
//从数据库查询
User user = userDao.findByUsernameAndPassword(username, password);
System.out.println(user);
PrintWriter pw = response.getWriter();
if(user != null)
pw.println("/images/icon/Button_Ok_64px_1070400_easyicon.net.ico");
else
pw.println("/images/icon/Button_Delete_64px_1070396_easyicon.net.ico");
pw.flush();
pw.close();
}

看一下效果:
如果输入正确,显示如下:

如果输入错误,显示如下:

通过jqXHR.responseText可以看到返回的是一个字符串,字符串不需要解析。接下来看一下struts2的ajax
先做web.xml中配置struts2的过滤器:

  <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>

struts2配置文件struts.xml,放到src下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.action.extension" value="action" /> <!-- 设置struts访问后缀为action -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!-- 禁止动态方法访问 -->
<package name="user-action" namespace="/" extends="json-default"> <!-- json-default是继承自struts-default的 -->
<action name="user_login" class="top.bwcx.ajax.user.UserAction">
<result type="json" /><!-- 无需跳转页面 -->
</action>
</package>
</struts>

struts2的ajax需要struts2-json-plugin.jar插件包的支持

这里是通过c3p0连接数据库, dbutils操作数据库的,有关这方面的内容,请参看我以前的随笔c3p0连接数据库的3种方式dbutils基本使用

action中的配置:

public class UserAction extends ActionSupport {
//这里为了简单, 就直接写了一个dao, service什么的没有写
private UserDao userDao = new UserDao();
//User实体类,用来接收页面传过来的值,需要get和set方法, 很重要
private User user;
//用get方法返回值, 然后在页面取的, 这个需要get方法
private String src; @Override
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
user = userDao.findByUsernameAndPassword(user.getUsername(), user.getPassword());
System.out.println(user);
if(user == null){
src = "/images/icon/Button_Delete_64px_1070396_easyicon.net.ico";
}else
src = "/images/icon/Button_Ok_64px_1070400_easyicon.net.ico";
return SUCCESS;
}
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public String getSrc() {
return src;
}
}

ajax请求struts,是在action页面通过get方法传递响应的,此处就是src属性加上其get方法就能把图片路径返回了,返回格式是json串
在页面接收时,注意把传递的参数改为data_struts2,url也改一下,直接像这样解析json就行了:data.src
效果与刚才servlet的效果是一样的,也可以看一下打印的属性值,如:

其实收集表单项的值还有一种简单的方法,像这样
var params = $("form").serialize();
不过这样需要提供name属性值

$.get()和$.post()是类似的,接下来看一下$.ajax()
$.ajax()这个参数很多,常用的有这么几个:
type: 提交方式,get或post
url: 请求路径
data: 请求参数
success: 执行成功后所调用的函数

把这个登陆验证用这个改一下:
jsp改为:

    <form>
用户名<input type="text" name="user.username"><br>
密码<input type="password" name="user.password"><br>
<input type="button" value="点我验证">
<img>
</form>

js代码改为:

    <script type="text/javascript">
$(function(){
$(":button").click(function(){
var params = $("form").serialize();  //直接序列化表单
$.ajax({
type : "post",
url : "${basePath}/user_login.action",
data : params,
success : function(result){
$("img").attr("src", '${basePath}'+result.src); //返回的是json数据
}
});
});
});
</script>

其他的不变,这样也能达到一样的效果。当然,你也可以在struts2中用response对象响应ajax请求,就像在servlet中一样。

jquery+ajax+struts2的更多相关文章

  1. JQuery+Ajax+Struts2+Hibernate 实现完整的登录注册

    写在最前: 下午有招聘会,不想去,总觉得没有准备好,而且都是一些不对口的公司,可是又静不下心来,就来写个博客. 最近在仿造一个书城的网站:http://www.yousuu.com ,UI直接拿来用, ...

  2. jquery ajax + struts2用例

    ajax var url = '/itsm/contract/contract!deleteShopItemById.action'; var shopItemId= selectRows[x].da ...

  3. Java进阶知识01 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能

    1.效果图示 横线上方的部分不动(没有刷新),下方实现刷新(异步刷新) 2.实现步骤 jquery+ajax+struts技术实现异步刷新功能的步骤:    1.需要用到 jquery+ajax+st ...

  4. JQuery ajax请求struts action实现异步刷新的小实例

    这个样例是用JQuery ajax和struts来做的一个小样例,在这个样例中采用两种方式将java Util中的list转换成支json的格式,第一种是用json-lib.jar这个jar包来转换, ...

  5. JS jquery ajax 已看1 有用

    4.form中的input可以设置为readonly和disable,请问2者有什么区别? readonly不可编辑,但可以选择和复制:值可以传递到后台 disabled不能编辑,不能复制,不能选择: ...

  6. IE8/9 JQuery.Ajax 上传文件无效

    IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...

  7. jquery ajax解析

    jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...

  8. jQuery.ajax 根据不同的Content-Type做出不同的响应

    使用H5+ASP.NET General Handler开发项目,使用ajax进行前后端的通讯.有一个场景需求是根据服务器返回的不同数据类型,前端进行不同的响应,这里记录下如何使用$.ajax实现该需 ...

  9. jQuery.ajax(url,[settings])

    概述 通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpRequest 对象. ...

随机推荐

  1. jsp页面无法识别el表达式的解决方案

    今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...

  2. InnoDB:Lock & Transaction

    InnoDB 是一个支持事务的Engine,要保证事务ACID,必然会用到Lock.就像在Java编程一下,要保证数据的线程安全性,必然会用到Lock.了解Lock,Transaction可以帮助sq ...

  3. 介绍一位OWin服务器新成员TinyFox

    TinyFox 是一款支持OWIN标准的WEB应用的高性能的HTTP服务器,是Jexus Web Server的"姊妹篇".TinyFox本身的功能是html服务器,所有的WEB应 ...

  4. 再来说说 LaTeX

    在我的上一篇随笔中,我提到了 Markdown.LaTeX 和 MathJax.这几个东西对目前的网络技术文章的写作.展示都有深远的影响.在上一篇中,我还给出了一份 LaTeX 语法的学习资料.在这一 ...

  5. Android开发学习之路-自定义控件(天气趋势折线图)

    之前写了个天气APP,带4天预报和5天历史信息.所以想着要不要加一个折线图来显示一下天气变化趋势,难得有空,就写了一下,这里做些记录,脑袋不好使容易忘事. 先放一下效果: 控件内容比较简单,就是一个普 ...

  6. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  7. Atitit onvif协议获取rtsp地址播放java语言 attilx总结

    Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...

  8. Hexo的coney主题的一些补充说明

    title: Hexo的coney主题的一些补充说明 date: 2014-12-14 14:10:44 categories: Hexo tags: [hexo,技巧] --- Coney是一个非常 ...

  9. 前端学HTTP之客户端识别和cookie

    前面的话 Web服务器可能会同时与数千个不同的客户端进行对话.这些服务器通常要记录下它们在与谁交谈,而不会认为所有的请求都来自匿名的客户端.本文主要介绍客户端识别及cookie机制 HTTP首部 HT ...

  10. 前端学HTTP之URL

    × 目录 [1]URI [2]URL语法 [3]字符[4]编码方法 前面的话 一般地,URL和URI比较难以区分.接下来,本文以区分URL和URI为引子,详细介绍URL的用法 URI与URL的区别 U ...