一、Action
通常,在使用Struts1框架时,对于JSP组件请求应用程序执行的每个动作,应用程序都扩展Struts1的org.apache.struts.action.Action以创建Action类;
Action类定义了根据Servlet环境不同可以被分别执行的两个方法,一般开发中使用:
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
另一个方法是没有http的。
Action类通过他的execute()方法来处理请求,返回一个ActionForward对象来指定合适的响应,一个典型的Action类会在execute方法中实现如下的逻辑处理:
1、检验用户会话的当前状态;
2、如果验证没有完成,按需要验证form bean的属性;
3、根据请求来作出相应的处理;
4、更新将会被用户生成下一个用户界面的对象;
5、返回一个合适的AcitonForward对象,它将会指定用于生成响应的显示页面;
如果需要保存一个记录到数据库中,典型的过程为:
ActionForward提供一个链接的输入页面
ActionForm捕获输入
ActionMapping配置Aciton
Action将输入送到数据库中(通常会将这一步操作委托给业务逻辑去实现)
Aciton的主要职责:
校验输入数据
调用业务逻辑方法
检测处理异常
根据逻辑进行转向操作
Struts中常见的Action有:
DispathAction:能同时完成多个Action功能的Action;
ForwardAction:用来整合Struts和其他业务逻辑组件,通常只对请求做有效性检查;
IncludeAction:用于引入其他的资源和页面;
SwitchAction:用于从一个模块转换至另一个模块,如果应用分成多个模块时,就可以使用SwitchAction完成模块之间的切换;
说明:
DispathAction是仅次于Action,使用最频繁的Action,他可以避免每个Action创建一个类,可支持多个逻辑处理
当使用DispathAction要求表单提交时,会额外多传递一个参数,该参数用于区分到底调用Action的哪个方法,即在struts-config.xml中
<action path="/teacher" name="TeacherForm" type="org.lxh.action.TeacherAction" parameter="operate" input="/index.jsp">
添加parameter属性,该属性用于指定参数名,即struts将根据该参数的值调用对应的方法
<html:link href="student.do?operate=entryAdd">添加</html:link>
注意:
在DispatchAction的配置中,parameter属性值不能够是execute或perform,如果是,则会将DispatchAction中的覆盖掉,造成派发失效
如果需要从一个页面或资源转换到另一个资源时,直接使用页面或资源路径的超级链接定位并不是好的做法,这使得控制器没有机会处理相关的请求事宜;
使用ForwardAction可以完成请求的转发,当控制器调用ForwardAction的perform()方法时,它会使用属性parameter所设定的路径进行forward的动作。
二、ActionForward
ActionForward用于封装转发路径,在Action中处理完用户请求之后,将会返回一个ActionForward对象,常用方式如下;
return mapping.findForward("success");
调用ActionMapping对象的findForward方法,会从Struts配置文件中,找到一个名为success的ActionForward,然后返回给ActionServlet进行转向
ActionForward分为两类:
全局ActionForward,可以被所有的Action访问,例如在某些页面需要用户必须登录之后才能访问,而不能直接输入页面地址来进行访问,这就需要在Action中进行判断,如果没有登陆,则将控制返回给登陆页面,这种情况下,使用全局的ActionForward
局部ActionForward,在Action里配置,仅对该Action有效
ActionForward的三个属性:
name,该Forward的逻辑名
path,该Forward映射到的jsp资源
redirect,只能是true或false,设置是否使用重定向
true:使用重定向,两次请求的参数将会分别封装在两个不同的request中,即在第二次的处理中,不能访问的第一次请求的参数;
false:不使用重定向,两次请求的参数将会封装在同一个request中,即在第二次的处理中,可以得到第一次请求的参数;
可以在Action中使用如下方式获得已经配置好的ActionForward(ActionForward forward = mapping.findForward("success")),服务器启动时,会将struts的配置文件读出,在内存中以hashMap的方式保存起来,Hashmap中的key就是配置的相关信息,value就是相应的对象,所以上面获得的ActionForward是已经在内存中生成的对象,是不能够动态修改的,即(forward.setRedirect(true);)会报配置已经被冻,struts-config.xml文件是不允许动态修改的;
ActionForward对象可以手动生成,如下:
ActionForward forward = new ActionForward();
forward.setPath("success.jsp");//设置ActionForward的转向页面
return forward;
这样就可以动态修改,设置路径,重定向等属性值;
三、ActionMapping
为了操作成功,负责控制的ActionServlet需要知道每个请求的url应该如何映射到一个合适的Action类,这些信息就被封装在一个名为ActionMapping的类中
AcitonMapping对象对应了配置信息,在配置文件中一个Action标签就会对应一个ActionMapping实例,会将Action标签中的属性都放在ActionMapping中,它的一些重要属性如下;
type:用于指定Action的实现类,也就是负责处理用户请求的业务控制器
name:在配置文件中定义的,该ActionMapping将会用到的ActionForm的名字
path:ActionServlet根据该属性来转发用户的请求
<action path="/login" name="loginForm" type="org.lxh.action.OperTeacherAction" > <forward name="success" path="/success.jsp"></forward> </action>
当客户端请求login.do时,会将控制转发到LoginAction中,并且将请求参数封装在LoginForm中。
ActionMapping重要属性:
unknown:设置true,则如果某个请求不能够被其他action处理,则由该action进行处理,对于一个应用,只有一个action可以被设置为true
forward:代表满足该请求的资源,而不会实例化Action
<action path="/unknown" unknown="true" forward="/unknown.jsp" />
当ActionServlet找不到响应的action来处理客户端的.do请求时,上面的action将会接管,因为它的unknown属性设置了true,将会自动跳转到unknown.jsp页面
Scope:表示Struts框架在将ActionForm对象(与目标Action匹配的ActionForm)传送到Action之前,会将ActionForm对象保存的位置,可以取值为:
request:将指示Struts调用request.setAttribute("ActionForm名",ActionForm对象)方法,将ActionForm保存到request
session:调用request.getSession().setAttribute()方法
在实际开发中,为了减少服务器端的压力,一般将scope值设置为request