java ee struts2 + Ajax + jQuery
View Code 这几天弄了好几天的Struts2上的Ajax+jQuery实现,总算实现了。没有人交流,网上的很多信息都将的不是很明白,至少只是贴了些代码,并没有讲清楚原理。今天我将总结一下我的经验。
首先struts2 使用JSON需要用到的jar包有:struts2-json-plugin-2.2.1.jar、ezmorph-1.0.6.jar、json-lib-2.1-jdk15.jar,这些包没有引是不行的。我之前就是少了ezmorph-1.0.6.jar包出现了异常。至于为什么要引这些包,作为小白的我还暂时无法解释,反正你引进去就行了。其实还是建议读者自己试试如果没有引入这些包会是什么结果。
我以一个小案例作为例子进行说明。 这个例子是一个注册的小例子,查看用户名是否已经被注册。
jsp代码
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head>
6 <script type="text/javascript" src="script/jquery-1.7.2.min.js"></script>
7 <script type="text/javascript">
8 $(function(){
9 $('#submit').click(function(){
10
11 var params={
12 username:$("#username").val(),
13 password:$("#password").val()
14 };
15
16 $.ajax({
17 url:"RegisterAction.action",
18 data: params,
19 type:"POST",
20 dataType:"text",
21 contentType:"application/x-www-form-urlencoded;charset=utf-8",
22 success:function(json){
23 var obj = $.parseJSON(json);
24 $("#warn").html(obj.map.result);
25 }
26 });
27 });
28 });
29 </script>
30 </head>
31
32 <body>
33 <input type="text" name="username" id="username"><span id="warn"></span><br>
34 <input type="password" name="password" id="password"><br>
35 <input type="submit" value="注册" id="submit">
36 </body>
37 </html>
我采用的是jQuery,当然需要应用jQuery库文件了。很多人用的是Extjs这里我就不做太多的拓展了。毕竟本人对Extjs不是很熟。
struts.xml配置文件,这可是重头戏。
<?xml version="1.0" encoding="UTF-8" ?>
<struts>
<constant name="struts.devMode" value="true"/>
<!-- 不再使用GBK编码,因为Ajax的POST请求都是以uft-8进行编码的 -->
<constant name="struts.i18n.encoding" value="utf-8"/>
<!-- 继承自json-default ,采用struts2 对json提供的机制-->
<package name="ajax" namespace="/" extends="json-default">
<!-- 配置类型的json的result -->
<action name="RegisterAction" class="com.xh.action.RegisterAction">
<result type="json">
<param name="noCache">true</param>
<param name="contentType">text/html</param>
</result>
</action>
<action name="*">
<result>/{1}.jsp</result>
</action>
</package>
</struts>
下面是action文件,其实我个人觉得struts最重要的还是关于action的编写和struts.xml文件的配置,真正掌握了MVC模式中control的核心理念
1 package com.xh.action;
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import org.apache.struts2.json.annotations.JSON;
7
8 import net.sf.json.JSONObject;
9
10 import com.opensymphony.xwork2.ActionSupport;
11
12 @SuppressWarnings("serial")
13 public class RegisterAction extends ActionSupport {
14
15
16 private String username;
17 private String password;
18 private Map<String,String> map = new HashMap<String, String>();
19 private JSONObject jo = new JSONObject();
20
21 public String getUsername() {
22 return username;
23 }
24 public void setUsername(String username) {
25 this.username = username;
26 }
27 public String getPassword() {
28 return password;
29 }
30 public void setPassword(String password) {
31 this.password = password;
32 }
33
34
35 public Map getMap() {
36 return this.map;
37 }
38 public String getJo() {
39
40 return this.jo.toString();
41
42 }
43 @Override
44 public String execute() throws Exception {
45
46 if("xiaohai".equals(username)){
47 map.put("result", "sorry, your name is repeated");
48 }else{
49 map.put("result", "congratulation");
50 }
51
52 jo = JSONObject.fromObject(map);
53
54 return SUCCESS;
55 }
56
57
58 }
这里我用了两种方式,一种是定义一个Map对象,另一种是直接定义一个JSON对象,进行相应的赋值。读者可以进行参考比较,其实没什么太大的区别,我尝试过在jsp页面中的success的回调函数中将接受到的map变量打印出来,或是将上面代码中的$("#warn").html(obj.jo.result); 改成
$("#warn").html(obj.map.result);其实是一致的。。。
代码也很简单,我就不再多做详细的解释了。还有一种利用stream类型的Result实现Ajax,这种类型的Result可以直接向客户端浏览器生成二进制文件、文本相应等。如果你对这个感兴趣,我也可以提一下。本来可以把源代码提出来的,但是我发现博客园的代码编辑器坑爹的很,原来放上来的代码都不能看了。今天是来做修改的。之前做的stream类型的Result代码已经被我删掉了。。。
好了,今天就介绍到这里吧。。。
路还在继续