从RequestProcess处理过后,就到了Action,那么现在看看Action!
Action 类是用户请求和业务逻辑之间的桥梁。每个Action充当客户的一项业务代理。在RequestProcess类预处理请求时,在创建了Action实例后,就调用了自身的processActionPerform方法,该方法用action类的execute的方法
而execute方法去调用模型的相关业务方法,完成用户所需的业务逻辑,然后把执行结果返回给视图组件,给用户显示!
Action类在应用程序的使用过程中,为了处于线程安全的考虑,整个过程中,只会初始化一个实例对象,所有的请求线程可以同时调用他的execute方法。
我们如果需要实现控制类,则继承action类的同时至少要实现它的execute方法。我们看一下在 Struts 学习之03Controller(控制器 中) action包下的LoginAction.java类,
其实我们看到,在struts-config.xml中配置后,然后再在action中使用是非常方便的!而且也比较灵活!
最后再介绍一个action子类,也是比较常用的一个内置对象DispatchAction.
DispatchAction是干什么用的呢,就是我们实际中正常的一个请求,例如后台管理,可能是增加数据,或修改,删除,那么这些请求,我们知道都是统一发到ActionServlet,然后actionServlet就发送给相对的action处理,这时就需要三个action!而更多时候我们是选择三个 操作请求同时对一个formBean进行操作的,我们就不需要太多的action,只 需要一个action,当然,这样也可以在action的execute方法中进行判断来解决,但不是十分方便!
那么这个时候我们就要用到DispatchAction,看一下如何使用,我们将先前的LoginAction.java类改为如下:
我们看到上面二个方法内部其实还是和execute方法一样,唯一不同就是方法名字!那么究竟如何知道请求呢,我们当然还要改一下配置文件struts-config.xml! 在action中添加一个属性parameter
将<html:form action="/login">修改如下:
现在看下运行结果!
我们看到单击submit后 控制台显示出了相应的信息,而同时再将<html:form>标记改为
运行的结果为:
在控制台打印出更新,由此可见,使用DispatchAction我们可以很方便的实现多个不同请求使用同一个actionform了!
Action 类是用户请求和业务逻辑之间的桥梁。每个Action充当客户的一项业务代理。在RequestProcess类预处理请求时,在创建了Action实例后,就调用了自身的processActionPerform方法,该方法用action类的execute的方法
而execute方法去调用模型的相关业务方法,完成用户所需的业务逻辑,然后把执行结果返回给视图组件,给用户显示!
Action类在应用程序的使用过程中,为了处于线程安全的考虑,整个过程中,只会初始化一个实例对象,所有的请求线程可以同时调用他的execute方法。
我们如果需要实现控制类,则继承action类的同时至少要实现它的execute方法。我们看一下在 Struts 学习之03Controller(控制器 中) action包下的LoginAction.java类,
package
fengyan.struts.action;
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;
import fengyan.struts.form.LoginForm;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
//return null;
return mapping.findForward("ok");
}
}
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;
import fengyan.struts.form.LoginForm;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
//return null;
return mapping.findForward("ok");
}
}
我们可以看见他继承了Action,同时execute方法实现了!execute方法返回了一个ActionForword对象!
ActionForword对象代表了Web资源逻辑方法对象,这里边的对象可以是jsp,servlet以及其它的action.。上面“ok”这些都是需要我们将 其配置在struts-config.xml中!如下:
<?
xml version="1.0" encoding="UTF-8"
?>
<! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd" >
< struts-config >
< data-sources />
< form-beans >
< form-bean name ="loginForm" type ="fengyan.struts.form.LoginForm" />
</ form-beans >
< global-exceptions />
< global-forwards />
< action-mappings >
< action
attribute ="loginForm"
input ="/login.jsp"
name ="loginForm"
path ="/login"
scope ="request"
type ="fengyan.struts.action.LoginAction" >
< forward
name ="ok"
path ="/ok.jsp"
redirect ="true" />
< forward name ="error" path ="/error.jsp" />
</ action >
</ action-mappings >
< controller processorClass ="fengyan.struts.action.MyRequestProcessor" >
</ controller >
< message-resources parameter ="fengyan.struts.ApplicationResources" />
</ struts-config >
<! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd" >
< struts-config >
< data-sources />
< form-beans >
< form-bean name ="loginForm" type ="fengyan.struts.form.LoginForm" />
</ form-beans >
< global-exceptions />
< global-forwards />
< action-mappings >
< action
attribute ="loginForm"
input ="/login.jsp"
name ="loginForm"
path ="/login"
scope ="request"
type ="fengyan.struts.action.LoginAction" >
< forward
name ="ok"
path ="/ok.jsp"
redirect ="true" />
< forward name ="error" path ="/error.jsp" />
</ action >
</ action-mappings >
< controller processorClass ="fengyan.struts.action.MyRequestProcessor" >
</ controller >
< message-resources parameter ="fengyan.struts.ApplicationResources" />
</ struts-config >
我们看到配置了二个forword ok 对应 ok.jsp ,redirect=true表明其重导向!另外一个是error 对应 error.jsp,不需要重导向!
当然也可以不在配置文件中配置这些信息,那么我们就需要在action类中的直接return,方式如下:
return
new
ActionForword(
"
eflylab
"
,
"
eflylab.jsp
"
,
true
);
// 第一个eflylab是逻辑名称,中间eflylab.jsp为物理地址,最后true 是指其跳的方式是Redirect还是forword,true为重导向!false不 需要重导向!
// 第一个eflylab是逻辑名称,中间eflylab.jsp为物理地址,最后true 是指其跳的方式是Redirect还是forword,true为重导向!false不 需要重导向!
其实我们看到,在struts-config.xml中配置后,然后再在action中使用是非常方便的!而且也比较灵活!
最后再介绍一个action子类,也是比较常用的一个内置对象DispatchAction.
DispatchAction是干什么用的呢,就是我们实际中正常的一个请求,例如后台管理,可能是增加数据,或修改,删除,那么这些请求,我们知道都是统一发到ActionServlet,然后actionServlet就发送给相对的action处理,这时就需要三个action!而更多时候我们是选择三个 操作请求同时对一个formBean进行操作的,我们就不需要太多的action,只 需要一个action,当然,这样也可以在action的execute方法中进行判断来解决,但不是十分方便!
那么这个时候我们就要用到DispatchAction,看一下如何使用,我们将先前的LoginAction.java类改为如下:
package
fengyan.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import fengyan.struts.form.LoginForm;
// 我们将 该 类由继承自Action 改为继承 DispatchAction
// DispatchAction是Action的子类!
public class LoginAction extends DispatchAction {
/**//*需要注意的是,如果我们的action类继承自DispatchAction,那么该类中
不能存在execute,我们要将 其名改掉,具体可以改为我们需要的方法名,
如,本例中我们改为如下*/
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
System.out.println("接收到的是增加操作请求!");
return mapping.findForward("ok");
}
//还可以增加任意多个我们需要的方法!
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
System.out.println("接收到的是更新操作请求!");
return mapping.findForward("ok");
}
}
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import fengyan.struts.form.LoginForm;
// 我们将 该 类由继承自Action 改为继承 DispatchAction
// DispatchAction是Action的子类!
public class LoginAction extends DispatchAction {
/**//*需要注意的是,如果我们的action类继承自DispatchAction,那么该类中
不能存在execute,我们要将 其名改掉,具体可以改为我们需要的方法名,
如,本例中我们改为如下*/
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
System.out.println("接收到的是增加操作请求!");
return mapping.findForward("ok");
}
//还可以增加任意多个我们需要的方法!
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
System.out.println("接收到的是更新操作请求!");
return mapping.findForward("ok");
}
}
我们看到上面二个方法内部其实还是和execute方法一样,唯一不同就是方法名字!那么究竟如何知道请求呢,我们当然还要改一下配置文件struts-config.xml! 在action中添加一个属性parameter
<
action-mappings
>
< action
attribute ="loginForm"
input ="/login.jsp"
name ="loginForm"
path ="/login"
parameter ="doWhat"
scope ="request"
type ="fengyan.struts.action.LoginAction" >
< forward
name ="ok"
path ="/ok.jsp"
redirect ="true" />
< forward name ="error" path ="/error.jsp" />
</ action >
我们加的parameter值 为 doWhat.。这时还没完成,我们还需要修改前台页面,login.jsp
< action
attribute ="loginForm"
input ="/login.jsp"
name ="loginForm"
path ="/login"
parameter ="doWhat"
scope ="request"
type ="fengyan.struts.action.LoginAction" >
< forward
name ="ok"
path ="/ok.jsp"
redirect ="true" />
< forward name ="error" path ="/error.jsp" />
</ action >
<
html
>
< head >
< title > JSP for LoginForm form </ title >
</ head >
< body >
< html:form action ="/login" >
userName : < html:text property ="userName" />< html:errors property ="userName" />< br />
userPwd : < html:password property ="userPwd" />< html:errors property ="userPwd" />< br />
< html:submit />< html:cancel />
</ html:form >
</ body >
</ html >
< head >
< title > JSP for LoginForm form </ title >
</ head >
< body >
< html:form action ="/login" >
userName : < html:text property ="userName" />< html:errors property ="userName" />< br />
userPwd : < html:password property ="userPwd" />< html:errors property ="userPwd" />< br />
< html:submit />< html:cancel />
</ html:form >
</ body >
</ html >
将<html:form action="/login">修改如下:
<
html:form
action
="/login?doWhat=add"
>
这里的doWhat就是我们刚刚在action中添加的参数paramter的值!而add则就是actionform中的add方法名!
现在看下运行结果!
我们看到单击submit后 控制台显示出了相应的信息,而同时再将<html:form>标记改为
<
html:form
action
="/login?doWhat=update"
>
运行的结果为:
在控制台打印出更新,由此可见,使用DispatchAction我们可以很方便的实现多个不同请求使用同一个actionform了!