这些天一直在搞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"