在一个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:
分享到:
相关推荐
- `<logic:redirect>`:执行重定向操作,通常用于跳转到外部URL。 4. **实例应用** 在实践中,我们通常会在JSP页面中使用这些标签来构建用户界面。例如,创建一个简单的登录表单: ```jsp 登录" /> ...
在Action类中添加错误或消息,然后在JSP页面通过Struts标签库进行渲染。 4. 配置文件中的全局转发与重定向 除了在特定Action配置中定义转发和重定向,我们还可以在struts-config.xml的全局部分定义,这样可以在多...
`<logic:forward>`和`<logic:redirect>`标签用于实现页面间的跳转。 **4.3 HTML标记** **4.3.1 显示表单元素和输入控件** `<html:checkbox>`、`<html:password>`、`<html:radio>`等标签用于生成HTML表单元素。 *...
在struts.xml或action类的注解中,你可以设置`result`元素的`type`属性为`redirectAction`来配置重定向结果。例如: ```xml <param name="actionName">anotherAction <param name="namespace">/...
9. **预定义的Action和Result**:Struts1.2提供了如redirect、forward等预定义的结果类型,简化了Action和视图之间的跳转。 10. **Plug-in架构**:Struts1.2的插件架构允许开发者扩展框架功能,例如添加自定义拦截...
- `<html:link>` 标签:创建链接,支持`forward`(全局转发链接)、`href`(完整URL)和`page`(相对URL)属性,可方便地携带请求参数并处理cookie问题。 - `<html:img>` 标签:用于插入图像,支持添加参数,如`...
`path`属性定义请求路径,`class`属性指定Action类,`parameter`属性用于指定请求参数,`forward`和`redirect`元素定义请求处理后的转发或重定向目标。 5. **ActionForward配置**:`<action-Forwards>`定义了Action...
5. 若选择转发,服务器会直接将请求传递给一个内部资源,如JSP页面,而用户在浏览器中看到的仍然是原始的登录URL。 了解了这些基本概念,开发者可以更好地理解和利用Struts中的重定向和转发机制,以实现更加高效和...
当用户提交表单时,Struts会将表单数据封装到ActionForm对象中,然后传递给Action类进行处理。 4. **配置文件**:有两个主要的配置文件——`struts-config.xml`和`web.xml`。前者定义了Action及其对应的ActionForm...
- `<logic:redirect>`:类似于`<logic:forward>`,但它会触发HTTP重定向,而不是内部转发,因此URL会在浏览器地址栏中更新。 使用这些标签时,通常需要结合Struts的ActionForm、Action以及ActionMapping来处理请求...
这会驱动Struts框架将控制权转交给`<forward>`或`<redirect>`标签指定的目标。 5. **MVC模式**:在Struts框架中,Action作为Controller,处理请求并决定接下来的流程。Model通常是业务对象,而View则由JSP页面构成...
- **转发和重定向标记**:例如forward、redirect等标签,用于控制页面跳转。 - **4.3 HTML标记** - **显示表单元素和输入控件**:例如text、password、radio等标签,用于创建各种表单元素。 - **显示错误信息的...
- Struts1定义了一些预设的Result类型,如dispatcher(转发到JSP)、redirect(重定向)等。 14. ** strutssrc** - 压缩包中的`struts_src`可能包含了Struts1框架的所有源代码,这为开发者提供了深入理解框架内部...
3. **Action跳转问题**:Action执行完成后,可能会遇到ActionForward或Redirect的问题。ActionForward是服务器端跳转,而Redirect是客户端跳转,两者的应用场景不同。 4. **性能优化**:Struts1因其面向接口编程和...
它可以通过设置`path`属性来指定目标URL或JSP页面,也可以通过设置`redirect`属性来决定是否进行重定向。 #### 4. 错误处理 Struts框架提供了错误处理机制,主要包括ActionError类,用于表示应用程序级别的错误信息...
`path`属性指定了URL路径,`action`属性指定了处理请求的Action类,而`forward`或`include`子元素则定义了请求处理后的页面跳转。 3. **表单bean(Form Bean)**:Struts通过`<form-bean>`元素来定义表单bean,这些...
常见的Result类型有Redirect、Forward、Stream等,它们控制着视图的跳转和数据的返回方式。 5. **ValueStack和OGNL**: Struts2使用ValueStack来存储模型数据,便于在Action和JSP之间传递。OGNL(Object-Graph ...
首先,我们需要理解Struts2中的“转发”(Redirect)和“重定向”(RedirectAction)。在Web开发中,转发和重定向是两个不同的概念。转发是在服务器端完成的,请求被传递给另一个资源,而客户端的URL不会改变;而...
9. **预定义结果类型(Forward与Redirect)**:在struts-config.xml中,可以设置Action的forward和redirect,决定用户请求处理完成后是直接转发还是重定向到新的URL。 10. **拦截器(Interceptor)**:虽然Struts1...