使用struts2 interceptor后, 导致无法获取Action中的getXXX方法

julyarrow 2008-11-13 11:28:18
我的一个Action中有一个getXXX(比如说getCustomers)方法, 它的结果是一个jsp页面, 该jsp页面中使用到XXX(customers)属性, 如果不使用Interceptor包装这个action一切都正常. 但是一旦使用了拦截器后, 结果页面就没有显示customers的相关内容了. 同学说可能是因为拦截器的代理问题, 导致在代理中根本不存在这个getXXX方法, 所以结果页面也无法解析到. 请问是这样吗? 有什么解决办法么? (也许问题有点不太清楚, 还请大家谅解, 刚接触struts2不久, :-))
...全文
172 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtra6714 2010-01-18
  • 打赏
  • 举报
回复
mark
julyarrow 2008-11-13
  • 打赏
  • 举报
回复
谢谢二位的热情帮助
那我就结贴吧, 呵呵
clarck_913 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 julyarrow 的回复:]


十分感谢clarck_913 的帮助, 问题已经解决了. 的确是因为默认拦截器被取消了, 只要在action中添加defaultStack拦截器栈就可以了.
另: defaultStack和我自己定义的interceptor的顺序上有什么要求么? 我自己试了一下, 好像没什么区别.
要是没什么其他问题, 我今天就结贴, 呵呵. 再次感谢上面的朋友

[/Quote]

关于拦截器的顺序我还没有试过

我想如果我们自己定义的拦截器和Struts2提供的拦截器之间没有耦合的话

顺序应该不会造成问题
tzb08 2008-11-13
  • 打赏
  • 举报
回复
恩 是需要defaultStack拦截器栈的 至于顺序,我这边defaultStack都在前面,区别?等有问题了再说吧 哈哈
julyarrow 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 clarck_913 的回复:]

当使用者没有给Action注册interceptor的时候

Struts2默认使用自己的拦截器栈实现很多功能

当你给Action注册interceptor后,默认拦截器的功能被取消了

你需要在Action里再次显式的定义使用默认拦截器栈

我想应该是这个问题
[/Quote]
十分感谢clarck_913 的帮助, 问题已经解决了. 的确是因为默认拦截器被取消了, 只要在action中添加defaultStack拦截器栈就可以了.
另: defaultStack和我自己定义的interceptor的顺序上有什么要求么? 我自己试了一下, 好像没什么区别.
要是没什么其他问题, 我今天就结贴, 呵呵. 再次感谢上面的朋友
julyarrow 2008-11-13
  • 打赏
  • 举报
回复
struts.xml

<package name="cn.edu.software.nju.crm.action" extends="struts-default">
<interceptors>
<interceptor name="authorization" class="authorizationInterceptor"></interceptor>
<interceptor name="log" class="logInterceptor"></interceptor>
<interceptor-stack name="authorizationAndLog">
<interceptor-ref name="authorization"></interceptor-ref>
<interceptor-ref name="log"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="UserSubsystems" class="userSubsystemsAction">
<interceptor-ref name="authorization"></interceptor-ref>
<result>/crm/UserSubsystems.jsp</result>
</action>
<!-- 其他action配置-->

由于采用了spring + struts, 所以上面配置文件中的authorizationInterceptor和userSubsystemsAction的在spring的bean工厂里声明了
在spring的applicationContext.xml中

<bean id="authorizationInterceptor"
class="cn.edu.software.nju.crm.interceptor.AuthorizationInterceptor">
</bean>
<bean id="userSubsystemsAction"
class="cn.edu.software.nju.crm.action.UserSubsystems"
scope="prototype">
<property name="systemService" ref="systemService"/>
</bean>
<!-- 其他bean-->

还需要什么么? 先谢谢tzb08了, :-)
clarck_913 2008-11-13
  • 打赏
  • 举报
回复

当使用者没有给Action注册interceptor的时候

Struts2默认使用自己的拦截器栈实现很多功能

当你给Action注册interceptor后,默认拦截器的功能被取消了

你需要在Action里再次显式的定义使用默认拦截器栈

我想应该是这个问题
tzb08 2008-11-13
  • 打赏
  • 举报
回复
配置文件也贴出来
julyarrow 2008-11-13
  • 打赏
  • 举报
回复
一个会话验证功能, 如果没有用户登录或者在线超时(10分钟)就注销.
下面是这个interceptor内容
public class AuthorizationInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = 4502697384032660168L;
/**
* 超时时间,单位millisecond,默认10分钟。
*/
private static final long TIME_OUT_INTERVAL = 600000L;
@Override
public String intercept(ActionInvocation ai) throws Exception {
Map session = ai.getInvocationContext().getSession();
//判断是否登录。
if(session.get("userId") == null){
return Action.LOGIN;
}else{
//判断是否超时
long startTime = (Long)session.get("startTime");
long interval = System.currentTimeMillis() - startTime;
if(interval > TIME_OUT_INTERVAL){
session.clear();
return Action.LOGIN;
}else{
//没有超时,重新设置计时开始时间
session.put("startTime", System.currentTimeMillis());
//调用Action
return ai.invoke();
}
}

}

}

而Action内容是:
public class UserSubsystems extends ActionSupport implements SessionAware {

private static final long serialVersionUID = -8136997656959262253L;

private SystemService systemService;
@SuppressWarnings("unchecked")
private Map session;
private List<Subsystem> subsystems;


public List<Subsystem> getSubsystems() {
Long userId = (Long)session.get("userId");
return this.systemService.getSubsystems(userId);
}
@SuppressWarnings("unchecked")
public void setSession(Map session) {
this.session = session;
}

public void setSystemService(SystemService systemService) {
this.systemService = systemService;
}

}

我的主界面JSP中需要使用该Action中的subsystems属性, 但是使用interceptor后就出问题了.
希望大家帮忙看看, 万分感激.
tzb08 2008-11-13
  • 打赏
  • 举报
回复
你用拦截器想实现什么样的功能?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧