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"%>

 2 <%@ taglib prefix="s" uri="/struts-tags" %>
 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" ?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<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;

 2 
 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代码已经被我删掉了。。。

   好了,今天就介绍到这里吧。。。

  路还在继续

 

 

 

posted on 2012-10-31 20:52  小海少  阅读(851)  评论(0编辑  收藏  举报