检查框和单选按钮标签:
下面就简单说一下在HTML表单上生成检查框和单选按钮的标签,这些标签必须嵌套在<html:form>标签中:
1.<html:checkbox>标签
<html:checkbox>标签在表单上生成标准的HTML检查框,例如ActionForm Bean 中的某个属性只有两种可选值(如true和false),就可以在表单中用<html:checkbox>标签来表示。<html:checkbox>的使用方法为:
<html:checkbox property="ch1"/>
生成HTML代码:
<input type="checkbox" name="cb1" value="true">
a.jap包含两个<html:checkbox>标签,它们分别和AForm Bean中的ch1和ch2属性关联。在Bean中,ch1和ch2属性必须定义为boolean类型
<html:checkbox>有一个value属性,用来设置用户选中检查框时的值,value的默认值为true,可以用以下方式改变value属性:
<html:checkbox property="ch1" value="true"/>
以上代码说明当用户选择了这个检查框,就把相应Bean中的ch1属性设置为true.
其实这样也会容易让人搞混,例如当value="false"时,如果用户没有选择这个检查框,就把Bean中对应的属性设置为true.
为了检查框能正常工作,必须在Bean的reset()方法中对其进行复位,当<html:checkbox>的 value属性为true时,必须在reset()方法中把对应的属性设置为false.当<html:checkbox>的 value属性为false时,必须在reset()方法中把对应的属性设置为true.
以下演示一下ch1属性复位:
this.setCh1(false);
//Note:With checkbox2 nerver reset here,it won't ever appear "unset"
//this.setCh2(false)
以上reset()方法没有复位ch2的值,在这种情况下,会导致ch2无法正常工作。一旦用户选择了ch2,以后ch2将永远为选中状态,即使用户取消了选择,ch2的值仍然为true,如图:
首次
ch1=false
选中ch1和ch2
ch1=true
取消选中ch1和
ch1=false
● →
→
→
访问
ch2=false
后提交表单
ch2=true
ch2后提交表单
ch2=true
ch1和ch2的状态图
2.<html:multibox>标签
<html:multibox>标签和<html:checkbox>一样,可以提供html<input type="ch1">元素,区别在于<html:multibox>可以生成复选框,它和Form 的关联方式不一样。
如果应用中有多个CheckBox,并且希望在Form中用单个数组来表示它们,就可以采用<html:multibox>.<html:multibox>的使用方法如下:
1>.在Form中定义一个数组,来存放所有的 CheckBox的值:
private String strArray[]=new String[0];
public String[] getStrArray(){return (this.strArray);}
public void setStrArray(String strArray[]){this.strArray=strArray;}
2>.其次在表单中加入<html:multibox>元素,通过设置property="strArray"来把它和Form中的数组关联。
3>.对于每个<html:multibox>元素,设置它的初始值,有以下两种方式:
<html:multibox property="strArray" value="Value1"/>
或
<html:multibox property="strArray">Value2</html:multibox>
当用户提交表单时,所有被选中的复选框的值都会被存放在Form中的相应数组中。如果某个复选框没有被选中,那么数组就不会包含它的值,例如,如果用户选择了上例的两个复选框,那么数组的内容为{"Value1","Value2"}.
3.<html:radio>标签
<html:radio>标签提供HTML<input type="radio">元素,表示单选按钮,多个<html:radio>标签可以成组使用,如下:
<html:radio property="r1" value="v1"/>
<html:radio property="r1" value="v2"/>
以上标签的property属性相同,而仅仅是value不同,它们都和Form中的V1属性对应,生成的HTML如下:
<input type="radio" name="r1" value="v1">
<input type="radio" name="r1" value="v2">
1.<html:select>标签
<html:select>标签生成HTML<select>元素。它可以在表单上创建下拉列表或多选列表。在<html:select>标签中可以包含多个<html:option>,<html:options>和<html:optionCollection>标签。<html:select>标签的基本形式为:
<html:select property="name" multiple="true" size="6">
[1ormore<html:option/>,<html:options/>,<html:optionsCollection/>tags]
</html:select>
<html:select>标签有以下重要属性:
▲size属性:指每次在网页上显示的可选项的数目。
▲multiple属性:指定是否支持多项选择,如果设置为true,就表示多选列表,支持多项选择;否则表示下拉列表,只支持单项选择,默认为false.
▲property属性:与ActionForm Bean中的对应属性对应,这个属性用来存放用户在列表上选中选项的值,在单选的情况下,Bean中的对应属性应该定义为简单类型(不能为数组)。在多项选择的情况下,Bean中的对应属性应该定义为数组类型,以便存放用户选择的多个选项。
例如:在 cust.jsp中的客户列表为下拉列表,颜色列表为多选列表:
<html:select property="custId"/>
<html:select property="colors" multiple="true" size="6"/>
对应的Bean为:
private int custId;
private String colors[];
public String[] getColors() {
return colors;
}
public void setColors(String[] colors) {
this.colors = colors;
}
public int getCustId() {
return custId;
}
public void setCustId(int custId) {
this.custId = custId;
}
2.<html:option>标签
<html:option>标签生成HTML<option>元素,这个标签被嵌套在<html:select>标签中,代表列表的一个可选项,它的label有两个来源:
▲ 在<html:option>和</html:option>之间的文本内容。
▲ 由<html:option>标签的key,locale和bundle属性指定的Resource Bundle中的内容。
例如:
<html:select property="colors" size="6" multiple="true">
<!--在<html:option>和</html:option>之间的文本内容-->
<html:option value="a.orange">Orange</html:option>
<html:option value="a.purple">Purple</html:option>
<!--由<html:option>标签的key,locale和bundle属性指定的Resource Bundle中的内容-->
<html:option value="a.red"
bundle="a.Colors"key="a.red"></html:option>
<html:option value="a.blue" bundle="a.Colors"
key="a.blue"></html:option>
</html:select>
3.<html:options>标签
<html:options>标签提供一组HTML<option>元素。在<html:select>中可以包含多个<html:options>元素,如下:
<html:select property="colors" size="6" multiple="true">
.......
<html:options collection="colorCollection" property="value"
labelProperty="label"/>
</html:select>
当然在这个jsp页面之前还定义了colorCollection集合,被存放在page范围中:
<%
Vector colorCollection=new Vector();
colorCollection.add(new org.apache.struts.util.LabelValueBean
("Pink","a.pink"));
colorCollection.add(new org.apache.struts.util.LabelValueBean
("Brown","a.brown"));
pageContext.setAttribute("colorCollection",colorCollection);
%>
4.<html:optionCollection>标签
在<html:select>元素中可包含多个<html:optionCollection>元素:如下是包含一个<html:optionCollection>标签:
<html:select property="custId">
<html:optionsCollection property="customers" label="name"
value="custId"/>
</html:select>
以下为Form类中定义customers属性的代码:
private CustomerBean customers[];
public CustomerBean[] getCustomers() {
return customers;
}
public void setCustomers(CustomerBean[] customers) {
this.customers = customers;
}
以下为CustomerBean中定义name和custId属性的代码:
private int custId;
private String name;
private String[] favColors=new String[0];
public CustomerBean(){
}
public int getCustId() {
return custId;
}
public void setCustId(int custId) {
this.custId = custId;
}
public String[] getFavColors() {
return favColors;
}
public void setFavColors(String[] favColors) {
this.favColors = favColors;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
在表单中上传文件标签:
看一下下面这个例子我想你就会用了,非常easy:
The file just uploaded was:
要想实现上面的结果,请看下面的代码,HtmlFile.jsp的代码:
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<html:html locale="true">
<body>
<html:form action="htmlFile.do" enctype="multipart/form-data">
Please select the file that you would lile to upload:<br/>
<html:file property="file"/><br/><br/>
<html:submit></html:submit>
</html:form>
<logic:notEmpty name="htmlFileForm" property="fname">
The file just uploaded was:<p>
<ul>
<li>Name:<bean:write name="htmlFileForm" property="fname"/></li>
<li>Size:<bean:write name="htmlFileForm" property="size"/></li>
</ul>
</logic:notEmpty>
</body>
</html:html>
与HtmlFile.jsp网页上对应的ActionForm为HtmlFileForm bean,如下为HtmlFileForm.java的源程序:
package com.lcf.struts.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;
public class HtmlFileForm extends ActionForm {
private String fname;
private String size;
private FormFile file;
public FormFile getFile() {
return file;
}
public void setFile(FormFile file) {
this.file = file;
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return null;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
}
具体的文件上传操作由HtmlFileAction来完成,如下为源代码:
package com.lcf.struts.action;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
import org.omg.CORBA_2_3.portable.OutputStream;
import com.lcf.struts.form.HtmlFileForm;
public class HtmlFileAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
String dir=servlet.getServletContext().getRealPath("/upload");
HtmlFileForm htmlFileForm = (HtmlFileForm) form;
FormFile ff=htmlFileForm.getFile();
if(ff==null){
return mapping.findForward("ok");
}
String fname=ff.getFileName();
String size=Integer.toString(ff.getFileSize())+"bytes";
try {
InputStream streanIn=ff.getInputStream();
FileOutputStream streamOut=new FileOutputStream(dir+"/"+fname);
int bytesRead=0;
byte[] buffer=new byte[8192];
while((bytesRead=streanIn.read(buffer,0,8192))!=-1){
streamOut.write(buffer,0,bytesRead);
}
streanIn.close();
streamOut.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
htmlFileForm.setFname(fname);
htmlFileForm.setSize(size);
ff.destroy();
return mapping.findForward("ok");
}
}
当然了在做的同时还要注意以下几点,否则就会出问题了:
1.<html:file>标签必须嵌套在<html:form>标签中。
2.<html:from>标签的method属性必须设置为"POST".
3.<html:from>标签的编码类型enctype属性必须为"multipart/form-data".
4.<html:file>标签必须设置为property属性,这个属性和Bean中FormFile类型的属性对应。