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.javaeye.com/blog/143167
属性:name-逻辑名称;path-URL;redirect-当设置为true是,重定向,默认为false;className(可选)-默认为 ActionForward。
一般的调用过程:当ActionServlet调用Action时,Action 把Mapping的findForward()传递给它。findForward()先在局部forward转发列表中寻找key,如果没找到,再从全局 forward转发列表中寻找。如果都没找到,此方法将返回null,浏览器报错。
在<html:link>标记中的使用:
在配置文件中定义一个forward:
- <forward name="article" path="/do/article?dispatch=view" />
<forward name="article" path="/do/article?dispatch=view"/>
<html:link>中:
- <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>
运行结果:
- <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>
注意这边,如果已经存在一个参数,标签会很聪明的帮你添加一个连接符号,之后再添加参数。
添加自己要转发的路径:
- 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;
- }
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 类中添加参数:
- 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 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的参数中。如果新的参数的名称和原参数名称相同,在新的转发期内将使用新的参数值。
ActionForward的 使用
1、ActionForward包含转向信息
2、 全局forward和局部forward
* 全局forward,若很多个Action处理完后都要转向到某页面,不妨把该 页面设为全局forward:
- <global-forwards>
- <forward name="login" path="/login.jsp" redirect="true" />
- </global-forwards>
<global-forwards> <forward name="login" path="/login.jsp" redirect="true"/> </global-forwards>
* 局部forward:
- <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>
<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中自定义转向:
- RequestDispatcher dispatcher = request.getRequestDispatcher("/mustlogin.jsp" );
- dispatcher.forward(request, response);
- return null ;
RequestDispatcher dispatcher = request.getRequestDispatcher("/mustlogin.jsp"); dispatcher.forward(request, response); return null;
在Action中自定义重定向:
- response.sendRedirect(request.getContextPath() + "/login.jsp" );
- return null ;
response.sendRedirect(request.getContextPath() + "/login.jsp"); return null;
5、struts-config.xml文件和web.xml文件在运行时都不能动态修改,也 就是不能再在Action中改已配置 好的属性值
6、 动态ActionForward
不 需要修改Action代码和增加<forward>配置
例如:如果需要根据页面输入的值动态的跳转到不同页面:
- <form action="dynaactionforward.do" method="post" >
- 页面:<input type="text" name="page" ><br>
- <input type="submit" value="提交" >
- </form>
<form action="dynaactionforward.do" method="post"> 页面:<input type="text" name="page"><br> <input type="submit" value="提交"> </form>
则用动态ActionForward可很好地实现,Action和配置信息分别为(其中注释部分为没有使用动态 ActionForm时的代码):
Action代码:
- 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;
- }
- }
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; } }
配置信息:
- <action path="/dynaactionforward"
- type="cn.huan.struts.DynaActionForwardTestAction" >
- <!--
- <forward name="page1" path="/page1.jsp" />
- <forward name="page2" path="/page2.jsp" />
- -->
- </action>