下表列出了Struts中用到的lib包及其用途
包名称 | 用途 |
Common-beanutils.jar | 简单易用的 Java 反射和内省 API 包装器 |
Commons-collections.jar | 一组用于扩展和增强 Java Collections Framework 的类 |
Commons-digester.jar | 通常用于分析 XML 配置文件的 XML 到 Java 对象映射实用程序 |
Commons-lang.jar | 一组公用实用程序类,可以为 java.lang 中的类提供附加功能 |
Commons-logging.jar | 各种日志 API 实现的包装器 |
Commons-fileupload.jar | 一个处理文件上传的包 |
Commons-validator.jar | 用于定义 XML 文件中的验证类(验证方法)和验证规则的可扩展框架 |
Jakarta-oro.jar | 一组文本处理 Java 类,可以提供兼容 Perl 5 的正则表达式 |
Struts.jar | Struts MVC框架包 |
WEB-INF/下的 后缀名为.tld的文件(标签库描述文件)
struts-bean.tld:
struts-html.tld:
struts-logic.tld: logic标签的描述的文件,logic标签用于管理对输出内容条件判断,从一个集合对象中循环取出内容等以及应用程序的流程管理
struts-nested.tld: nested标签的描述文件,又称嵌套标签,使用嵌套属性可以自由的访问任一层的bean属性
struts-template.tld: 这个template标签库的描述文件,对于共享通用格式的页面创建动态JSP模版是有用的,一般我们不用
struts-tiles.tld: tiles标签的描述文件,只有我们在工程中加入了titles组件时才会用到,titles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。它允许先创建模板,然后在运行时动态地将内容插入到模板中。
在我们的web工程中如何引入struts框架呢
在工程中引入struts框架要这么几个步骤
1.将以上所述的 .jar文件和需要的.tld文件分别放在lib目录和WEB-INF/目录下
2.在web.xml文件中添加
3.在web.xml文件中添加要用到的taglib描述文件,例如:
<%@ taglib uri="struts-bean.tld" prefix="bean" %>
<%@ taglib uri="struts-html.tld" prefix="html" %>
<%@ taglib uri="struts-logic.tld" prefix="logic" %>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
可以看出web版本是2.4版本,在2.4版本中允许不在web.xml中配置taglib描述文件
而直接在页面上引用,
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
其中的uri指向本地taglib描述文件的路径即可,但是在web2.3版本中必须在web.xml文件中配置
4.WEB-INF/struts-cofig.xml配置文件中的struts配置版本必须和lib包中struts版本保持一致
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
5.如果工程中要用到validator验证,还用在struts-config.xml文件中加入validator插件
<set-property
所有的action from和acton都配在一个struct-config.xml文件中这样的话,这个struts-config文件岂不是变得很大,难以维护
那么在工程中我们如何配置多个struts配置文件呢?
修改web.xml文件中关于struts配置部分
<param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-user.xml</param-value>
</init-param>
<init-param>
</init-param>
参考上面的配置即可,而在我们平时的开发过程中,(JBuilder开发环境中),要在webmodule下的Deployment description目录中右键单击在属性中将所有struts的配置文件全部添加进来,这样就可以了
在用Jbuilder开发的过程中经常碰到strust1.1和struts1.2版本不一致造成的异常,那么struts1.1和struts1.2版本之间到底有哪些区别呢?
Struts是1.1版本,这样struts-config.xml文件中的指示的版本不一致就会出错,
推荐在用Jbuilder2006开发工程时采用struts1.2版本,免得造成不必要的麻烦
1.1和1.2之间的区别在于错误信息的处理方式上
页面部分显示错误信息1.1中用
<html:errors>
而在1.2中
在页面上显示错误信息
<html:messages id="message" message="true">
</html:messages>
其他的区别暂时还没有发现
我要写一个只有两三个属性的ActionForm,可是觉得又不值,还有什么别的办法吗?
像这种情况我们可以写一个动态的ActionForm继承自
org.apache.struts.action.DynaActionForm在struts-config文件中直接配置: 如下所示
</form-bean>
然后我们就可以利用这个名为categoryForm的ActionForm了
我现在要用Struts进行服务器端效验,我该怎么作?
1.在继承自org.apache.struts.action. ActionForm的自定义的ActionForm中覆写validate方法
在这个方法中写入我们的验证代码
2.在struts-config文件将要进行效验的action元素的validator属性设为true
二 采用validator插件
1.首先确保struts-config.xml文件中已经进行了Validator插件的配置
</plug-in>
2.所要验证的ActionForm必须继承自org.apache.struts.validator.ValidatorForm
3.在struts-config文件将要进行效验的action元素的validator属性设为true
4.在validations.xml文件中指明要进行验证的字段
如果即在Form Beans中重载了validate方法,又启用了Validate框架,那会是什么效果呢?
由于要启用Validate框架,Form Beans需要继承ValidatorForm,查看ValidatorForm的源代码,发现validate方法已经作了处理(真是为Validate框架所服务的)。
那么在Form Beans中重载了validate方法的话,就会覆盖原有ValidatorForm中对应的功能,所以如果想一起用的话,需要在Form Beans的validate方法中调用errors = super.validate(mapping, request);这句代码是启用Validate框架所要做的工作,然后可以判断errors再作下一步的处理。
当然也可以先做Form Beans中的validate方法,然后启用Validate框架,要看具体情况而定
Form Beans可以被多个Action应用,有的Aaction中需要验证,我该怎么作?
Form Beans可以被多个Action应用,而每个Action可能需要的验证字段都不一样。而在validation.xml中配置的验证方式(如<form name="userForm">)是对这个Form Beans进行的。这样的话,如何来验证呢?
你的Form Beans可以继承org.apache.struts.validator.ValidatorActionForm(当然可以直接配置DynaValidatorActionForm)
struts-config文件配置如下:
<action-mappings>
</action-mappings>
validation.xml文件配置如下:
<formset>
</formset>
这里说明一点
其中key=" prompt.city "和key=" prompt.state "需要在资源文件中配置,而如果配置成
例如:<arg key="prompt.city " resource="false"/>
如果多了resource="false"这句话,那么它不会再从资源文件中去取,而是直接用key值来表示
Struts中如何防止重复提交?
在做新增和修改时,一般我们在保存成功后,转向list页面,这时在action中的return mapping.findForward(“list”) 中的list在struts-cofig.xml文件中要指定redirect=true
如果要在request保存返回信息,而不能用redirect=true时,我们可以采用Struts的Token(令牌)机制能够很好的解决表单的重复提交问题:
<inpu
这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的
现在我们点击提交按钮到action中的insert()方法,在insert()方法中我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
Struts中如何实现跨页面提交?