Struts Html标签库

来源:互联网 发布:手机音频驱动软件 编辑:程序博客网 时间:2024/05/24 07:31

 1.<html:html>标签:

            <html:html>标签用于在网页开头生成HTML的<html>元素,它只有一个用于显示用户语言的lang属性: <html:html lang="true">
2.<html:base>标签
            <html:base>标签在网页的<head>部分生成HTML<base>元素。HTML<base>元素用于生成当前网页的绝对URL路径
3.<html:link>和<html:rewrite>标签
            <html:link>标签用于生成HTML<a>元素。<html:link>在创建超链接时,有两个优点:
            ● 允许在url中以多种方式包含请求参数。
            ● 当用户浏览关闭Cookie时,会重写url,把SessionId作为请求参数包含在URL中,用于跟踪用户的Session状态。
 
        <html:bace>标签有以下重要属性:
        ● forward :指定全局转发链接
        ● href:指定完整的URL链接
        ● page: 指定相对于当前网页的URL
 
        <html:rewrite>用于输出超链接中的URl部分,但它并不生成HTML<a>元素。 URL指的是URL中的协议,主机和端口以后的内容,URL用于指定具体的资源。例如:对于urlhttp://localhost:8080/htmltaglibs/HtmlBasic.do,它的url为/htmltaglibs/HtmlBasic.do。
 
以下用一些例子演示如何使用<html:link>和<html:rewrite>标签:
    1>.创建全局转发链接
首先在struts配置文件的<global-forwords>元素中定义一个<forward>元素:
<global-forwords>
     <forword name="index" path="/index.jsp">
</global-forwords>
接着在JSP文件中创建<html:link>标签:
<html:link forward="index">
     Link to Global ActionFoward
</html:link>
<html:link>中的forward属性和<global-forwords>元素中的<forward>子元素匹配。以上代码生成如下html内容:
<a href="/htmltaglibs/index.jsp">Link to Global ActionFoward</a>
    2>.创建具有完整URL的链接
如果web站点需要链接到其他站点,应该给出其他站点的完整URL,例如:
     Generate an "href" directly
</html:link>
以上代码生成:
    3>.从当前网页中创建相对URL
如果从一个网页链接到同一个应用中的另一个网页(相对地址跳转),可采用:
<html:link page="HtmlBasics.do">
     A relative link from this page
</html:link>
生成 HTML 代码如下:
<a href="htmltaglibs/HtmlBasics.do">A relative link from this page</a>
    4>.在url或url中包含请求参数
<html:link page="HtmlBasics.do?prop1=abc&prop2=123">
     Hard-code the url parameters
</html:link>
rewrite:<html:rewrite page="HtmlBasics.do?prop1=abc&prop2=123"/>
生成以下代码:
<a page="/htmltaglibs/HtmlBasics.do?prop1=abc&prop2=123">Hard-code the url parameters</a>
rewrite:/htmltaglibs/HtmlBasics.do?prop1=abc&prop2=123
 
4.<html:img>标签
1>.生成基本的HTML<img>元素
<html:img page="/struts-power.gif"/>
生成 html代码如下:
<img src="/htmltaglibs/struts-power.gif">
 
Html标签库中基本的表单标签:
        1.<html:form>标签
 <html:form action="FormBasic.do">
        生成html代码:
<form name="FormBasicAction" mothod="post" action="/htmltaglibs/FormBasic.do/">
        Struts将参照Struts配置文件来查找相应的Action组件,在struts-config.xml文件中,与"FormBasic.do"对应的代码为:
<action path="/FormBasic"
        type="htmltaglibs.actions.FormBasicAction"
        name="FormBacsicForm"
        scope="session"
        input="/FormBasic.jsp"
        validate="false">
        <foreard name="success" path="/FormBasic.jsp">
</action>
            2.<html:text>标签
在表单上创建HTML文本框字段。如下:
            <html:text property="userName">
        因为指定了一个userName的属性名,它应该匹配ActionForm 中的一个属性,所一在FormBasicForm 中也必须有uerName这个属性和相应的getter(),setter()方法。当表单提交时,struts框架会把userName字段的内容赋给form的userName属性。
            3.<html:cancel>标签
<html:cancel>标签在表单中生成取消按钮,当用户按下取消按钮使,将产生一个取消事件,这个事件由Action类来捕获,至于如何处理这个事件,可以在Action类的execute()方法中编程来完成。这里不再详细说明:
创建按钮:
        <html:cancel>Cancel</html:cancel>
        4.<html:reset>标签
<html:reset>标签生成表单的复位按钮,使用方法如下:
<html:reset></html:reset>
这个标签的用法很简单,它和html元素<input type="reset">在功能上相同。
        5.<html:submit>标签
<html:submit>Submit</html:submit>
        6.<html: hidden>标签
 
        在表单上生成隐藏字段,存放用户不希望看到和不允许修改的信息:如下两种方式:
一.<html:hidden property="userName">
生成Html:
<input type="hidden" name="userName" value="propValue">
二.添加了write属性
<html:hidden property="userName" write="true"/>
生成Html:
<input type="hidden" name="userName" value="propValue">propValue
 
 检查框和单选按钮标签:
下面就简单说一下在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:
 
Please select the file that you would lile to upload:


The file just uploaded was:
  • Name:aa.txt
  • Size:4bytes

 

 

要想实现上面的结果,请看下面的代码,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类型的属性对应。

原创粉丝点击