Struts2 json jQuery ajax 的集成配置与使用及 demo 演示源码示范
Struts2 是 Apache Projects 里面的一个子项目,也称为 Apache Struts2,是一个用于开发 Java EE 网络应用程序的开源 Web 应用框架。它利用并扩展了Java Servlet API,鼓励开发者采用MVC架构。
缘起于 Apache Struts 的 WebWork 框架,旨在提供相对于Struts框架的增强和改进,同时保留与Struts框架类似的结构。2005年12月,WebWork 宣布 WebWork 2.2 以 Apache Struts2 的名义合并至 Struts。2007年2月第一个全发布(full release)版本释出。
开发目标:Struts1设计的第一目标就是使 MVC 模式应用于 web 程序设计。在过去10年,Struts 在更好的 web 应用方面所做的工作是值得肯定的。在某些方面,Struts 社区注意到这一框架的局限性,所以这个活跃的社区通过对 MVC 运行模式的重新理解并同时引入一些新的建筑学方面的设计理念后,新的 Struts2 框架结构更清晰,使用更灵活方便。
这一新的结构包含应用逻辑的横切面拦截器,基于注释的配置以减少和去除 XML 形式的配置文件,功能强大的表达式语言,支持可更改、可重用UI组件的基于微 MVC 的标签库。Struts2 有两方面的技术优势,一是所有的 Struts2 应用程序都是基于 client/server HTTP交换协议,The Java Servlet API 揭示了 Java Servlet 只是 Java API 的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的 Java 语言进行程序设计。
Struts2 提供了对 MVC 的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。
以上内容转载自维基百科。
以下代码基于 J2EE 应用服务器 GlassFish 4.1 测试通过,IDE 为 Eclipse Mars1 Release (4.5.1)
struts2 两个最重要的配置文件 struts.xml 和 web.xml(web.xml 不属于 struts2,而是安装拦截器的位置)。
web.xml
设置拦截器,所有的提交将被 struts2 截获并转移到 struts.xml 声明的函数进行处理。
这里说一下跳过 struts2 拦截的方法:
如果存在不需要 struts2 处理的 servlet 可以将 servlet 加个扩展名,例如
@WebServlet(name = "servlet/Test.servlet", urlPatterns = { "/servlet/test.servlet" })
public class Test extends HttpServlet
调用时http://host/project/servlet/test.servlet则不会被 struts2 拦截,中间有个"."注意。
另一个方法是在 struts.xml 中加入一个配置项
<constant name="struts.action.excludePattern" value="/servlet/.*" />
表示对 /servlet/ 路径内的提交不再由 struts 处理,而直接由/servlet/ 内的接口进行处理
言归正传,继续谈 struts2:
web.xml 文件位于webroot/WEB-INF 目录,编辑添加如下内容,确保内容不要输入错,否则拦截器完全不起作用。
以下是 2.3 和 2.3 以下版本的写法,2.5略有不同。
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
导入需要的 jar 文件,这是经常容易出问题的地方,因某个 jar 没有导入,导致页面错误,而又没有太具体的错误提示,进一步延误了开发和打击了自信,所需的 jra 如下由如下几类:
apache commons fileupload
apache commons io
apache commons lang
apache commons loggin
apache struts2
以上 jar 文件http://www.apache.org提供下载
jackson json 处理框架,核心有以下三个:
jackson-annotations
jackson-core
jackson-databind
https://github.com/FasterXML提供下载
本测试全部所需具体 jar 列表:
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
commons-lang-2.6.jar
commons-lang3-3.1.jar
commons-logging-1.2.jar
freemarker-2.3.22.jar
jackson-annotations-2.6.1.jar
jackson-core-2.6.1.jar
jackson-databind-2.6.1.jar
jackson-dataformat-csv-2.6.1.jar
jackson-dataformat-xml-2.6.1.jar
javassist-3.11.0.GA.jar
ognl-3.0.6.jar
struts2-core-2.3.24.1.jar
struts2-json-plugin-2.3.24.1.jar
xwork-core-2.3.24.1.jar
目录结构如下:
struts.xml
创建struts.xml 文件,位于项目 java 代码的根目录,因配置错误会导致页面不正常,而又不会有太具体的错误提示,所以这里的配置很关键,直接影响程序是否正常运行。
<?xml version="1.0" encoding="UTF-8"?>
<!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" />
<constant name="struts.locale" value="zh_cn" />
<!-- 調試環境 -->
<constant name="struts.devMode" value="true" />
<constant name="struts.ui.theme" value="simple" />
<package name="DemoStruts2" extends="struts-default, json-default" namespace="/mydemo">
<action name="show" class="demo.TestAction" method="Show">
<result name="success" type="json">
<param name="root">ResultSuccess</param>
</result>
<result name="error" type="json">
<param name="root">ResultError</param>
</result>
<result name="other" type="json">
<param name="root">ResultError</param>
</result>
</action>
<!-- 這段 action show1 不重要 衹是測試了另一種獲取參數的方式 可以删除这段 action -->
<action name="show1" class="demo1.TestAction1" method="Show1">
<result name="success" type="json">
<param name="root">Result1</param>
</result>
</action>
</package>
</struts>
通过 struts.xml 的配置,定义了 package,一个 package 可以是对一个模块的处理,或者是一组功能处理,包中又分为很多 action,每个 action 对应一个或多个客户端的 post 或 get,method="Show" 则是指明该 action 调用哪个函数。
package 的命名空间可以定义提交的目录,action 的名字则是这个提交目录的最后一级,例如:
<package name="DemoStruts2" extends="struts-default, json-default" namespace="/mydemo">
<action name="show" class="demo.TestAction" method="Show">
那么访问该 action 则是 http://host/project/mydemo/show
当函数Show ()运行正常,返回 "success" 时,则由 struts.xml 定义的函数getResultSuccess向客户端返回 Show() 执行结果,注意代码中的函数多了个 get 的前缀,而在 struts.xml 内则不需要写 get 前缀。
<result name="success" type="json">
<param name="root">ResultSuccess</param> (
</result>
如果 Show() 返回 "error",则调用 getResultError 向客户端返回信息。
<result name="error" type="json">
<param name="root">ResultError</param>
</result>
服务端返回的 json 将由客户端的 jQuery 处理。
demo.TestAction.java
struts.xml 定义的 action 类,这里面有 action 所需要接收提交的函数,struts.xml 中定义了<action name="show" class="demo.TestAction" method="Show">,则表明 action show 调用了 Show() 函数进行处理,注意类路径不要弄错。
根据 struts.xml 的定义,Show() 函数一定得返回 "success"、"error" 或者 "other",否则客户端没法接收返回的信息,
根据 struts.xml 的定义,getResultSuccess 将在 Show() 返回 "success" 时调用,并将全局变量返回给客户端。如果 Show() 返回 "error",则由getResultError 返回全局变量给客户端。如果 Show() 返回 "other",则由getResultOther 返回全局变量给客户端。
/**
* Action
* 业务逻辑处理
*/
package demo;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import java.util.Random;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport implements ServletRequestAware
{
/**
*
*/
private static final long serialVersionUID = 1L;
// 用於接收提交參數的對象
private HttpServletRequest request = null;
// 用於 struts2 返回函數的全局變量
private String strResult = null;
public TestAction()
{
}
/**
* 繼承 ServletRequestAware 并重載 setServletRequest 以獲得傳入參數
*/
@Override
public void setServletRequest(HttpServletRequest request)
{
this.request = request;
}
/**
* struts.xml 内声明的 action "show",当 namespace + action name 匹配时调用
*
* @return
*/
public String Show()
{
// 获取提交的参数
String strName = request.getParameter("name");
String strAge = request.getParameter("age");
String strSex = request.getParameter("sex");
// 用於携帶返回的信息
// 返回 success, error, other, struts.xml 定義了返回選擇器
String[] state = new String[1];
// 調用 model 完成數據處理
TestModel testModel = new TestModel();
// 傳入一些用戶信息 返回 json 格式信息
String str = testModel.getJSON(state, strName, strAge, strSex);
// 赋值于全局变量 用于返回函数返回至客户端
strResult = str;
// 返回 success, error, other, struts.xml 有定义
return state[0];
}
/**
* 收到 success 调用
* <p>
* 見 struts.xml 声明
* <p>
*
* @return
*/
public String getResultSuccess()
{
return strResult;
}
/**
* 收到 error 或 other 调用
* <p>
* 見 struts.xml 声明
* </p>
*
* @return
*/
public String getResultError()
{
return strResult;
}
}
demo.TestModel.java
这个文件内的函数内容并不重要,与 struts2 没什么关系,只是为了生成 json 格式的信息,实际项目中这个文件更多的应该是处理数据库之类的操作。
/**
* struts2 model
* 一般負責處理數據处理
*/
package demo;
import java.util.Date;
import java.util.Random;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.Calendar;
public class TestModel
{
/**
* 返回當前時間
*
* @return
*/
private String getDate()
{
String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date());
return str;
}
/**
* 返回 json 格式字符串
*
* @param state
* 狀態 可携帶函數返回,返回 success / error / other
* @param strName
* 传入
* @param strAge
* 传入
* @param strSex
* 传入
* @return
*/
public String getJSON(String[] state, String strName, String strAge, String strSex)
{
// 用隨機數產生返回類型
Random random = new Random();
double d = random.nextDouble() * 10000;
int i = (int) d;
if (i % 3 == 0 || i % 5 == 0)
{
state[0] = "error";
}
else if (i % 7 == 0 || i % 9 == 0)
{
state[0] = "other";
}
else
{
state[0] = "success";
}
ObjectMapper mapper = new ObjectMapper();
ObjectNode nodeSinge = mapper.createObjectNode();
nodeSinge.put("time", getDate());
nodeSinge.put("age", strAge);
nodeSinge.put("sex", strSex);
nodeSinge.put("type", state[0]);
ArrayNode arrayNode = mapper.createArrayNode();
arrayNode.add(nodeSinge);
ObjectNode root = mapper.createObjectNode();
root.put("name", strName);
root.put("id", i);
root.set("rows", arrayNode);
return root.toString();
}
}
index.jsp
前端页面jQuery 取得整个 form 通过 ajax 提交,接收返回类型是 json,解析后显示内容。
jQuery 可到 http://www.jquery.com 下载。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery.min.js"></script>
<title>Insert title here</title>
</head>
<body>
<form id="theForm" action="#" method="post" target="_self">
<p>
name:
<input id="name" name="name" type="text" value="NUL">
</p>
<p>
age:
<input id="age" name="age" type="text" value="25">
</p>
<p>
sex:
<input id="sex" name="sex" type="text" value="man">
</p>
</form>
<p>
<!-- 按鈕觸發函數 同時傳遞一個 rul -->
<button type="button" onClick="p(0);">Post to URL1</button>
<button type="button" onClick="p(1);">Post to URL2</button>
</p>
<p style="color: red">
return data: <label id="text7" style="color: black"></label>
</p>
<p>
title:
<input id="text1" name="text1" type="text">
</p>
<p>
id:
<input id="text2" name="text2" type="text">
</p>
<p>
time:
<input id="text3" name="text3" type="text">
</p>
<p>
age:
<input id="text4" name="text4" type="text">
</p>
<p>
sex:
<input id="text5" name="text5" type="text">
</p>
<p>
type:
<input id="text6" name="text6" type="text">
</p>
</body>
<script type="text/javascript">
function p(v)
{
// 選擇有兩個 rul
if (v == 0)
{
url = 'mydemo/show'
}
else
{
url = 'mydemo/show1'
}
var $form = $('#theForm');
$.ajax({
type : "POST",
async : false,
dataType : "json",
url : url,
data : $form.serialize()
}).done(function(data)
{
// 显示完整的返回数据
$('#text7').html(data);
// 返回信息转换为 json 对象
var json = $.parseJSON(data);
// json array 賦值到各 id 控件
$('#text1').val('Hello: ' + json.name);
$('#text2').val(json.id);
// array json
$.each(json.rows, function(i, item)
{
$('#text3').val(item.time);
$('#text4').val(item.age);
$('#text5').val(item.sex);
$('#text6').val(item.type);
});
});
}
</script>
</html>
页面显示
显示结果
单击按钮后,提交的 form 返回了一个 json 串,经解析,显示到编辑框内。
以上!
完整代码如下
http://download.csdn.net/detail/joyous/9250345
有问题Q群讨论,Q群号:236201801
.
更多相关文章
- Ajax_04之jQuery中封装的Ajax函数
- jQuery: 刨根问底 attr and prop两个函数的区别
- jQuery ajax问题 - 无法让我的函数工作
- 通过调用返回参数的本地函数来构建Ajax Data部分
- Jquery ajax回调函数不执行
- JQUERY组装对象并调用自身函数改变自己的属性
- Angular ng-show不会根据函数返回值显示/隐藏
- 未捕获的ReferenceError:函数未定义,它标记
- 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但