在一个struts项目中,碰到这么一个问题:

用户的登录页面地址是:

http://localhost:8080/sduprs/user/user_login.jsp

登录后显示的地址为:

http://localhost:8080/sduprs/userLogin.do

更悲剧的是我们在后台使用了frame框架。这样登录后所有的操作地址都显示为上面的那个地址。大师兄不满意,要求修改为实际地址。在网上查了半天资料,发现是url转发问题,具体点就是ActionForward的问题。下面是关于ActionForward的资料:

(1)ActionForward是Struts的核心类之一,其基类仅有4个属性:name / path / redirect / classname。在基于Struts的Web应用程序开发过程中,Action操作完毕后程序会通过Struts的配置文件struts- config.xml链接到指定的ActionForward,传到Struts的核心类ActionServlet,ActionServlet使用 ActionForward提供的路径,将控制传递给下一个步骤。ActionForward控制接下来程序的走向。ActionForward代表一个 应用的URI,它包括路径和参数。
(2)ActionForward的参数除了在struts-config.xml和页面中设置外,还可以通过在Action类中添加参数,或重新在 Action中创建一个ActionForward。
(3)在ActionForward中有一个重要的属性redirect,当redirect=false时,将保存存储在http请求和请求上下文中 的所有内容,仅在同一个应用中可用。当redirect=true时,Web客户端进行一次新的http请求,请求的资源可以在同一个应用中,也可以不 在,原来的请求参数不再保存,原来的请求上下文也被清除,新的http请求仅包含ActionForward的path属性里所包含的参数。如果在同一个 应用中,用户会话的上下文会被维护。
(4)ActionForward分为全局转发和局部转发,Action的Mapping对象的findForward方法首先会检查局部转发列表,查 找失败就会到全局转发列表中查找。书写格式中,我们一般将全局变量定义为String常数,避免误解,使得转发列表结构清晰易读。

实际上,struts有两种定向方式:转发和重定向(redirect)。当我们用了重定向的时候,是把页面完全转向到请求的视图去了。同时,浏览器上边的url也更新了。这样的优点是请求完全转移,缺点是无法用request.setAttribute传递参数值;当我们使用转发的时候,是将本次请求的request传递给了要定向的jsp或者servlet。同时执行被请求的jsp或 servlet,结果显示出来。但是,浏览器上看到的依然是发出请求的url,而不是结果的url,这种方式的优点:可以向被请求的jsp或 servlet传递值request.setAttribute,缺点是url依然是请求的url,不是结果的url,刷新的话,将再次执行该请求。

根据上面的介绍我发现使用redirect必须谨慎。仔细排查了下处理登录页面的action,发现只是向session写入了user变量,并没有使用request.setAttribute传参。因此就把struts-config.xml里ActionForward的redirect属性设置为了true:

<forward name=”userLoginSuccess” path=”/user/main.jsp” redirect=”true”/>

这样我遇到的问题就解决了。

相关日志

Leave a Reply

(required)

(required)

click to change(必须)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam
© 2009 - 2018 冰河的博客