Struts 2 +JQuery +json 实现异步交互

这些天一直在搞struts2 与jquery结合,做一定表单验证。在网上找了很多jquey与struts2 做登录验证的资料,但有的是写的太复杂了,所以没看懂,也因为太粗心所以走了很多弯路。现在终于成功了,所以拿出来分享一下。Don't be careless,youcan!

本人应用的工具:

Jdk 1.6

Tomcat 6.0

Struts2.1.6

Jquery1.6

准备工作:

struts2 必要的六个jar包

1.     commons-fileupload-1.2.1.jar

2.     commons-io-1.3.2.jar

3.     freemarker-2.3.13.jar

4.     ognl-2.6.11.jar

5.     struts2-core-2.1.6.jar

6.     xwork-2.1.2.jar

由于需要json封装数据,所以需要下载一个jsonPluin插件。貌似不同的struts版本下载不同的jsonpluin插件。这个可以参考一下(http://blog.csdn.net/flyingpig4/archive/2010/03/07/5353750.aspx#)博文。

 

Jsonpluin插件

7.Jsonpluin.3.4.jar

Json_lib.jar  (这个在struts /lib包里可以找到)

同时因为json大量引用了Apache commons的包所以还要加

8.Commons-beanutils-1.7.0.jar

9.commons-collections-3.2.jar

10.commons-lang-2.3.jar

11.commons-logging-1.1.jar

12.log4j-1.2.15.jar

下面就以一个小例子来说明

首先struts.xml需要有所改变,在里面需要为json的专门package

Struts.xm

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD StrutsConfiguration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

 

<struts>  

    <constant name="struts.devMode" value="true"/>

    <!-- 为json  添加一个专门的package,-->

    <!--特别注意这里一定要继承json-default,既extends="json-default",-->

    <!--如果这里少了,返回的数据就不是json类型了 -->

    <package name="ajax" namespace="/ajax"extends="json-default" >

        <action name="show" class="com.jquery.action.UserAction"> 

        <!--注: type一定要是json,不要遗漏了这里主要就是用来说明哪个result是以json格式来封装数据 -->

        <!-- 其他的配置跟平常一样 -->

         <result name="ok" type="json"/>

            </action>

    </package>

    <!-- Add packages here -->

</struts>    <!--Add packages here -->

 

</struts>

 

实体类User.java

package com.jquery.modle;

 

importjava.io.Serializable;

public class User  {

    private String userName;

    private String password;

    public StringgetUserName() {

       return userName;

    }

    public void setUserName(StringuserName) {

       this.userName = userName;

    }

    public StringgetPassword() {

       return password;

    }

    public void setPassword(Stringpassword) {

       this.password = password;

    }

   

 

}

注明,实体类一定要序列化,实现的方法有

方法一、实现Serializable接口

方法二、在action 类中将需要序列化的属性的getter上添加注解

@JSON(serializable =”ture”),意思是对这个属性进行序列化。

 

Action 类

package com.jquery.action;

 

importjava.io.IOException;

import java.util.HashMap;

import java.util.Map;

 

import javax.servlet.http.HttpServletResponse;

 

importorg.apache.struts2.ServletActionContext;

 

importnet.sf.json.JSONObject;

 

importcom.googlecode.jsonplugin.annotations.JSON;

importcom.jquery.modle.User;

importcom.opensymphony.xwork2.ActionSupport;

 

public class UserAction extends ActionSupport{

    private User user;

    private String testvalue;

    private String result;

    @JSON(serialize=false)

    public String getResult(){

       return result;

    }

 

    public void setResult(Stringresult) {

       this.result = result;

    }

 

    @JSON(serialize=false)

    public StringgetTestvalue() {

       return testvalue;

    }

 

    public voidsetTestvalue(String testvalue) {

       this.testvalue = testvalue;

    }

 

    @JSON(serialize=true)

    public User getUser() {

       return user;

    }

 

    public void setUser(User user){

       this.user = user;

    }

    public String execute() throws IOException

    {

       System.out.println("begin"+user.getUserName());

       //user = new User();

       //user.setPassword("123");

       //user.setUserName("yingzi");

       //System.out.println(user.getUserName());

      

       System.out.println("用户名: "+user.getUserName());

       //result =jo.toString();

      

      

       return "ok";

    }

 

}

Action  类中基本不变,只是要注意一下需要序列化的属性。

如果没有序列化,在js中的回调函数中数据返不回来。

 

Jsp页面:

<%@ page language="java" import="java.util.*"pageEncoding="utf-8"%>

<%@taglib uri="/struts-tags" prefix="s"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>My JSP 'show.jsp'starting page</title>

   

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="Thisis my page">

    <!--

    <linkrel="stylesheet" type="text/css"href="styles.css">

    -->

    <script type="text/javascript" src="jslib/jquery-1.6.js"></script>

    <script type="text/javascript" src="jslib/show.js"></script>

   

   

 

  </head>

 

  <body>

  

  <input type="text" value="wangwei"name="user.userName" id="name"> 

  <input type="button" value="JQuery"  id="jquerytest"οnclick="click_fun()"><br> 

    <s:debug></s:debug>

  </body>

</html>

 

Js文件show.js

function click_fun()

{

//这里的user在action 中有对应的属性。可以是其他属性如result;

    params={"user.userName":$("#name").val()};

  

    $.ajax({               //jquery的ajax方法

       type: "post",     // 用post 方式传递

     url:  "ajax/show!execute", //这里是请求的路径,注意标明方法。因为在。  //struts.xml中不方便使用method,所以在这里动态指定

       data: params,

       dataType:"json",

       //contentType: "application/x-www-form-urlencoded;charset=UTF-8",

       success:callback,//成功时回调函数

       error:errorback  //失败时回调函数,这个写上比较好。          

    });                

}

function callback(data)

{

//注:如果体类没有序列化,会报data.user undefined,

    var n = data.user.userName;

    alert(n);

}

function errorback()

{

     alert("error");

}

 

这里推荐几个这类比较好的博文,

1.http://blog.csdn.net/flyingpig4/archive/2010/03/07/5353750.aspx#.

2.http://www.zoomhoo.com/thread-458-1-1.html

 希望对有需要的各位有所帮助。

但在ssh整合时需注意,将Action 中接口的get方法省去。因为jquery 不识别类型为接口的方法。但action 中存在接口的get方法时,会报

org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servletdefault threw exception
java.lang.IllegalAccessException: Class com.googlecode.jsonplugin.JSONWritercan not access a member of class org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapperwith modifiers "public"

所以,如果在作业中出现这个异常可以检查一下,action 中是否有接口类型的get方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值