一、搭建struts2环境。
无非就是web.xml、struts.xml文件的配置,添加struts2所需要的jar包。
二、配置json环境。
下载jsonplugin.jar(我用的是jsonplugin-0.30.jar)、json.js、prototype.js。
并将jsonplugin.jar放到\WebRoot\WEB-INF\lib目录下,json.js、prototype.js放到\WebRoot\script目录下。
三、程序目录结构及源码。
1、目录结构
2、web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
3、struts.xml:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8" />
<package name="default" extends="json-default">
<action name="validateName" class="org.fuzk.demo.ValidateNameAction" >
<result type="json" />
</action>
</package>
</struts>
在struts.xml文件中有两个值得注意的地方:
第一个地方是配置 struts.i18n.encoding 常量时,不再是使用 GBK 编码,而是 UTF-8 编码,这是
因为 Ajax 的POST 请求都是以 UTF-8的方式进行编码的。
第二个地方是配置包时,自己的包继承了 json-default 包,而不再继承默认的 default 包,这是
因为只有在该包下才有 json 类型的Result。
3、login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
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>struts2&json</title>
<script type="text/javascript" src="script/json.js" ></script>
<script type="text/javascript" src="script/prototype.js"></script>
<script language="JavaScript" >
function validateName() {
var url = 'validateName.action';
var params = Form.Element.serialize('userBean.userName');
var myAjax = new Ajax.Request(
url,
{
method:'post',
parameters:params,
onComplete:processResponse,
asynchronous:true
});
}
function processResponse(request) {
var jsonObje = eval('('+request.responseText+')'); //此处也可以为var jsonObje = request.responseText.parseJSON(); parseJSON()
//函数在json.js文件中定义
$("tip").innerHTML = jsonObje.tip;
$("tip2").innerHTML = '欢迎您,'+jsonObje.userBean.userName; //此处在《struts2入门教程.pdf》中为$("tip2").innerHTML='欢迎
//您,'+JSON.stringify(jsonObje.userBean.name);
}
</script>
</head>
<body>
<span id="tip" style="color: red; font-weight: bold" ></span>
<br/>
<span id="tip2" style="color: red; font-weight: bold" ></span>
<form action="" method="post" name="form">
<fieldset>
<legend>
用户登录
</legend>
<p align="center">
帐 号:
<input type="text" name="userBean.userName" onblur="validateName();" />
</p>
</fieldset>
</form>
</body>
</html>
4、ValidateNameAction.java
package org.fuzk.demo;
import com.googlecode.jsonplugin.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;
public class ValidateNameAction extends ActionSupport {
private UserBean userBean;
private String tip;
@JSON
public UserBean getUserBean() {
return userBean;
}
public void setUserBean(UserBean userBean) {
this.userBean = userBean;
}
@JSON
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
public String execute() {
try {
if ( validateName(userBean)) {
tip = "你好!" + userBean.getUserName() + ", 这个用户名可用!";
// tip = "Hello!" + userBean.getUserName() + ",this username is OK!";
} else {
tip = "系统中已有" + userBean.getUserName() + "用户名,请重新选择一个!";
// tip = "Sorry, "+userBean.getUserName()+" is used. Please choose other.";
}
} catch ( Exception e) {
tip = e.getMessage();
}
return SUCCESS;
}
public boolean validateName( UserBean userBean) {
if ( "fuzk".equals(userBean.getUserName()))
return false;
else
return true;
}
}
5、UserBean.java
package org.fuzk.demo;
public class UserBean {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
四、遇到的问题
在调试过程中遇到一个问题,就是在function processResponse(request) 函数中,request.responseText的值被截断,导致程序执行失败。将ValidateNameAction.java文件中的tip值修改成英文字符串时,则执行成功。由此认为是编码问题。接着查找资料,修改编码方式。将struts.xml文件中的编码方式修改为utf-8,将整个项目的编码方式修改为utf-8。最终还是不行,看来不完全是编码问题。继续在网上查找资料,说是jsonplugin.jar版本问题,于是下了一个jsonplugin-0.30.jar,替换掉原来用的jsonplugin-0.7.jar,问题解决!
另外,本文中红色字体标注位置按照教程中的写法也有问题,程序在此处执行失败,查找资料后,修改为现在的代码,执行成功。