ActionForward的使用,可以通过一个例子:有一个mustlogin.jsp页面,必须登录才可以看的,通过一个MustLoginAction转到这个页面
-----------------------------------------------------------------
ActionForward的使用
1、理解全局和局部ActionForward的概念
2、redirect的使用
3、struts-config.xml文件不允许动态修改
4、理解动态ActionForward,动态的ActionForward是可以运行期修改的
-----------------------------------------------------------------
1、mustlogin.jsp页面
<body>
这个是一个受保护的页面
</body>
2、index.jsp页面
<body>
<a href="login.jsp">登录</a><br>
<a href="mustlogin.do">访问受保护的页面</a><br>
<p>
</body>
3、login.jsp页面
<form action="login.do" method="post">
用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
4、struts-config.xml配置文件

Code
<form-beans>
<form-bean name="loginForm" type="com.bjsxt.struts.LoginActionForm"/>
</form-beans>
<action-mappings>
<action path="/login" type="com.bjsxt.struts.LoginAction"
name="loginForm"
scope="request"
validate="false"
>
<forward name="success" path="/login_success.jsp"/>
<forward name="error" path="/login_error.jsp"/>
</action>
<action path="/mustlogin" type="com.bjsxt.struts.MustLoginAction"
>
<!-- redirect="true"表示重定向 -->
<forward name="login" path="/login.jsp" redirect="true"/>
<forward name="success" path="/mustlogin.jsp"/>
</action>
</action-mappings>注意,在这个配置文件中出现了一个问题,如果有多个<action path="...></action>中需要配置同一个
<forward name="login" path="/login.jsp" redirect="true"/>,这个时候可以配置全局的forward,且放在<action-mappings>标签的前面,如下(注意:如果有局部,就用局部的,如果没有就用全局的)

Code
<form-beans>
<form-bean name="loginForm" type="com.bjsxt.struts.LoginActionForm"/>
</form-beans>
<global-forwards>
<forward name="login" path="/login.jsp" redirect="true"/>
</global-forwards>
<action-mappings></action-mapping>
5、MustLoginAction.java

Code
package com.bjsxt.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;
public class MustLoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//如果为空转向重新登录,否则转到受保护的页面
if (request.getSession().getAttribute("user") == null) {
ActionForward af = mapping.findForward("login");
//struts-config.xml文件在运行期间不能修改
//af.setRedirect(false);
return af;
//重定向
//response.sendRedirect(request.getContextPath() + "/login.jsp");
//return null;
}
return mapping.findForward("success");
}
}
6、LoginAction.java类,设置user --request.getSession().setAttribute("user", username);

Code
package com.bjsxt.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;
/**
* 用户登录的Action
* @author Administrator
*
*/
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
// if ("admin".equals(username) && "admin".equals(password)) {
// //转向到登录成功页面
// request.setAttribute("username", username);
// return mapping.findForward("success");
// }else {
// //转向到登录失败页面
// return mapping.findForward("error");
// }
String errorInfo = "";
try {
UserManager.getInstance().login(username, password);
//request.setAttribute("username", username);
request.getSession().setAttribute("user", username);
return mapping.findForward("success");
}catch(UserNotFoundException unfe) {
unfe.printStackTrace();
errorInfo = "用户不能找到,用户名称=[" + username + "]";
}catch(PasswordErrorException pee) {
pee.printStackTrace();
errorInfo = "密码错误";
}
request.setAttribute("errorinfo", errorInfo);
return mapping.findForward("error");
}
}
7、从1-6可以看出,struts-config.xml文件在运行期间不能修改,那么我们可以使用动态的ActionForward可以在运行期间修改struts-config.xml
<1>在index.jsp页面中增加如下代码,且新建三个jsp页面(page1.jsp、page2.jsp、page3.jsp)
<li>动态ActionForward测试</li><br>
<form action="dynaactionforward.do" method="post">
页面:<input type="text" name="page"><br>
<input type="submit" value="提交">
</form>
<2>struts-config.xml

Code
<action path="/dynaactionforward"
type="com.bjsxt.struts.DynaActionForwardTestAction"
>
<!-- 静态的ActionForward -->
<forward name="page1" path="/page1.jsp"/>
<forward name="page2" path="/page2.jsp"/>
</action> <3>DynaActionForwardTestAction.java

Code
package com.bjsxt.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;
public class DynaActionForwardTestAction extends Action {
@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;
//用new新建ActionForward,成了动态的ActionForward
ActionForward af = new ActionForward();
//此时为动态的ActionForward,故在这里可以修改struts-config.xml中的path属性
af.setPath("/page" + page + ".jsp?name=Tom");
return af;
}
}
补充:在struts-config.xml中的
<forward name="success" path="/mustlogin.jsp" className="net.nyist.***"/>
中的className是用来给用户自己的写一个类,且用这个类来进行重定向,而不使用ActionForward来重定向