问题的由来:
在网页设计中,当一个用户退出登录时,往往要去除Session中的登录信息,然后返回之前引用页。在Action中,删除登录信息,很简单就可以做到。但是如何使result指向引用页呢?
尝试
:
1、return的 Action.INPUT:( 失败 )
报错是 找不到 名为Input的result配置。
2、在result的配置中使用OGNL表达式:( 失败 )
<result type="redirect">${#request.header['referer']}</result>
控制台会有警告,大意是 无法解析表达式#request.header['referer']。
其实,仔细想来(也测试过)。在Struts2的 OGNL context中的 request、session等,仅仅包含 key-value的内容。和Servlet规范中的request、session等不一样。
3、在Action中,直接获取HTTPServletRequest,然后配置result转向。( 成功 )
LogoutAction中有个属性:
//................
private String preURL;
public String getPreURL() {
return preURL;
}
//.................
然后在Action的某个方法(比如execute)中,操作HTTPServletRequest,改变preURL的值。
//..........
HttpServletRequest request = ServletActionContext.getRequest();
String contextPath = request.getContextPath();
String preURL = request.getHeader("referer");
int begin = preURL.indexOf(contextPath);
preURL = preURL.substring(begin + contextPath.length());
//..........
最后,配置result:
<result type="redirect">${preURL}</result>
不足之处:
需要在每一个要求获得引用页的Action中加入相同的代码,解决方式不够优雅 ⊙﹏⊙。
最终解决:借助于Struts2提供的Interceptor来优雅地解决问题。
1、一个interface -- PreURLAware
package edu.xjtu.jxg.struts.aware;
/**
* Actions that want access to the Where the request is come from should implement this interface.<p />
*
* This interface uses the HTTPServletQuest.getHeader("referer") to achieve this goal.<p/>
*/
public interface PreURLAware {
public void setPreURL(String preURL);
}
2、一个Interceptor -- PreURLInterceptor
package edu.xjtu.jxg.interceptor;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import edu.xjtu.jxg.struts.aware.PreURLAware;
public class PreURLInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 5421682585093337518L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Object obj = invocation.getAction();
if (obj instanceof PreURLAware) {
HttpServletRequest request = ServletActionContext.getRequest();
String contextPath = request.getContextPath();
String preURL = request.getHeader("referer");
if (preURL == null)
((PreURLAware) obj).setPreURL(null);
else {
int begin = preURL.indexOf(contextPath);
preURL = preURL.substring(begin + contextPath.length());
((PreURLAware) obj).setPreURL(preURL);
}
}
return invocation.invoke();
}
}
3、修改需要获得引用页的Action
需要获得引用页(preURL)的Action实现 PreURLAware接口
4、修改result的配置,即加入PreURLInterceptor
定义Interceptor:
<interceptors>
<interceptor name="preURL"
class="edu.xjtu.jxg.interceptor.PreURLInterceptor"></interceptor>
</interceptors>
引用Interceptor:
<action name="logout" class="edu.xjtu.jxg.struts.action.LogoutAction">
<interceptor-ref name="preURL"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result type="redirect">${preURL}</result>
</action>
大功告成!!O(∩_∩)O
分享到:
相关推荐
5. **Result类型**:Action执行后的结果通常由Result类型决定,比如可以重定向到另一个页面,或者直接渲染一个JSP页面。Struts2内置了一些常见的Result类型,也可以自定义Result类型。 6. **ValueStack**:...
例如,`HelloWorldAction`执行成功后,用户可能会被重定向到`result.jsp`,并在该页面上显示一些消息。 4. **Struts2的MVC模式**: - **Model**:业务逻辑,由Action类实现。Action类处理数据并与数据库交互,执行...
登录后,Struts2会根据Action的返回结果跳转到相应的页面。例如,如果登录成功,`execute()`方法返回`"success"`,那么用户将被重定向到`/success.jsp`;若登录失败,可能返回`"input"`,让用户重新填写登录信息。 ...
Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。在Struts2中,异常处理是一项重要的功能,它确保在应用程序遇到错误时能够优雅地处理,提供友好的用户反馈,并保持系统稳定...
同时,会涉及Result的概念,它是Action执行后的跳转目标,包括内部重定向和外部URL重定向。 4. **拦截器(Interceptors)**:Struts2的强大之处在于其拦截器机制,它可以实现通用的功能,如日志、事务管理和权限...
- **Interceptor**:在`package`元素内部,可以定义拦截器或引用拦截器堆栈,拦截器是Struts2中非常重要的组件,用于在Action执行前后进行一系列的前置和后置处理操作,比如登录验证、数据校验等。 - **Result ...
Struts2支持将配置文件进行模块化的管理,这意味着开发者可以将不同的功能或组件的配置放在单独的XML文件中,并通过`<include>`标签引用这些文件。这种方式有助于提高代码的可维护性和可读性,使得大型项目的配置...
6. **结果类型(Result Type)**:Struts2提供了多种Result类型,如`dispatcher`(默认类型,用于转发到JSP页面)、`stream`(用于处理文件下载)、`redirect`(重定向)等。通过Result类型的配置,我们可以灵活地...
Struts2是一个强大的Java web开发框架,它提供了一种组织和控制MVC(模型-视图-控制器)架构的方式。在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截...
- Struts2提供了一套完善的异常处理机制,允许开发者通过配置文件定义不同类型的异常应该怎样被处理和重定向。 9. **表单验证(Validation)**: - Struts2支持基于注解或XML的表单验证,可以方便地对用户输入...
在Struts2中,这可以通过资源包(`.properties`文件)实现,然后在Action或JSP中引用。 这个简单的Struts2登录示例展示了如何整合前端表单、后端验证以及Struts2框架的配置来实现一个基本的登录功能。在实际项目中...
在struts2_demo中,可能会有一个登录拦截器,检查用户是否已登录,如果没有,则重定向到登录页面。 6. **其他支持文件**:如JDBC连接池配置、实体类(如果涉及数据库操作)、JSP标签库引用等。 通过这个示例,初学...
在导入项目到Eclipse后,你需要配置项目的构建路径,确保所有依赖库(如Struts2的jar包)被正确引用。然后,你可以通过运行Tomcat服务器启动项目,访问预设的URL来测试Struts2的配置是否正确。 对于初学者,建议先...
在这个例子中,`execute()`方法被标记为处理名为"myAction"的请求,如果执行成功,将重定向到"success.jsp"页面。 2. `@Results`: 如果一个类中有多个Action方法,可以使用`@Results`注解来定义一组共用的结果。这...
在Struts2的配置文件struts.xml中,需要配置action,并引用token拦截器和defaultStack拦截器栈。这样,当发生重复提交时,Struts2框架会自动处理并转向token.jsp页面,提示用户重复提交了表单。 对于第二种原因,即...
Struts2是一个强大的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在这个小实例中,我们将深入探讨如何利用Struts2的注解来构建一个简洁而高效的Web应用。 首先,让我们了解什么是注解...
4. **Result**: 结果类型定义了Action执行后如何展示结果,如转发到另一个JSP页面、重定向等。 5. **配置**: Struts2的配置可以通过XML或注解完成,灵活且易于维护。 **FreeMarker模板引擎** FreeMarker是Java的...
在Struts2中,路径跳转是应用程序中常见的操作,它涉及到请求转发和重定向。当遇到“Struts2中路径无法跳转的问题”时,这通常与配置、Action类、结果类型或JSP页面的设置有关。以下是一些可能导致问题的关键知识点...
4. **结果(Result)**:Action执行后返回的结果,常见的Result类型有`dispatcher`(默认,用于转发到JSP页面)、`redirect`(重定向)、`chain`(链式调用下一个Action)和`redirectAction`(重定向到另一个Action...