struts1 action添加注解

最近因为需要,要求jsp页面可以直接调用strus1.2中action的方法,首先google了一下,看到一个struts1-annotation插件可以达到需要,又抽时间研究了一下struts1.2的源码,自己实现了一种直接在方法上面加注解的方式,记录如下

一、利用struts-annotation插件的实现

1、下载插件源代码,地址:http://code.google.com/p/struts-annotations/,并引入项目
这个插件可以将struts-config.xml中的action配置全部以注解的形式实现:

@StrutsAction(name = "loginForm", path = "/xflogin", cancellable = true, scope = "request")
public class LoginAction extends DispatchAction{...}

需要在struts-config.xml的<struts-config>标签中添加标签:

 <plug-in className="org.easy.struts.action.StrutsAnnotationsPlugin"></plug-in>

 

插件具体如何使用,大家可以自己搜索查看用法,在此只研究方法的直接调用。该插件本身已经实现了由前台直接调用后台方法,但是没有放出来,需要进行小小的改造,具体操作如下

1、在org.easy.struts.apt.StrutsActionMapping类添加 parameter 参数,并实现get/set方法。

2、在org.easy.struts.anno.StrutsAction注解类中添加新的属性 :String parameter() default "";

3、在org.easy.struts.action.StrutsAnnotationsPlugin类中(大概74行)仿照其它属性的添加方式添加:

actionConfig.setParameter(actionMapping.parameter());

4、在action的类注解中添加parameter属性,值为method:

@StrutsAction(name = "loginForm", path = "/xflogin", parameter="method", cancellable = true, scope = "request")
public class LoginAction extends DispatchAction{ ...}

 

测试

jsp: <input type="hidden" name="method" value="testMethod" />

action,添加一方直接调用的方法:

public ActionForward testMethod(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response){...}

注意:方法中必须包含这四个参数且顺序固定,并且前台调用的方法和后台的方法名必须一样。

 

该插件对于只想直接从前台调用后台方法,并不想修改struts-config.xml配置文件到后台注解的同学,并不十分方便,遂研究了一下struts1的action源码,发现可以通过改造RequestProcessor类来实现。

二、自定义方法注解

1、新建一个注解类,并添加一个属性,类名、属性自定义

 2、新建一个控制器类,继承自org.apache.struts.action.RequestProcessor,并重写方法

@Override

protected ActionForward processActionPerform(....)


 

3、在struts-config.xml的<struts-config>标签中添加指向自定义控制器类的标签:
<controller processorClass="com.impl.action.ExtendedRequestProcessor"></controller>
 测试:

jsp:

 action:

 

说明

1、前台调用的方法名只要等于后台注解方法名即可(@PostMethod(invokemethod="testmethod")

2、方法中可以不带参数,也可以是ActionMapping,ActionForm,ServletRequest,ServletResponse四种类型中的一个或多个,并且与顺序无关。

3、我已经实现了直接返回String、JSONObect、JSONArray类型的数据,如果有需要,大家可以根据自己的需要,接着实现直接返回自己需要的类型:

-------------------------------------------------------------------------------------

结束