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

.

更多相关文章

  1. Ajax_04之jQuery中封装的Ajax函数
  2. jQuery: 刨根问底 attr and prop两个函数的区别
  3. jQuery ajax问题 - 无法让我的函数工作
  4. 通过调用返回参数的本地函数来构建Ajax Data部分
  5. Jquery ajax回调函数不执行
  6. JQUERY组装对象并调用自身函数改变自己的属性
  7. Angular ng-show不会根据函数返回值显示/隐藏
  8. 未捕获的ReferenceError:函数未定义,它标记
  9. 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但

随机推荐

  1. 浅谈Android的Rotation动画的应用
  2. Cocos2d-x在win7下的android交叉编译环境
  3. Android历史版本及和eclipse基本区别
  4. android沉浸式+虚拟按键+Fragment+Coordi
  5. 诚聘Android开发工程师
  6. Android(安卓)Activity 横竖屏模式切换时
  7. android调用第三方库——第四篇——调用
  8. Android - GridView,自定义开关控件,状态选
  9. Android中的Selector 背景选择器
  10. Android的权限控制机制