struts.xml 如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<!--
/login/error.jsp
/login/error.jsp
--><action name ="*_*" class="com.lion.king.action.animal.{1}Action" method="{2}" >
<result name="success">/animalManager/{1}_{2}.jsp</result>
<result name="error"> /login/error.jsp</result>
<result name="input"> /login/error.jsp</result>
</action>
</package>
action类如下
package com.lion.king.action.animal;
import java.util.Map;
import org.apache.struts2.interceptor.RequestAware;
import com.lion.king.model.animal.Animal;
import com.lion.king.service.animal.AnimalService;
import com.opensymphony.xwork2.ActionSupport;
public class AnimalAction extends ActionSupport implements RequestAware{
private AnimalService as;
public AnimalService getAs() {
return as;
}
public void setAs(AnimalService as) {
this.as = as;
}
private Map request ;
public void setRequest(Map<String, Object> request) {
this.request=request;
}
public String add(Animal a) {
return SUCCESS;
}
public String delete(long[] ids) {
return SUCCESS;
}
public String select(Animal a) {
request.put("animals", as.select(a));
return SUCCESS;
}
public String update(Animal a) {
return SUCCESS;
}
}
[color=blue][/color]
我想问的是 在中
method属能不能制定带参数的方法,貌似用通配符配的时候select(Aniaml a) 方法是带参数的,所以就出错!
如果能写带参数的方法该如何做????
把需要调用用带参数的方法放入service或者私有方法中,action中调用方法
自己重写STRUTS2的ACTIONMAPPING方法,(或者扩展STRUTS2自带的)来实现你需要的这个需求
Strut2的ACTIONMAPPER的接口
[code="java"]public interface ActionMapper {
ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager);//这里就是解析REQUEST到你配置的ACION的,你只要自己写个自己的规则 就可以了
ActionMapping getMappingFromActionName(String actionName);
String getUriFromActionMapping(ActionMapping mapping);
}[/code]
STRUT2默认使用的是DefaultActionMapper这个类,
你只要扩展一下,然后修改strut.xml那strut调用你的actionmapper就可以按照你 的规则走了
[quote]
我想问的是 在中
method属能不能制定带参数的方法,貌似用通配符配的时候select(Aniaml a) 方法是带参数的,所以就出错!
[/quote]
你这里配置的“method”就是Action的方法,Action的方法全部都是无参数的,为什么你会需要调用有参数的Action方法呢?这样调用肯定会出错的,struts2直接就抛出NoSuchMethodException了。
[quote]我现在就有这样的需求。。。楼上的大哥说了需要重新actionmapping那个类。。。。。。。[/quote]
个人觉得不可行。无论怎么解析,该接口返回的都是ActionMapping,但从这个类的定义来看,里面不包含任何关于action方法调用参数的状态,那么在真正的ActionInvocation进行方法调用时,无法采用反射的方式获取有参数的Action方法。
[code="java"]
try {
method = getAction().getClass().getMethod(methodName, EMPTY_CLASS_ARRAY);
} catch (NoSuchMethodException e) {
[/code]
这是DefaultActionInvocation里invokeAction方法里的一段,这里很明显通过反射获取无参数的Action方法,自然是不可能获取有参数的Action方法了。
以上是个人的一点分析,大家也可以给出自己的看法。我想问一下作者,到底什么场景使得你需要使用有参数的Action方法,这样的话,那Ac是tion方法还可以重载了,方法声明的参数必须作为Action调用时的状态传入。
Action本身就扮演了Model的角色,所以你直接把需要的参数声明为实例变量即可,实体ruts2会以push的方式设置好参数。而且Strut2是采用每个请求一个Action实例,也不会有线程安全的问题。不需要额外实现RequestAware这样的接口,来主动pull参数。