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. 最长回文子串-LeetCode 5 Longest Palindromic Substring

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  2. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  3. Kooboo CMS技术文档之四:Kooboo CMS的站点组成部分

    Kooboo CMS本着功能独立分离的原则,将站点分为三部分组成:用户管理,站点管理和内容数据库管理.各个功能之间既可独立使用,也可以容易组成在一起形成一个完整的系统. 用户管理 管理整个系统内的用户 ...

  4. PHP设计模式(七)适配器模式(Adapter For PHP)

    适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 如下图(借图): // 设置书的接口 // 书接口 interface BookI ...

  5. iOS 数据存储之SQLite3的使用

    SQLite3是iOS内嵌的数据库,SQLite3在存储和检索大量数据方面非常有效,它使得不必将每个对象都加到内存中.还能够对数据进行负责的聚合,与使用对象执行这些操作相比,获得结果的速度更快. SQ ...

  6. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  7. Android Studio 编译单个module

    前期自己要把gradle环境变量配置好 在Terminal中gradle命令行编译apk 输入gradle assembleRelease 会编译全部module编译单个modulecd ./xiru ...

  8. 第10章 Shell编程(4)_流程控制

    5. 流程控制 5.1 if语句 (1)格式: 格式1 格式2 多分支if if [ 条件判断式 ];then #程序 else #程序 fi if [ 条件判断式 ] then #程序 else # ...

  9. ASP.Net MVC 5 in Xamarin Studio 5.2

    Xamarin Studio 是一个Mono的跨平台 IDE(Integrated Development Environment),支持Wiindow和Mac,最新发布的5.2 版本支持ASP.NE ...

  10. 我所理解的SOA和微服务

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...