注意ActionForward 默认设置

ActionForward是做什么的?

他是用来封装转发路径的。

在struts-config.xml中<forward name="error" path="/login.jsp"></forward>默认的是安转发处理,转发的特点:是使用同一个request,而重定向的url地址会改变,而转发的url地址是不变的。而且重定向使用的不是同一个request,等于又发送了一个请求,所以他的url地址会改变。在这想变为重定向,需要使用另一个属性:redirect="true",设置成true,就变成重定向了。<forward name="error" path="/login.jsp"></forward>在这是错误了转到登陆页面,所以应该使用重定向来实例。让地址也变到登陆的地址。

定义全局forward:

使用标签<global-forwards>来定义全局forward:

<global-forwards>
<forward name="login" path="/login.jsp" redirect="true"/>
</global-forwards>

这个标签要放在 <action-mappings>的上面:

</form-beans>

<global-forwards>
<forward name="login" path="/login.jsp" redirect="true"/>
</global-forwards>

<action-mappings>

全局forward是都可以访问的,但是当需要使用forward时,strues自动安就近原则来选择。当局部也有定义时,就按照局部的来转。

所以对以公共的内容,就可以定义到全局里,例如错误处理等。



动态ActionForward:

静态ActionForward在运行期改不了,采用动态ActionForward,在运行期是可以改动的。

String page = request.getParameter("page");

ActionForward af = new ActionForward();
af.setPath("/page" + page + ".jsp?name=Tom");
return af;

静态的 ActionForward的url是不能加参数的,而使用动态的ActionForward,则可以加参数。



ActionForward的使用

1、理解全局和局部ActionForward的概念
2、redirect的使用
3、struts-config.xml文件不允许动态修改
4、理解动态ActionForward,动态的ActionForward是可以运行期修改的



http://sundful.iteye.com/blog/143167

ActionForward的作用就是从一个页面链接到另一个页面,最简单的应用就是mapping.findForward("success")。

属性:name-逻辑名称;path-URL;redirect-当设置为true是,重定向,默认为false;className(可选)-默认为ActionForward。

一般的调用过程:当ActionServlet调用Action时,Action 把Mapping的findForward()传递给它。findForward()先在局部forward转发列表中寻找key,如果没找到,再从全局forward转发列表中寻找。如果都没找到,此方法将返回null,浏览器报错。

在<html:link>标记中的使用:
在配置文件中定义一个forward:

Java代码
01.<forward name="article" path="/do/article?dispatch=view"/>
<forward name="article" path="/do/article?dispatch=view"/>

<html:link>中:

Java代码
01.<html:link forward="article" paramName="articleForm" paramProperty="articleKey" paramId="key">News from the edge</html:link>
<html:link forward="article" paramName="articleForm" paramProperty="articleKey" paramId="key">News from the edge</html:link>

运行结果:

Java代码
01.<a href="http://localhost/artimus/do/article?dispatch=view&key=17">News from the edge</a>
<a href="http://localhost/artimus/do/article?dispatch=view&key=17">News from the edge</a>

注意这边,如果已经存在一个参数,标签会很聪明的帮你添加一个连接符号,之后再添加参数。
添加自己要转发的路径:

Java代码
01.public ActionForward execute( ActionMapping mapping,
02. ActionForm form,
03. HttpServletRequest request,
04. HttpServletResponse response)
05. throws Exception{ 06. ActionForward forward = new ActionForward(); 07. String loginid = ((LoginForm)form).getLoginid();
08. String password = ((LoginForm)form).getPassword();
09. if(...){ 10. ...... // business code 11. forward.setPath("welcome.jsp"); 12. }else{ 13. ActionMessages errors = new ActionMessages(); 14. .......
15. forward = mapping.findForward("Failure"); 16. }
17. return forward; 18. }
public ActionForward execute( ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
ActionForward forward = new ActionForward();
String loginid = ((LoginForm)form).getLoginid();
String password = ((LoginForm)form).getPassword();
if(...){
...... // business code
forward.setPath("welcome.jsp");
}else{
ActionMessages errors = new ActionMessages();
.......
forward = mapping.findForward("Failure");
}
return forward;
}
在Action 类中添加参数:

Java代码
01.ActionForward forward = mapping.findForward("article");
02.StringBuffer path = new StringBuffer(forward.getPath()); 03.boolean isQuery = (path.indexOf("?")>=0); 04.if (isQuery) 05.path.append("&dispatch=view"); 06.else 07.path.append("?dispatch=view"); 08.return new ActionForward(path.toString()); ActionForward forward = mapping.findForward("article");
StringBuffer path = new StringBuffer(forward.getPath());
boolean isQuery = (path.indexOf("?")>=0);
if (isQuery)
path.append("&dispatch=view");
else
path.append("?dispatch=view");
return new ActionForward(path.toString());

如果ActionForward 没有设置为重定向,新的参数将被合并到当前request的参数中。如果新的参数的名称和原参数名称相同,在新的转发期内将使用新的参数值。




http://liuyinhuan.iteye.com/blog/271181
ActionForward的使用



1、ActionForward包含转向信息



2、全局forward和局部forward

* 全局forward,若很多个Action处理完后都要转向到某页面,不妨把该页面设为全局forward:

Java代码
01.<global-forwards>
02. <forward name="login" path="/login.jsp" redirect="true"/> 03.</global-forwards>
<global-forwards>
<forward name="login" path="/login.jsp" redirect="true"/>
</global-forwards>

* 局部forward:

Java代码
01.<action path="/login"
02. type="cn.huan.struts.LoginAction" 03. name="loginForm" 04. scope="request" 05. >
06. <forward name="success" path="/login_success.jsp"/> 07. <forward name="error" path="/login_error.jsp"/> 08. </action>
<action path="/login"
type="cn.huan.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"/>
<forward name="error" path="/login_error.jsp"/>
</action>

* mapping.findForward方法会先自动找配置中的局部forward,若没有就找全局forward





3、转发和重定向

转向:同一个request

重定向:需设置redirect="true",另建一个新request,故改变了url



4、转发和重定向都可以自己定义而不用struts提供的ActionForward



在Action中自定义转向:

Java代码
01.RequestDispatcher dispatcher = request.getRequestDispatcher("/mustlogin.jsp");
02.dispatcher.forward(request, response);
03.return null; RequestDispatcher dispatcher = request.getRequestDispatcher("/mustlogin.jsp");
dispatcher.forward(request, response);
return null;



在Action中自定义重定向:

Java代码
01.response.sendRedirect(request.getContextPath() + "/login.jsp");
02.return null; response.sendRedirect(request.getContextPath() + "/login.jsp");
return null;





5、struts-config.xml文件和web.xml文件在运行时都不能动态修改,也就是不能再在Action中改已配置好的属性值





6、动态ActionForward

不需要修改Action代码和增加<forward>配置







例如:如果需要根据页面输入的值动态的跳转到不同页面:

Java代码
01.<form action="dynaactionforward.do" method="post">
02. 页面:<input type="text" name="page"><br> 03. <input type="submit" value="提交"> 04.</form>
<form action="dynaactionforward.do" method="post">
页面:<input type="text" name="page"><br>
<input type="submit" value="提交">
</form>









则用动态ActionForward可很好地实现,Action和配置信息分别为(其中注释部分为没有使用动态 ActionForm时的代码):

Action代码:

Java代码
01.package cn.huan.struts;
02.
03.import javax.servlet.http.HttpServletRequest; 04.import javax.servlet.http.HttpServletResponse; 05.
06.import org.apache.struts.action.Action; 07.import org.apache.struts.action.ActionForm; 08.import org.apache.struts.action.ActionForward; 09.import org.apache.struts.action.ActionMapping; 10.
11./** 12. * 动态ActionForwad测试
13. * @author 刘银环
14. *
15. */
16.public class DynaActionForwardTestAction extends Action { 17.
18. /* (non-Javadoc) 19. * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
20. */
21. @Override 22. public ActionForward execute(ActionMapping mapping, ActionForm form, 23. HttpServletRequest request, HttpServletResponse response)
24. throws Exception { 25. String page = request.getParameter("page"); 26.// ActionForward af = null; 27.// if("1".equals(page)){ 28.// af = mapping.findForward("page1"); 29.// }else if("2".equals(page)){ 30.// af = mapping.findForward("page2"); 31.// } 32.// return af; 33.
34. //动态ActionForward 35. ActionForward af = new ActionForward(); 36. af.setPath("/page" + page + ".jsp"); 37. return af; 38. }
39.
40.}
package cn.huan.struts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* 动态ActionForwad测试
* @author 刘银环
*
*/
public class DynaActionForwardTestAction extends Action {
/* (non-Javadoc)
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String page = request.getParameter("page");
// ActionForward af = null;
// if("1".equals(page)){
// af = mapping.findForward("page1");
// }else if("2".equals(page)){
// af = mapping.findForward("page2");
// }
// return af;
//动态ActionForward
ActionForward af = new ActionForward();
af.setPath("/page" + page + ".jsp");
return af;
}
}


配置信息:

Java代码
01.<action path="/dynaactionforward"
02. type="cn.huan.struts.DynaActionForwardTestAction"> 03. <!--
04. <forward name="page1" path="/page1.jsp"/> 05. <forward name="page2" path="/page2.jsp"/> 06. -->
07.</action>


from: google baidu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值