Struts HTML标记
熟悉掌握和使用struts功能丰富的各种标记不仅可以简化页面代码,创造更加纯洁的JSP页面程序,同时也可以大大强化程序员的编程能力。要使用HTML标记库必须先引入:
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
一、 基本的HTML标记
1 <html:html>标记
它在页面开始处和结尾处产生一个html标记。将html页面中的<html>改成<html:html>标记即可。
<html:html lang="true"></html:html>
在页面中生成的代码是:
<html:html lang="zh-CN"></html:html>
使用lang=”true”后,若没有session对象时,就根据Http请求中的local信息来输出相关的语言信息,而不再强制创建一个新的session。
2 <html:base>标记
用于在网页的head部分生成一个base标记。在head部分加入<html:base>标记即可。经过Web容器编译后,会生成如下代码:
<base href="http://localhost:8080/html/index.jsp">
也就是用户所查看网页的实际的URL地址。Base标记不会显式显示在网页上,只有通过html代码才可以看到。它更重要的功能是为此页面的所有其它链接提供相对位置。如:本页使用了<html:base>标记后,生成了如上的URL地址。若此时需要指定一张图片,只须使用相对的位置外国投资即可。假设html目录下有一个images目录,里面一张图片pic.jpg,则引用的代码如下:
<img src="images/pic.jpg">
3 <html:link>标记
用来生成html标记中的<a>标记,它带有多种参数,可以和struts框架结合生成多种不同形式的链接。
(1) 外部完整URL链接
<html:link href="http://www.hao123.com">外部完整URL链接</html:link>
编译后生成:
<a href="http://www.hao123.com">外部完整URL链接</a>
(2) 相对URL链接
只能链接本地网页。 <html:link page="/test.jsp">相对URL链接</html:link>
编译后生成:
<a href="/html/test.jsp">相对URL链接</a>
<html:link page="/test.do?testString=a+new+string&testInt=1000">带参数相对URL链接</html:link>
<action path="/test" type="org.apache.struts.actions.ForwardAction" parameter="/test.jsp"></action>
在另一张网页中显示的值是:
testString:a new string testInt:1000
(3) 全局转发URL链接
在struts的struts-config.xml文件中定义了<global-forward>全局转发变量,可以通过<html:link>来链接到全局转发的URL链接,使用forward属性。
<global-forwards>
<forward name="index" path="test.jsp"></forward>
</global-forwards>
<html:link forward="index">全局转发URL链接</html:link>
(4) 带有页面变量的URL链接
<%
String test1="testABC";
request.setAttribute("stringtest",test1);
%>
<html:link page="/test.do" paramId="testString" paramName="stringtest">带有页面变量的URL链接</html:link>
Test.jsp代码:
testString:<%=request.getParameter("testString") %>
如果需要传多个参数,可以使用<html:link>标记的name属性来实现。Name属性的值是一个java.util.HashMap类型的对象名称,第的每一个“键/值”对就是代表一对“参数名/参数值”,以下示例:
<%
HashMap map=new HashMap();
map.put("testString","testABC");
map.put("testInt",new Integer(10000));
request.setAttribute("map",map);
%>
<html:link page="/test.do" name="map">带有页面变量的URL链接</html:link>
编译后生成:
http://localhost:8080/html/test.do?testString=testABC&testInt=10000
Test.jsp代码:
testString:<%=request.getParameter("testString") %><br/>
testInt: <%=request.getParameter("testInt") %>
4 <html:rewrite>
用来输出链接中的URI.并非指向链接,而只是输出一个字符串。它的众多属性都和<html:link>一样。同样有<html:link>的上述用法。不同的是他把信息作为字符串显示在当前页面上了。
5 <html:img>标记
<html:img page="/images/image.jpg" />
编译后生成:
<img src="/html/images/image.jpg">
<html:image page="/images/image.jpg" >带图片按钮 </html:image>
<input type="image" name="" src="/html/images/image.jpg">
二、 表单相关标记
<form>元素中能够被定义的其他一般属性有:
属性
|
描述
|
Accesskey
|
定义访问输入字段的快捷键
|
Style
|
定义输入字段的样式
|
styleClass
|
定义输入字段的样式表类
|
Tabindex
|
输入字段的tab顺序
|
1 <html:form>标记
用来生成一个表单。
<html:form>标记属性如下:
属性
|
描述
|
Action
|
与表单相关的操作。在配置中,这个操作也用来标识与表单相关的ActionForm bean
|
Enctype
|
表单HTTP方法的编码类型
|
Focus
|
表单中需要初始化焦点的字段
|
Method
|
表单使用的HTTP方法
|
Name
|
与表单相关的ActionForm bean的名称。如果没有设置这个属性,bean的名称将会从配置信息中获得
|
Onreset
|
表单复位时的JavaScript事件句柄
|
Onsubmit
|
表单提交时的JavaScript事件句柄
|
Scope
|
搜索ActionForm bean的范围。如果没有设置,将从配置文件中获取
|
Style
|
使用的格式
|
styleClass
|
这个元素的格式表类
|
Type
|
ActionForm bean的完整名称。如果没有设置,将从配置文件获得
|
<html:form action="" method="" enctype="multipart/form=data"></html:form>
2 <html:text>标记
用来生成一个文本框。
<html:text property="name" value="请输入姓名"></html:text>
编译后生成:
<input type="text" name="name" value="请输入姓名">
属性
|
描述
|
Property
|
定义当表单被提交时送回到服务器的请求参数的名称,或用来确定文本元素当前值的bean的属性名称
|
Name
|
属性被查询的bean的名称,它决定了文本框和文本区的值。如果没有设置,将使用与这个内嵌表单相关的ActionForm的名称
|
Maxlength
|
能够输入的最大字符数
|
Size
|
文本框的大小(字符数)
|
3 <html:password>标记
用来生成密码框架。
<html:password property="pwd" value=""></html:password>
编译后生成:
<input type="password" name="pwd" value="">
属性
|
描述
|
maxlength
|
能够输入的最大字符数
|
Name
|
Bean的名称,它的属性将用来确定密码元素的当前值。如果没有设置,将使用与这个内嵌表单相关的ActionFrom bean的名称。
|
property
|
定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定密码元素当前值的bean属性的名称
|
redisplay
|
在显示这个字段时,如果相应的bean属性已经被设置了数据,这个属性决定了是否显示密码的内容
|
Size
|
字段的大小
|
4 <html:textarea>标记
用来生成文本域。
<html:textarea property="msg" rows="8" value=""></html:textarea>
编译后生成:
<textarea name="msg" rows="8"></textarea>
属性
|
描述
|
Rows
|
文本区的行数
|
Cols
|
文本区的列数
|
5 <html:hidden>标记
用来生成隐藏字段。<html:hidden>标记不一定需要被限定在一个表单内部来使用。
<html:hidden property="operate" value=""/>
编译后生成:
<input type="hidden" name="operate" value="">
若要输出这个隐藏值,可以将其中的write属性设为true.如下所示:
<html:hidden property="operate" value="admin" write="true"/>
编译后生成:
<input type="hidden" name="operate" value="admin">admin
属性
|
描述
|
Name
|
Bean的名称,其属性会被用来确定隐藏元素的当前值。如果没有设置,将使用与这个内嵌表单相关的ActionFrom bean的名称。
|
property
|
定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定隐藏元素当前值的bean属性的名称
|
Value
|
用来初始化隐藏输入元素的值
|
6 <html:submit>标记
用于生成一个”提交”按钮。
<html:submit property="ok" value="提交"></html:submit>
编译后生成:
<input type="submit" name="ok" value="提交">
7 <html:reset>标记
用于生成一个”重置”按钮。
<html:reset property="reset" value="重置"></html:reset>
编译后生成:
<input type="reset" name="reset" value="重置">
8 <html:cancel>标记
用于在页面上生成一个”取消”按钮。要深入后台,用一个Action对提交的数据做清理工作。
<html:cancel property="cancel" value="取消"></html:cancel>
编译后生成:
<input type="submit" name="cancel" value="取消" onclick="bCancel=true;">
另外一种使用方式:
<html:cancel property="org.apache.struts.actions.taglib.html.CANCEL" value="取消" onclick="bCancel=true;"></html:cancel>
编译后生成:
<input type="submit" name="org.apache.struts.actions.taglib.html.CANCEL" value="取消" onclick="bCancel=true;">
</html:form>
三、 页面选择相关标记
1 <html:checkbox>标记
用来生成复选框。
中国人<html:checkbox property="chk"/>
编译后生成:
中国人<input type="checkbox" name="chk" value="on" checked="checked">
注意:使用checked表示是否被选中。
重置代码:
publicvoid reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
this.setChk(false);
}
2 <html:multibox>标记
用来生成复选框。其实其功能与<html:checkbox>标记相同,所不同的是。在此复选框所在的ActionForm中使用一个数组表示该复选框。
<html:checkbox property="testStringArray" value="China">中国</html:checkbox><br/>
<html:checkbox property="testStringArray" value="USA">美国</html:checkbox><br/>
<html:checkbox property="testStringArray" value="England">英国</html:checkbox><br/>
<html:checkbox property="testStringArray" value="Germany">德国</html:checkbox><br/>
<html:checkbox property="testStringArray" value="France">法国</html:checkbox><br/>
编译后生成:
<input type="checkbox" name="testStringArray" value="China">中国<br/>
<input type="checkbox" name="testStringArray" value="USA">美国<br/>
<input type="checkbox" name="testStringArray" value="England">英国<br/>
<input type="checkbox" name="testStringArray" value="Germany">德国<br/>
<input type="checkbox" name="testStringArray" value="France">法国<br/>
提交表单后,testStringArray的值会变成{“China”,”USA”,”England”},这是由页在上的<html:mutilbox>标签的value属性传入的。
将ActionForm中的getter和setter方法改成如下,让其返回一个字符串数组。
private String[] testStringArray;
public String[] getTestStringArray() {
return testStringArray;
}
publicvoid setTestStringArray(String[] testStringArray) {
this.testStringArray = testStringArray;
将Action 中写入以下代码:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
MutilboxForm mutilboxForm = (MutilboxForm) form;
request.setAttribute("StringArray",mutilboxForm.getTestStringArray());
return mapping.findForward("mutilbox");
}
在jsp页面中取得值:
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<%
String[] StringArray=(String[])request.getAttribute("StringArray");
%>
<logic:iterate id="arrayValue" name="StringArray">
<bean:write name="arrayValue"/>
</logic:iterate>
3 <html:radio>标记
用于生成一个单选框。
属性
|
描述
|
Name
|
Bean的名称,其属性会被用来确定单选钮是否以选中的状态显示。如果没有设置,将使用与这个内嵌表单相关的ActionFrom bean的名称。
|
property
|
当表单被提交时送回到服务器的请求参数的名称,以及用来确定单选钮是否以被选中状态进行显示的bean属性的名称
|
Value
|
当单选钮被选中时返回到服务器的值
|
<html:radio property="sex" value="man" />男
<html:radio property="sex" value="girl"/>女
编译后生成:
<input type="radio" name="sex" value="man">男
<input type="radio" name="sex" value="girl">女
ActionForm代码如下:
publicvoid reset(ActionMapping mapping, HttpServletRequest request) {
this.setFlag(false);//设置为false
}
//取被选中的value的值
private String sex;
//复位
private Boolean flag;
public String getSex() {
returnsex;
}
publicvoid setSex(String sex) {
this.sex = sex;
}
public Boolean getFlag() {
returnflag;
}
publicvoid setFlag(Boolean flag) {
this.flag = flag;
}
4 <html:select>标记
用于在网页上产生选择列表。通常与<html:option>等选项标记连用。<html:select>的size属性表示同时显示的选项的数目,若size=1则同时显示一个选项.multiple属性为true时,则该选择列表可以多选。
属性
|
描述
|
multiple
|
表明这个选择控件是否允许进行多选
|
Name
|
Bean的名称,它的属性确定了哪个。如果没有设置,将使用与这个内嵌表单相关的ActionFrom bean的名称。
|
property
|
定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定哪个选项需要被选中的bean属性的名称
|
Size
|
能够同时显示的选项数目
|
Value
|
用来表明需要被选中的选项
|
<html:select property="country" size="2" multiple="true">
<html:option value="China">中国</html:option>
<html:option value="USA">美国</html:option>
<html:option value="Japan">日本</html:option>
</html:select>
若为多选。ActionForm的代码为:
publicvoid reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
private String[] country;
public String[] getCountry() {
return country;
}
publicvoid setCountry(String[] country) {
this.country = country;
}
Jsp页面代码:
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<%
String[] country=(String[])request.getAttribute("country");
%>
您选择的是:
<logic:iterate id="countryValue" name="country">
<bean:write name="countryValue"/>
</logic:iterate>
5 <html:option>标记
它是<html:select>所表示的下拉选择框中的选项。
属性
|
描述
|
collection
|
Bean集合的名称,这个集合存储在某个作用域的属性中。选项的数目与集合中元素的数目相同。Property属性能够定义选项值所使用的bean属性,而labelProperty属性定义选项标记所使用的bean的属性
|
labelName
|
用来指定存储于某个作用域的bean,这个bean是一个字符串的集合,能够定义<html:option>元素的标记(如果标志与值不相同)
|
labelProperty
|
与collection属性共同使用时,用来定义了存储于某个作用域的bean,这个bean将返回一个字符串集合,能够用来写入<html:option>元素的value属性
|
Name
|
如果这是唯一被指定的属性,它就定义了存储于某个作用域的bean,这个bean将返回一个字符串集合,能够用来写入<html:option>元素的value属性
|
property
|
这个属性在与collection属性共同使用时,定义了每个要显示选项值的独立bean的name属性。如果不是与collection属性共同使用,这个属性定义了由name属性指定的bean的属性名称(如果有name属性),或是定义了一个ActionForm bean,这个bean将返回一个集合来写入选项的值
|
6 <html:options>标记
用来表示一组选择项,也就是相当于一组的<html:option>标记。在一个<html:select>标记中可以包含多个<html:options>标记。
<%
ArrayList list=new ArrayList();
list.add(new org.apache.struts.util.LabelValueBean("中国","China"));
list.add(new org.apache.struts.util.LabelValueBean("美国","USA"));
list.add(new org.apache.struts.util.LabelValueBean("日本","Japan"));
pageContext.setAttribute("valuelist",list);
%>
<body>
<html:form action="/select">
国家 : <html:select property="country" multiple="true">
<html:options collection="valuelist" property="value" labelProperty="label"/>
</html:select>
<html:submit/><html:cancel/><html:reset/>
</html:form>
</body>
Collection:在页面上下文pageContext中指定了一个实现了List接口的对象。然后根据这个对像进行遍历,取出对象相应的值。
property:将遍历出的值value赋给property
labelProperty:将遍历出的label赋给labelProperty
7 <html:optionsCollection>标记
用来表示一组选择项,与<html:options>所不同的是,它不从pageContext中取出对象,而是从与表单相关联的ActionForm中取出同名的数组,并将该数组中的各个对象当作选项表示出来。
<html:select property="country" multiple="true">
<html:optionsCollection property="pagebean" label="name" value="value"/>
</html:select>
Property:指定ActionForm的数组属性
Label:页面上显示的值
Value:被传入ActionForm的值
四、 其它重要标记
1 <html:file>标记
用于上传文件。上传文件指的是从客户端将文件上传到服务器上,这一过程和通过表单提交请求到服务器并没有本质上的不同。在这一过程中有以下三点需要注意:
(1)文件存储于客户端的机器上,因此在服务器端不能使用获得文件路径的方式来获取文件对象。
(2)由于使用GET方式提交表单时,提交的字符串长度受到限制,所以,在上传文件时必须使用POST方式。
(3)上传文件操作所在的表单标记中必须将enctype属性设为mutipart/form-data。
属性
|
描述
|
Name
|
Bean的名称,它的属性将确定文件控件中显示的内容。如果没设置,将使用与内嵌表单相关的ActionForm bean的名称
|
property
|
这个属性定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定文件控件中显示内容的bean属性名称
|
Accept
|
服务器能够处理的内容类型集。它也将对客户浏览器对话框中的可选文件类型进行过滤
|
Value
|
按钮上的标记,这个按钮能够在本地文件系统中浏览文件
|
如下例子:
<%@ page language="java" pageEncoding="gb18030"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html>
<head>
<title>Sturts实现文件上传</title>
</head>
<body>
<html:form action="/upload" method="post" enctype="multipart/form-data">
<html:file property="file"></html:file>
<html:submit value="开始上传"/>
</html:form>
您上传的文件是:<bean:write name="uploadForm" property="filename" />
它的大小是:<bean:write name="uploadForm"property="size"/>
</body>
</html>
注意:
<bean:write>中的name对应uploadForm, proterty对应uploadForm中的finlename和size。
fileForm.java代码如下:
package cn.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
publicclass UploadForm extends ActionForm {
/**表示将要上传的文件*/
private FormFile file;
/**用于存放文件大小,以供页显示时使用*/
private String size;
/**用于存放文件名,以供页显示时使用*/
private String filename;
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors=new ActionErrors();
if(this.getFile().getFileName().length()==0){
errors.add("error", new ActionMessage("file.errors.null"));
mapping.findForward("index");
}
return errors;
}
publicvoid reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
public String getSize() {
returnsize;
}
publicvoid setSize(String size) {
this.size = size;
}
public String getFilename() {
returnfilename;
}
publicvoid setFilename(String filename) {
this.filename = filename;
}
public FormFile getFile() {
returnfile;
}
publicvoid setFile(FormFile file) {
this.file = file;
}
}
注意:
FromFile类是struts提供的专门用于文件上传的类。
ActionFrom中,FromFile类的对象file的名称要与网页上的<html:file>标记的property属性相对应。
fileAction.java代码如下:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {
UploadForm uploadForm = (UploadForm) form;// TODO Auto-generated method stub
//从UploadBean得到用户要上传的文件
FormFile file=uploadForm.getFile();
if(file==null){
return mapping.findForward("index");
}
int len= file.getFileSize()/(1024*1024);
System.out.println("len "+len );
if(len>2){
errors.add("error",new ActionMessage("file.errors.size"));
super.saveErrors(request, errors);
return mapping.findForward("index");
}
//获取相关文件信息
String filename=file.getFileName();
uploadForm.setFilename(filename);
String size=Integer.toString(file.getFileSize())+"Bytes";
uploadForm.setSize(size);
//获取文件输入流
InputStream is=file.getInputStream();
//获取文件在服务器上的存储路径
String store_path=servlet.getServletContext().getRealPath("/fileupload");
System.out.println("服务器端的文件存储路径是: "+store_path);
//获取文件输出流
OutputStream os=new FileOutputStream(store_path+"/"+filename);
//开始上传文件
int bytes=0;
byte[] buffer=newbyte[8192];
while((bytes=is.read(buffer,0,8192))!=-1){
os.write(buffer,0,bytes);
}
//关闭
os.close();
is.close();
file.destroy();
return mapping.findForward("index");
}
资源文件ApplicationResourse.properties如下:
errors.footer = </span>
errors.header = <spanstyle="color:red;">
file.errors.null = YourupLoadfilenotnull!
file.errors.size = YourupLoadfilesizenotthan2M
2 <html:errors>
用于在网页上输出错误信息。可以放在网页的任何位置。
错误信息是通过ActionForm中的validata()方法返回的ActionErrors对象,若ActionErrors返回为空。则验证通过。
<html:errors>标记能够与ActionErrors结合在一起来显示错误信息。这个标记首先要从当前区域的资源文件中读取消息关键字errors.header,然后显示消息的文本。接下去它会在ActionErrors对象(通常作为请求参数而存储在Action.ERROR_KEY关键字下)中循环,读取单个ActionError对象的消息关键字,从当前区域的资源文件中读取并格式化相应的消息,并且显示它们。然后它读取与errors.footer关键字相对应的消息并且显示出来。
通过定义property属性能够过滤要显示的消息,这个属性的值应该与ActionErrors对象中存储ActionError对象的关键字对应。属性如下:
属性
|
描述
|
Bundle
|
用于指定资源文件。(当用系统默认资源文件时,无需指定)。其默认值Acion.MESSAGE_KEY
|
Locale
|
表示会话作用域属性的名称,它存储着用户当前登录的区域信息。其默认值是Action.ERROR_KEY
|
Name
|
表示请求属性的名称,它存储着ActionErrors对象。其默认值是Action.ERROR_KEY
|
property
|
用于指定与ActionError对应的key值。默认的key是Globals.ERROR_KEY
|
例子:
<html:errors/>
显示集合中所有的错误。
<html:errors property=”missing.name”/>
显示存储在missing.name关键字的错误。
例子:
Jsp页面:
<%@ page language="java" pageEncoding="gb18030"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html>
<head>
<title>JSP for ErrForm form</title>
</head>
<body>
<html:form action="/error">
姓名(不用系统默认资源包): <html:text property="name"/><html:errors property="nameError" bundle="Custom"/><br/>
性别(用系统默认资源包):<html:text property="sex"/><html:errors property="sexError" /><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
ActionForm代码如下:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors=new ActionErrors();
if(this.getName().length()==0){
errors.add("nameError", new ActionMessage("errors.vaildata.name"));
mapping.findForward("input");
}
if(this.getSex().length()==0){
errors.add("sexError",new ActionMessage("errors.vaildata.sex"));
mapping.findForward("input");
}
return errors;
}
Struts-config.xml配置如下;
<message-resources parameter="cn.ApplicationResources" />
<message-resources parameter="cn.ApplicationCustomResources"key="Custom"/>
注意:
不带key属性的就是默认的资源包。
<html:Errors>的bundle属性值对应<message-resources>的bundle值。
资源文件ApplicationResources.properties如下:
errors.header=<spanstyle='color:red;'>
errors.footer=</span>
errors.vaildata.sex=sexisnotnull!
资源文件ApplicationCustomResources.properties如下:
errors.header=<spanstyle='color:green;'>
errors.footer=</span>
errors.vaildata.name=nameisnotnull!
3 <html:messages>标记
它与<html:errors>标记的功能十分相似。都是在网页上显示信息。但是<html:messages>的信息要通过<bean:write>才可以输出。
<html:messages>标记的三个关键属性
(1)name:它指定ActionMessages存放在request或session中的key, 默认的key是Globals.MESSAGE_KEY
(2)message:当为true时,则从request范围内取出所有key值为Globals.MESSAGE_KEY的ActionMessages对象。若为false则从request对象从检索ActionMessages对象,默认为false。
(3)id;用于指定从ActionMessages对象中检索出的ActionMessages对象,以便后面显示时可以引用它。