Struts1.x教程(二) Struts进阶使用

上篇文章,介绍了Struts的工作原理,讲到Struts的各个组件,而这些组件的协调交互都是通过Struts的核心配置文件来进行的。

Struts配置介绍

Struts的默认配置文件是struts-config.xml,下面对它的主要配置项做一下简单介绍。

form-bean元素
form-bean标签的作用是配置ActionForm的实例。ActionForm是用于在页面和Action之间传值。当页面表单被提交到Struts控制器时,它会将提交的参数信息传递给ActionForm,按照参数名与ActionForm中的属性(setter方法)对应将参数值组装入ActionForm中。如果想在组装ActionForm前初始化属性,必须实现reset方法,它在ActionForm组装前被调用。
struts-config.xml中的form-bean配置示例:
<form-bean name="userForm" type="com.boya.struts.form.UserForm"/>
name:formbean的名称,主要供配置文件中的其他元素引用,如action元素
type:formbean对应的实现类,该类必须扩展自org.apache.struts.action.ActionForm。

action元素
action标签描述了框架如何处理一个请求操作,它是Struts的核心配置。当发出一个请求时,ActionServlet使用path属性来选择对应的ActionMapping,ActionMapping封装了action标签中配置的所有属性信息,然后调用相应的Action。最后,通过ActionMapping查找相应的ActionForward返回页面。struts-config.xml中action配置示例:
<action path="/login" name="userForm" type="com.boya.struts.web.LoginAction">
	<forward name="fail" path="/login.jsp"/>
	<forward name="success" path="/index.jsp"/>
</action>
path:请求的URI路径。如用户请求login.do,该请求将对应此action
type:action对应的实现类,必须扩展自org.apache.struts.action.Action
name:action对应的formbean的名称
input:返回页面,当formbean使用了validate方法验证失败时跳转回input页面
parameter:配置请求参数,用于DispatchAction的请求分发
scope:请求范围,默认为session,用于Formbean的存储范围,可选值request
validate:默认为true,如果与之相关联的formbean存在validate方法时,该方法会被调用。设置为false时,validate方法不会被调用

forward元素
当Action处理结束之后,需要返回到页面进行显示,而这个返回的跳转操作就是通过ActionForward实现的,ActionForward的配置是在action元素标签内配置forward标签。它的常用属性有:
name:指定ActionForward的名称,同样用于其他组件的引用。比如,在Action中这样使用:
return mapping.findForward("succcess");
//success便是这个ActionForward的名称,通过名称查找返回一个ActionForward对象。
path:指定请求跳转的实际路径。
redirect:默认为false,设置为true时,将对请求进行重定向操作。

Struts应用技巧

1、LazyValidateForm
对于Formbean的繁琐配置,Struts提供了LazyValidateForm来取代formbean。配置示例:
<form-bean name="userForm" type="org.apache.struts.validator.LazyValidatorForm"/>
这样,就不必为用户表单创建UserForm类。在Action中使用示例:
LazyValidatorForm lazyForm = (LazyValidatorForm)form;
String name = (String)lazyForm.get("name");
但是,LazyValidatorForm继承自ValidatorForm,如果未设置validate="false"时,需要在struts-config.xml中添加验证插件。
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
	<set-property property="pathnames" value="/WEB-INF/validator-rules.xml"/>
</plug-in>

2、DispatchAction
DispatchAction是对Action的一个扩展应用。Action类仅提供了一个execute()方法实现单个业务,而DispatchAction允许在实现类中编写多个与业务相关的方法来响应一组请求动作。这样可以减少Action类的数量,并且把相关的业务方法整合在一起更便于维护。
使用DispatchAction的配置示例:
<action name="userForm" path="/user" parameter="method" type="com.boya.struts.web.UserAction">
	<forward name="fail" path="/login.jsp"/>
	<forward name="success" path="/index.jsp"/>
</action>
其中parameter="method"指定响应方法名的url参数名为method,即/user.do?method=login将调用public ActionForward login(...)函数。
public ActionForward unspecified(....) 函数可以指定不带method方法时的默认方法。

3、不走jsp,直接输出字符串,可用于Ajax调用
ActionForward execute(....){
	try {
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write(text);
	} catch(IOException e) {
		log.error(e);
	}
	return null;
}

Struts1防止重复提交机制
Sruts1提供了令牌(Token)机制,来防止重复提交。使用Token的流程及原理如下:
1、在进入编辑页面的action方法中保存令牌:
saveToken(request);
该方法会在session中保存一个随字符串作为Token令牌。
进入页面必须经过action的这个方法跳转(目的是执行saveToken方法),不能直接访问.jsp。
2、在页面使用Struts1的<html:form>标签进行表单提交
如果session中存在Token令牌,<html:form>标签会在form表单中生成一个Token隐藏域,值与session中的Token值一致。
页面form标签必须使用<html:form>标签,不能使用html的<form>,否则页面不会生成Token隐藏域
3、在action保存方法中验证Token,并重置Token
if (!isTokenValid(request)) {
	request.setAttribute("message", "重复提交!");
	System.out.println("重复提交!");
	return mapping.findForward("edit");
}
resetToken(request);
第一次提交,会对表单提交的Token与session中的Token进行比较验证,相等则通过验证,继续执行请求。不相等则视为重复提交。
验证完毕之后,执行resetToken(request),该方法会将session中的Token清除。
这样,重复提交请求时session中已经不存在Token,因此可以有效防止重复提交。

Token的完整使用示例下载: http://download.csdn.net/detail/boyazuo/5103731
使用Struts1.x实现的文件上传示例下载: http://download.csdn.net/detail/boyazuo/5103740
Struts1.x的验证框架使用示例,验证框架并不常用,提供一个示例仅作参考: http://download.csdn.net/detail/boyazuo/5103814

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值