Struts2 json jQuery ajax 的集成配置与使用及 demo 演示源码示范

来源:互联网 发布:java oa项目源代码 编辑:程序博客网 时间:2024/05/18 18:14

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){// 選擇有兩個 rulif (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

.

0 0