引用:
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" profix="html"%>
jsp页面使用
<html:html> 生成一个<html>元素
<html:base> 生成一个<base>元素
<html:base href="<%-basePath%>"生成当前页面的绝对路径,意义不大
<html:link> 生成一个<a>元素
<a href="/loginform/login.do">login</a>
由struts-config.xml中的全局转发创建链接
<global-forwards>
<forwards name="index" path="/index.jsp"/>
</global-forwards>
在jsp页面创建链接
<html:link forwards="index">
Link to ActionForward
</html-link>
在url全路径创建链接:提供全路径
<html:link href="http://www.baidu.com">
Link to baidu
</html-link>
由当前页面的相对路径创建链接
<html-link page="/HtmlBasic.do">
Link to page
</html-link>
<html:rewrite>标签<html-link>URI部分
<html:img>生成一个<img>元素
<html:form>生成一个<form> 元素
jsp页面创建form属性
<html:form action="/register">
</html:form>
Formbean里面添加类ClientForm
struts-config里面配置文件
<form-beans >
<form-bean name="clientForm" type="com.amaker.struts.form.ClientForm" />
</form-beans>
<html:text>生成一个文本的Input元素
username<html:text property="username"/><br/>
Formbean里面Form类添加属性:username
<html:hidden>生成一个文本的Input元素
<html:hidden property="userid"/>
Formbean里面Form类添加属性:userid
<html:submit>生成一个文本的Input元素
<html:submit value="提交"/>
<html:cancel>生成一个文本的Input元素
<html:cancel value="取消"/>
<html:reset>生成一个文本的Input元素
<html:reset value="重置">
<html:checkbox>生成一个有单选左右的按钮,比如协议是否同意的时候选择
jsp页面创建
ispay:<html:checkbox property="pay"/>
Formbean里面Form类添加属性:
private String pay
打钩: on
不打勾: 什么都没有
了解,用的不多
<html:multibox>生成一个多选按钮
jsp页面
hobby<html:multibox property="hobby" value="1">reading<br/>
<html:multibox property="hobby" value="2">swing
Formbean里面Form类添加属性:
private String[] hobby
<html:radio>生成一个有单选按钮
jsp页面
gender:<html:multibox property="gender" value="female"/>female<br/>
<html:multibox property="gender" value="man"/>man
Formbean里面Form类添加属性:
private String gender
<html:select>生成一个下拉列表
在jsp页面
<html:select property="position">
<html:option value="1">CEO<html:option>
<html:option value="2">CFO<html:option>
<html:option value="3">PM<html:option>
Formbean里面Form类添加属性:
private String position
从数据库获得值生成响应标签
FormBean里面有Position(String id,String name)
jsp的<head>里面测试,实际应该从数据库里拿到list,在action里面赋值
顶部
<%@ language="java" import="com.amaker.bean.*,java.util.*"%>
head里面——<%
Link list=new ArrayList();
for(int i=0;i<10;i++){
Position posi=new Position(i,"position"+i);
list.add(posi);
}
request.setAttribute("PL",list);
%>
jsp的<body>里面
<html:options collection="PL" property="id" labelProperty="name"/>
id对应formbean里面position表单的id,name对应的值
<html:errors>
jsp页面
<html:errors property="username"/>
手动验证:
FormBean的类里面继承ActionForm,需要重写一个 validate方法,只有这个方法通过,才可以执行Action,大部分时间写在这里
顺序:
先xml里面的*.do,找到struts-config.xml里面的path跳转路径,然后执行name的FromBean获得值,
获得值之后验证信息,最后执行Action
public ActionErrors validate(...){
ActionErrors errors=new ActionErrors();
if(username==null||username.trim().equals("")){
errors.add("username",new ActionMessage("login.username"));
//"username"标签,响应jsp里面的错误标签 login.username在资源配置文件中的提示错误信息
return errors;
}
return null;
}
return errors 返回struts-config里面的input路径
如果在Action里面做验证,如果错误需要 返回:mapping.getInputforward();
自动验证:
1 添加struts后项目内需要添加2个jar包:commos-validator.jar 和 jakarta-oro.jar
2 添加2个xml配置文件: validation.xml 和validator-rules.xml
validation.xml可以去structs里面的apps/struts-blank-1.3.8\WEB-INF下面找模板,如果模板里面有<formset>"另"一个列子,则删除,否则可能会报错
3 在Struct-config.xml配置文件中加载自动验证工具类和配置文件,这段话在validator-rules.xml里面有:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
4 formBean要继承ValidatorForm
5 在validation中声明验证
6 调用
在ApplicationResources.properties配置文件里:
errors.minlength={0} can not be less than {1} characters.
login.username=Username
validation.xml
<formset>
<form name="loginForm"> //name是struts-config.xml里面<form-bean>的name
<field property="username" depends="required,maxlength">
<arg key="loginForm.username" position="0"/>
<arg name="maxlength" key="${var:maxlength}" resource="false" position="1"/>
<var>
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
<field property="age" depends="required,intRange">
<arg key="loginForm.username" position="0"/>
<arg name="intRange" key="${var:minlength}" resource="false" position="1"/>
<arg name="intRange" key="${var:manlength}" resource="false" position="2"/>
<var>
<var-name>mixlength</var-name>
<var-value>1</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>150</var-value>
</var>
</field>
</form>
</formset>
name:验证FormBean名称,struts-config里面定义的名称
property:验证FormBean的属性
depends:验证规则的逻辑名称
key:验证提示信息
resource:
true:来自资源文件
false:直接设置
var:为变量传递参数
loginForm需要继承 ValidatorForm
validator:
required,minlength,maxlength,mask:正则表达式,byte,short,integer,long,float,double,date,
intRange,floatRange,doubleRange,creditCard,email,url
自定义验证:验证两个字段是否相同
配置文件:
<field property="password" depends="required,twofields">
<arg key="memberRegisterForm.password" position="0"/>
<arg name="twofields" key="memberRegisterForm.password2" position="1"/>
<var>
<var-name>secondProperty</var-name>
<var-value>password2</var-value>
</var>
</field>
写一个类:
public static boolean validateTwoFields(Object bean,ValidatorAction va,Field field,ActionMessages errors,HttpServletRequest request){
String value=ValidatorUtils.getValueAsString(bean,field.getProperty());
String property2=field.getVarValue("secondProperty");
String value2=ValidatorUtils.getValueAsString(bean,property2);
if(!GenericValidatior.isBlankOrNull(value)){
try{
if(!value.equals(value2)){
errors.add(field.getKey(),Resources.getActionMessage(request,va,field));
return false;
}
}catch(Exception e){
errors.add(field.getKey(),Resources.getActionMessage(request,va,field));
return false;
}
}
return true;
}
File
<html:file>生成一个<input type=file>元素来支持文件上传
Jsp页面,必须是enctype="multipart/form-data",一个字都不能差
<html:form action="HtmlFile.do" enctype="multipart/form-data">
File:<html:file property="file"/>
</html:form>
Formbean里面Form类添加属性
private FormFile file;
eg:
FormFile file=uploadForm.getFile();
InputStream in=file.getInputStream();
String fileName=file.getFileName();
int size=file.getFileSize();
//得到真实路径
String path=super.servlet.getServletContext().getRealPath("/upload");
OutputStream out=new FileOutputStream(path+"\\"+fileName);
byte[] buf=new byte[size];
in.read(buf);
out.write(buf);
in.close();
out.close();
解决验证信息中的中文乱码问题
创建build.xml文件
调用native2ascii.exe进行转码
代码:
<project>
<target name="i18n">
<native2ascii dest="com/amaker/struts" src="com/amaker/struts/temp" encoding="UTF-8" includes="ApplicationResources*.properties"/>
</target>
</project>