XWork是一个通用的Command模式框架,对它的关注始于我对Interceptor结构了解的需要。对于起步而言,Hello World级的东西总是最为快捷的选择。
在XWork中,Action用以处理核心的逻辑,下面就是一个:
HelloAction.java
java 代码
- import com.opensymphony.xwork.Action;
-
- public class HelloAction implements Action {
- public String execute() throws Exception {
- System.out.println("Hello, World");
- return SUCCESS;
- }
- }
然后是调用这个Action,如果直接调用的话,一来代码显得没有多大意义,二来后面的戏就没法继续了。于是写出这样的代码:
Main.java
java 代码
- import com.opensymphony.xwork.ActionProxyFactory;
- import com.opensymphony.xwork.ActionProxy;
-
- public class Main {
- public static void main(String[] args) throws Exception {
- ActionProxyFactory factory = ActionProxyFactory.getFactory();
- ActionProxy proxy = factory.createActionProxy("", "hello", null);
- proxy.execute();
- }
- }
-
AcionProxy,我们可以将它看作Action的一个壳,它的调用最终会作用在Action身上,因此它拥有了“proxy”的美名。而ActionProxyFactory,名字就体现出了它的作用,制造AcitonProxy。
先别忙着运行程序,智慧如你一定会想到,这个proxy怎么和前面的HelloAction关联在一起。我们还需要一个配置文件:
xwork.xml
- <!---->
- "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
- <xwork>
- <package name="default">
- <action name="hello" class="HelloAction">
- action>
- package>
- xwork>
“Hello”,这样一个字符串起到“一桥飞架南北,天堑变通途”的作用,一端它在ActionProxyFactory创建ActionProxy时,作为传入参数连接起proxy,另一端它在配置文件中,与具体类型相连,找到了具体的Action。
既然困难已经排除,还等什么?就这样,“Hello, World”出现了。也许会有些无关大雅的警告,说明我们没有为HelloAction返回success进行处理,忽略它。
blog的标题提醒我,终极目标是Interceptor。Interceptor是这样一种架构模式,它允许将服务透明地添加到框架之中,当我们关注的事件发生时,就会自动触发这个服务。JBoss之所以灵活,其核心架构就是Interceptor。对了,XWork的来源于WebWork,而WebWork的创造者便是大名鼎鼎的Rickard Oberg,而他正是JBoss灵活的架构正是出自他的手笔。J2EE开发者的工具箱中还有一件工具也采用了Interceptor的实现,它便是Servlet Filter。了解Interceptor对于理解AOP有着相当的好处,因为二者之间存在太多的相似,以致于有人专门站出来声明“AOP != Interceptor”。
对于程序员而言,任何话语都没有代码来得实惠,下面就是一个Interceptor:
HelloInterceptor.java
java 代码
- import com.opensymphony.xwork.interceptor.Interceptor;
- import com.opensymphony.xwork.ActionInvocation;
-
- public class HelloInterceptor implements Interceptor {
- public void init() {
- }
-
- public void destroy() {
- }
-
- public String intercept(ActionInvocation invocation) throws Exception {
- System.out.println("Hello, Interceptor");
-
- return invocation.invoke();
- }
- }
省略用以管理声明周期的init和destroy,我们把焦点放在intercept方法。除了一句将用以证明它存在的打印语句之外,这个方法中还有一条语句:
java 代码
- return invocation.invoke();
在通常的Interceptor实现中,各个Interceptor往往会形成一条链,这句invocation.invoke()就是把控制权交出的方式,调用便是沿着这条链一步步向后面走去,熟悉设计模式的朋友一眼便能看出,这是职责链的一种实现,而它恰恰是Interceptor架构的关键。
为了让它发光发热,我们还需要在配置文件里做一些修改,先是加上一个Interceptor:
xml 代码
- <interceptors>
- <interceptor name="helloInterceptor" class="HelloInterceptor"/>
- interceptors>
接着,要让action知道它的存在,我们还要修改Action:
xml 代码
- <action name="hello" class="HelloAction">
- <interceptor-ref name="helloInterceptor"/>
- action>
至于主文件,就不再修改了,否则如何体现“透明”的添加服务呢!
再次运行程序,劳动成果得到了体现:
Hello, Interceptor
Hello, World
|
相关推荐
在我们的"HelloWorld"示例中,我们需要创建一个Action类,继承自`org.struts2.dispatcher.ng.ExecuteAction`或实现`com.opensymphony.xwork2.Action`接口。 2. **配置文件**:Struts2的核心配置文件是`struts.xml`...
Struts2框架通过拦截器(Interceptor)机制来处理HTTP请求,这些拦截器可以进行预处理和后处理,如日志记录、权限验证等。Action类是业务逻辑的载体,它实现了接口`com.opensymphony.xwork2.Action`,并负责处理请求...
import org.apache.struts2.interceptor.MessageStoreInterceptor; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport { private String message; public ...
6. **扩展性**:Struts2的强大在于其高度可扩展性,可以集成其他技术,如Spring、Hibernate等,提供拦截器(Interceptor)机制进行业务逻辑的预处理和后处理,以及丰富的插件支持。 通过学习和实践"struts2hello",...
这部分内容可能是一个简单的示例,演示如何使用XWork2构建一个“Hello World”应用程序。 #### XWork Validation XWork内置了一套验证机制,可以轻松地验证用户输入的有效性,支持多种验证类型,如必填验证、长度...
3. **配置文件**:WebWork的配置文件通常命名为`struts-config.xml`或`xwork.xml`,在这个例子中可能是`WebWorkHelloWorld`目录下的某个配置文件。配置文件定义了Action的映射、拦截器链等信息。 4. **...
4. **拦截器(Interceptor)**:Struts2的拦截器机制使得在Action调用前后可以插入额外的功能,如日志、权限检查等。默认的拦截器栈包含了诸如参数绑定、异常处理等功能。 5. **表达式语言(OGNL)**:Struts2使用...
- **XWork2 HelloWorld Tutorial**:一个简单的入门示例,演示了如何使用XWork来构建Web应用。 #### 七、其他相关信息 - **XWork Configurations**:进一步扩展了配置方面的内容,包括高级配置选项。 - **XWork ...
1. 创建一个Action类,如`HelloWorldAction.java`,实现`com.opensymphony.xwork2.Action`接口: ```java public class HelloWorldAction implements Action { @Override public String execute() { return ...
要创建一个自定义拦截器,需要实现`com.opensymphony.xwork2.interceptor.Interceptor`接口。该接口包含三个方法:`init()`、`destroy()`和`intercept(ActionInvocation invocation)`。 ```java package ...
在后续的学习中,你将更深入地了解Struts2的特性,包括Interceptor拦截器、结果类型、OGNL表达式、动态方法调用、插件扩展等。此外,还会涉及如何与Spring、Hibernate等其他框架集成,以构建更复杂的Java Web应用...
4. **拦截器(Interceptor)**:拦截器是Struts2的一大特色,它们在Action调用前后执行,可以实现日志记录、权限验证、数据校验等功能。通过在`struts.xml`中配置,可以灵活地组合和调整拦截器栈。 5. **OGNL...
拦截器通过实现`com.opensymphony.xwork2.interceptor.Interceptor`接口或扩展`com.opensymphony.xwork2.DefaultInterceptor`来创建。拦截器可以用于日志记录、权限验证、事务管理等。 **4. 配置文件** Struts2的...
<interceptor-ref name="defaultStack"/> ``` 在上述配置中,Struts 2.0将调用`HelloWorld`类的`customMethod`而不是默认的`execute`方法。 总的来说,Struts 2.0的Action机制更加灵活,允许开发者自由...
Struts 2还提供了多种方式来改变Action的执行逻辑,比如通过配置Action的`result`元素,或者使用拦截器(Interceptor)来改变Action的执行流程。拦截器可以用于实现通用的功能,如登录检查、权限验证等,这样就不...
如果希望改变默认的`execute()`调用行为,Struts2提供了拦截器(Interceptor)机制。拦截器可以插入到Action执行流程中,执行自定义逻辑,如日志、权限检查等,甚至可以改变Action的执行路径。这类似于Struts1中的...
1. **前端拦截机(Interceptor)**:允许在Action执行前后进行拦截操作,如登录验证、性能监控等。 2. **运行时表单属性验证**:支持动态验证表单字段,确保输入数据的有效性。 3. **类型转换**:自动将用户输入的...
<default-interceptor-ref name="defaultStack"/> <result name="success" type="dispatcher">ex01-success.jsp </xwork> ``` - **Action 配置**:这里定义了一个名为 `helloWebWorld` 的 Action,其实现类...
4. **编写Action**:创建一个Java类,实现`com.opensymphony.xwork2.ActionSupport`接口,并重写`execute()`方法。在这个方法中,你可以编写"Hello, World"的输出逻辑。 5. **配置Action**:由于我们使用的是...
1. 创建拦截器类:首先,你需要创建一个实现`com.opensymphony.xwork2.interceptor.Interceptor`接口的Java类。这个类需要实现`intercept()`方法,这是拦截器的核心逻辑,会在Action执行前和后被调用。 ```java ...