精通struts1.2(不断更新与完善中)
参考资料:《Struts1.x入门与提高系列教程.pdf》感谢著作者的贡献!
DynaActionForm与常规ActionForm的区别:
1、 在配置文件中配置
2、对属性的访问方式:与Map对象相似
3、属性类型为标准的Java类,即用包装类型取代原生类型,如用Integer代替int
<form-beans>
<form-bean name="" type="">
<form-property name="" type="" />
……
</form-bean>
……
</form-beans>
HTML标签库:
以Key为后缀的属性值就是属性文件的key
<html:link forward="">
forward指向配置文件中已经存在的forward
<global-forwards>
<forward name="" path="" />
</global-forwards>
<html:form action="" method="">
<html:text property=""/>
<html:radio property="" value=""/>
当ActionForm的子类对象的某个属性有多个可枚举的选择值时,可使用,value表示当前选项被选中后,提交到服务端的值。
<html:checkbox property="" value="">
对应一个值
<html:multibox property="" value="">
property所对应的属性是数组类型
<html:select property="">
<html:option value=""/>
……
</html:select>
<html:sumbit value=""/>
<html:reset value=""/>
Logic标签库:
<logic:parent name="">
<logic:iterate id="" name="">
</logic:iterate>
</logic:parent>
循环标签:<logic:iterate id="" name="" property="" indexId="" offset="" length="" scope="" />
条件处理标签:
Test:present,notPresent,empty,notEmpty,messagesPresent,messagesNotPresent
比较:equal,lessThan,lessEqual,greaterThan,greaterEqual
字符串匹配:match,notMatch
所有的条件处理标签都有name和property属性
流程控制标签:<logic:redirect><logic:forward>
解决ActionForm中文乱码:
有很多种,这里列举过滤器,记得在web.xml配置:
public EncodingFilter extends Filter
{
public void destroy(){}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException
{
request.setCharacterEncoding("GBK");
chain.doFilter(request,response);
}
public void init(FilterConfig filterConfig)throws ServletException{}
}
strut-config.xml配置文件:
action标签中的input属性:表示为通过验证后要跳转到的页面
message-resources标签:定义程序中所使用的属性文件,parameter属性表示属性文件的路径,后缀.properties可不加,“.”可用“/”或“‘’”代替。
解决属性文件中文乱码:
原因:Java在处理属性文件时,只能处理ISO 8859-1或UCS-2编码格式,若含有其他编码格式的字符,仍然会按ISO 8859-1或UCS-2编码格式来解释这些字符。
方法一:用native2ascii命令
<JDK安装目录>\bin\native2ascii
属性文件全名 属性文件全名(注:这种方式会覆盖旧文件)
属性文件全名 新属性文件全名(注:这种方式则不会)
方法二:用Eclipse插件
Properties Editor插件
JInto插件
Bean标签库:
优点:1、国际化,即能从属性文件中读取文本信息
2、避免直接使用Java代码获得存储在request和session对象的内容
<%@taglib uri="" prefix=""%>
uri属性值定位标签库的方式:直接或者用标签库的相对路径
一、获得HTTP请求信息
<bean:cookie id="" name="" value=""/>
<bean:header />
<bean:parameter />
若忽略value属性,则name属性说对应的对象不存在时,会抛出异常,通常要加上value属性;变量保存在page范围
二、访问Java对象
<bean:define id="" name="" property="" scope="" toScope="" />将Java对象的属性值保存在变量中
<bean:size id="" name="" />获得集合或数组的长度
三、访问JSP内嵌对象和Struts配置对象
<bean:page id="" property="" />
property属性值为JSP内嵌对象名(application,config,request,response,session)
<bean:struts id="" formBean=""|| mapping="" ||forward="" />
四、访问Web资源文件及属性文件
<bean:include id="" href="绝对路径" page="/开头的相对路径" forward="forward标签的name属性值,访问其所对应的path属性所指定的web资源文件"/>
<bean:resource id="" name="相对路径" input="指定时id变量为inputstream类型,反之则为String类型"/>
与<bean:include>的区别:访问Web资源时,不执行,保存原始内容到变量,而<bean:include>保存的是执行后的结果
<bean:message key="" bundle="" name="" property="" scope="" arg0~arg4="" />
不指定bundle时,使用默认属性文件,其值对应<message-resources>的key值;
五、用<bean:write>输出信息
<bean:write name="" property="" filter="" formate="" formateKey="" bundle="" scope="" />
上传单个文件:
<html:file property="" />
原理:通过property属性返回的FormField对象,获得InputStream对象。
FormField是一个接口,常用方法:
getInputStream()、getFileData()、getFieldName()、getFileSize()、destroy()
注意:
<html:form enctype="multipart/form-data"/>;
struts-config.xml中的<controller maxFileSize=""/>限制上传文件大小;
在web.xml中配置上传路径,获得上传路径的方法:
this.getServlet().getServletConfig().getInitParameter()
上传任意多个文件:
稍微复杂了点,涉及到DOM及JavaScript技术
Validator验证框架
安装:在struts-config.xml中添加 <plug-in className="org.apache.struts.validator.ValidatorPlugIn"><set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validator1.xml"/>
注意:使用Validator框架,Form类必须继承ValidatorForm,原因:Validator继承自ActionForm,重写了validate方法,故可不用在Form类中写该方法。
<form-validation>
<formset>
<form name="">
<field property="" depends="">
<msg name="" key=""/>
<arg name="" key="${}" position="" resource=""/>
<var>
<var-name></var-name>
<var-value></var-value>
</var>
</field>
</form>
</formset>
</form-validation>
验证嵌套属性:可用圆点符号来访问
验证索引属性:<field indexedListProperty="" depends="">
两者配合使用:<field indexedListProperty="" property="" depends="">
全局常量:放在第一个<formset>前面
<global>
<constant>
<constant-name></constant-name>
<constant-value></constant-value>
</constant>
</global>
<formset></formset>(第一个formset)
局部常量:放在formset的开始位置
<formset>
<constant>
<constant-name></constant-name>
<constant-value></constant-value>
</constant>
<form></form>
</formset>
客户端验证:
在JSP页面除了<%%><%-- --%>外的任意位置添加<html:javascipt formName=""/>,在<html:form>添加onsumbit="return validate首字母大写的Form名(this)"
*this*表示当前属性的值
国际化
客户端编码:
对于JSP页面:<%page contentType="text/html;charset=UTF-8"%>
对于静态页面(如html):在<head>添加<meta http-equiv="content-type" content="text/html;charset=UTF-8">
也可在struts-config.xml添加<controller contentType="text/html;charset=UTF-8" />,那样所有通过.do或<forward>访问的页面都会继承该编码设置
多语言支持涉及到的知识点:
java.util.Locate,一个Locate类的对象实例代表一种语言
session.setAttribute("org.apache.struts.action.LOCALE",new java.util.Locate(""))
setLocale(request,new java.util.Locale("zh","TW");第一个参数zh表示语言,第二个表示地区,不区分大小写
所有经过<forward>或.do的程序都会继承setLocale方法设置后的语言,除了<action>的forward和input属性所指的页面。
动态Form
属性类型:简单属性、索引属性、映射属性、嵌套属性
注意:使用动态Form,就无法使用泛型进行自动类型转换
DynaActionForm获取属性的方法:
public Object get(String name)//读取简单属性
public Object get(String name,int index)//索引属性
public Object get(String name,String key)//映射属性
public String getString(String name)
public String[] getStrings(String name)
DownloadAction
LocaleAction:是一个final动作类
IncludeAction
ForwardAction
EventDispatchAction