Struts 1 之标签库

<html:html>标签

<html:html>标签用于在网页开头生成HTML的<html>元素,它只有一个用于显示用户语言的lang属性: <html:html lang="true">

有时候由于tld文件的版本问题(新的版本将locale改为lang),导致在访问该页面时会报如下错误:

Unable to findsetter method for attribute: lang

即没有找到这个<html:html  lang="true">标签的lang属性

解决方案:

<html:html lang="true" >

改为

<html:html locale="true">

或删除(依据情况)

<html:html locale="true">
      <head><title>Welcome</title></head>
      <body>Hello World!</body>
</html:html>

生成

<html lang="en">
      <head><title>Welcome</title></head>
      <body>Hello World!</body>
</html>

注意,<html:html locale=“true”>中的locale属性在生成的HTML页面中被转换成了lang=“en”。生成的结果取决于Struts应用程序所位于的服务器的locale。如果你将应用程序部署到一个不同locale的服务器,你不需要改变代码。Locale会自动调整

<html:base>标签

<html:base>标签在网页的<head>部分生成HTML<base>元素。HTML<base>元素用于生成当前网页的绝对URL路径。

如果在网页中使用了<html:base>标签,当该网页引用同一个应用的其他网页时,只需给出相对于当前网页的相对URL路径即可。

<html:link>和<html:rewrite>标签

<html:link>标签用于生成HTML <a> 元素。<html:link> 在创建超链接时,有两个优点:

(1) 允许在URL 中以多种方式包含请求参数。

(2) 当用户浏览器关闭Cookie时,会自动重写URL,把SessionID 作为请求参数包含在URL 中,用于跟踪用户的Session 状态。

<html:link>标签有以下重要属性:

(1) forward:指定全局转发链接。

(2) href:指定完整的URL 键接。

(3) page:指定相对于当前网页的URL。

<html:rewrite>用于输出超链接中的URI部分,但它并不生成HTML<a> 元素。URI指的是URL 中协议、主机和端口以后的内容。URI 用于指定具体的请求资源。例如,对于URL:HTTP://localhost:8080/HtmlBasic.do,它的URI为/HtmlBasic.do

html:rewriter避免了硬编码,即便是把web.xml中的action映射路径*.do改为其他的,用了这个标签可以自动生产正确路径这个是其他JSTL标签所做不到的,常用在form表单的action属性里,如

<form action="<html:rewriter action="/register"/>“ method="post">

示例:

1、创建全局转发链接

首先,在Struts-config.xml中<global-forwards> 元素中定义一个<forward>元素:

    <global-forwards>
        <forward name = "index"path="/index.jsp"/>
    </global-forwards>

接着,在JSP 文件中创建<html:link>标签:

<html:link forward="index">
        Link to Global ActionForward
</html:link>

<html:link> 标签的forward 属性和<global-forwards>元素中的<forward> 子元素匹配。以上代码生成如下HTML 内容:

<a href="/index.jsp">Linkto Global ActionFoward</a>

值得注意的是,<html:link>的forward 属性只引用Struts-config.xml 配置文件中<global-forwards>内的<forward> 子元素,如果引用<action>内的<forward> 子元素,在运行时将会抛出异常:

Cannot create rewrite URL:Java.Net.MalfomedURlException: Cannot retrieve ActionForward

2、创建具有完整URL 的链接

如果Web 应用需要链接到其他站点,应该给出其他站点完整URL,例如:

<html:link href="http://jakarta.apache.org/struts/index.html">
        Generate an "href" directly
</html:link>

生成HTML 代码如下:

<a href="http://jakarta.apache.org/struts/index.html">Generate an"href" directly</a>

值得注意的是,如果指定了<html:link>标签的href 属性,即使用户浏览器的Cookie 关闭,<html:link> 标签也不会把用户SessionID 作为请求参数加和到URL 中。

3、从当前网页中创建相对URL

如果从一个网页链接到同一个应用中的另一网页,可以采用以下方式:

<html:link page="/HtmlBasic.do">
        A relative link from this page
</html:link>

<html:link> 标签的 page 属性用于指定相对于当前应用的URI。以上代码生成如下HTML 内容:

<a href="/lib/HtmlBasic.do">......</a>

4、在URL 或 URI 中包含请求参数

如果要在URL或URI 中包含请求参数,只要把请求参数加在URL 或 URI的末尾就可以了。例如:

    <html:link page="/HtmlBasic.do?prop1=abc&prop2=123">
        Hard-code the url parameters
    </html:link>
    <!-- or -->
    <html:rewrite page="/HtmlBasic.do?prop1=abc&prop2=123"/>

以上代码生成如下HTML 内容:(如果不带“/”,则不会附带上contextPath)

 <a href=/lib/HtmlBasic.do?prop1=abc&prop2=123">......</a>

rewrite: /HtmlBasic.do?prop1=abc&amp;prop2=123

提示:在HTML 中&amp 代表特殊字符"&"

5、在URL 或 URI 中包含单个请求变量

如果要在URL 中包含一个请求参数,而这人参数的值存在于当前网页可访问的一个变量中,可以按以下方法来实现。

为了演示这一功能,首先创建一个当前网页可访问的变量。例如,本例中创建了两个变量,一个是字符类型,一个是CustomerBean ,它们存存于一个 page 范围内:

    <%
        /*
         * Create a string object to store as abean in
         * the page content and embed in thislink
         */
        String stringBean = "Value to Passont URL";
       pageContext.setAttribute("stringBean", stringBean);
    %>
    <jsp:useBean id ="customerBean" scope="page"class="htmltaglibs.beans.CurstomerBean"/>
    <jsp:setProperty name="customerBean" property="name"value="weiqin"/>

接着,把这两个变量作为请求参数,加入到URL或URI 中:

    <html:link page="/HtmlBasic.do"
                      paramId="urlParamName"
                     paramName="stringBean">
        URL encode a parameter based on astring bean value
    </html:link>
    <html:link page="/HtmlBasic.do"
                      paramId="urlParamName"
                      paramName="customerBean"
                      paramProperty="name">
        URL encode a parameter based on acustomer bean value
    </html:link>

    rewrite: <html:rewrite page="/HtmlBasic.do" paramId="urlParamName" paramName="stringBean"/>
    rewrite: <html:rewrite page="/HtmlBasic.do" paramId="urlParamName" paramName="customerBean" paramProperty="name"/>

<html:link> 标签的 paramId 属性指定请求参数名,paramName属性指定变量的名字。如果变量为JavaBean ,用paramProperty 属性指定JavaBean 的属性。

对于本例的stringBean,请求参数值为stringBean的字符串值。对于customerBean,指定了paramProperty 属性,请求参数值为customerBean 的 name 属性值。

以上代码生成如下HTML 内容:

    <a href="/HtmlBasic.do?urlParamName=Value to Pass on Url">
        Url encode a paramter based on a stringbean value
    </a>

    <a href="/HtmlBasic.do?urlParamName=weiqin">
        url encode a parameter based on acustomer bean value
    </a>

    rewrite: /HtmlBasic.do?urlParamName=Value toPass on Url
    rewrite: /HtmlBasic.do?urlParamName=weiqin

6、在URL 或 URI 中包含多个请求变量

如果在URL 或 URI 中包含多个请求参数,而这些参数的值来自多个变量,需要先定义一个Map类型的java 类,如java.util.HashMap,用它来存放请求变量。例如:

   <%
        /*
         * Strore values int a Map(HashMap inthis case)
         * and construct the URL based on theMap
         * /
        java.util.HashMap myMap = newjava.util.HashMap();
        myMap.put("myString", newString("myStringValue"));
        myMap.put("myArray" , newString[]{"str1","str2","str3"} );
       pageContext.setAttribute("map", myMap);
    %>

在以上代码的HaspMap 中存放了两个对象,其中第二个对象是个字符串数组。HashMap 被存放在PageContext 中。接下来就可以把这个HashMap 作为请求参数,加入到URL 或 URI 中:

    <%-- For this version of the<html:link> tag: --%>
    <%-- map = a map with name/value pairs topass on the url --%>
    <html:link page="/HtmlBasic.do" name="map">
        URL encode a parameter based on valuein a Map
    </html:link>
    <%-- Create the same rewrite string forthe above link. --%>
    rewrite:<html:rewrite page="/HtmlBasic.do" name="map"/>

<html:link> 标签的name 属性指定包含请求变量的HashMap对象。HashMap 对象中的每一对"key/value" 代表一对或多对"请求参数名/请求参数值"。以上代码生成如下的Html 内容:

   <a href="/HtmlBasic.do?myString=myStringValue&myArray=str1&myArray=str2&myArray=str3">
        URL encode a parameter based on valuein a Map
    </a>

   rewrite:/HtmlBasic.do?myString=myStringValue&myArray=str1&myArray=str2&myArray=str3

<html:img>标签

生成基本的HTML<img>元素

<html:img page="/struts-power.gif"/>

生成 html代码如下:

<img src="/htmltaglibs/struts-power.gif">

<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>

<html:text>、<html:textarea>、<html:password>标签

在表单上创建HTML文本框字段。如下:

<html:text property="userName">

因为指定了一个userName的属性名,它应该匹配ActionForm中的一个属性,所一在FormBasicForm 中也必须有uerName这个属性和相应的getter(),setter()方法。当表单提交时,struts框架会把userName字段的内容赋给form的userName属性。

<html:textarea>、<html:password>标签与之类似

<html:cancel>标签

<html:cancel>标签在表单中生成取消按钮,当用户按下取消按钮使,将产生一个取消事件,这个事件由Action类来捕获,至于如何处理这个事件,可以在Action类的execute()方法中编程来完成。

<html:submit>、<html:button>、<html:reset>标签

<html:submit>Submit</html:submit>

其余类似

<html: hidden>标签

在表单上生成隐藏字段,存放用户不希望看到和不允许修改的信息:如下两种方式:

<html:hidden property="userName">

生成Html:

<input type="hidden" name="userName"value="propValue">

<html:checkbox>标签

<html:checkbox>标签在表单上生成标准的HTML检查框,例如ActionFormBean 中的某个属性只有两种可选值(如true和false),就可以在表单中用<html:checkbox>标签来表示。<html:checkbox>的使用方法为:

<html:checkbox property="ch1"/>

生成HTML代码:

<input type="checkbox"name="cb1" value="true">

<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.

<html:multibox>标签

<html:multibox>标签和<html:checkbox>一样,可以提供html<inputtype="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"}.

<html:radio>标签

<html:radio>标签提供HTML<inputtype="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">

<html:select>标签

<html:select>标签生成HTML<select>元素。它可以在表单上创建下拉列表或多选列表。在<html:select>标签中可以包含多个<html:option>,<html:options>和<html:optionCollection>标签。<html:select>标签的基本形式为:

<html:select property="name" multiple="true" size="6">
   [one or more
      <html:option/>,
      <html:options/>,
      <html:optionsCollection/>
      tags]
  </html:select>

<html:select>标签有以下重要属性:

size属性:指每次在网页上显示的可选项的数目。

multiple属性:指定是否支持多项选择,如果设置为true,就表示多选列表,支持多项选择;否则表示下拉列表,只支持单项选择,默认为false.

property属性:与ActionFormBean中的对应属性对应,这个属性用来存放用户在列表上选中选项的值,在单选的情况下,Bean中的对应属性应该定义为简单类型(不能为数组)。在多项选择的情况下,Bean中的对应属性应该定义为数组类型,以便存放用户选择的多个选项。

value属性:select的默认选中属性。动态的多用EI表达式生成

例如:在 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;
     }

<html:option>标签

<html:option>标签生成HTML<option>元素,这个标签被嵌套在<html:select>标签中,代表列表的一个可选项,它的label有两个来源:

在<html:option>和</html:option>之间的文本内容。

由<html:option>标签的key,locale和bundle属性指定的ResourceBundle中的内容。

1、在<html:option>和</html:option>之间的文本内容

<html:option value="a.orange">Orange</html:option>
<html:option value="a.purple">Purple</html:option>

2、由<html:option>标签的key,locale和bundle属性指定的ResourceBundle中的内容

ApplicationResources.properties资源文件中存在如下键值对:a1=happySelect

标签中通过key关联到资源文件,指定要显示内容。

<html:option value="1" key="a1" /> 这样在页面上显示出happySelect

通过key,bundle同时指定要显示的内容

bundle与Struts配置文件中<message-resources>元素配置的ResourceBundle的资源文件key匹配

<message-resources parameter="com.struts.happy" key="happyhtml"/>
<html:option value="1" bundle="happyhtml" key="a1" />

这样在页面上显示出happySelect

把列表的可选项的显示文本存放在ResourceBundle中,而不是直接在JSP文件中指定,有利于实现国际化。

<html:options>、<html:optionCollection>标签

<html:options>标签提供一组HTML<option>元素。在<html:select>中可以包含多个<html:options>元素,如下:

使用coolection属性指定存在某个范围中的集合来生成列表项,注意coolection属性指定的集合,该对象的每一个元素为一个Bean

例如有如下实体类

public class Users {

private StringuserName;
private StringuserValue;
public Users(){}

publicUsers(String userName,String userValue)
{
   this.userName=userName;
   this.userValue=userValue;
}
public StringgetUserName() {
   return userName;
}
public void setUserName(StringuserName) {
   this.userName = userName;
}
public StringgetUserValue() {
   return userValue;
}
public voidsetUserValue(String userValue) {
   this.userValue = userValue;
}

}

将实体类实例放入ArrayList列表然后放入reqeust范围内

   Users u1=new Users("1","高中");
   Users u2=new Users("2","本科");
   Users u3=new Users("3","硕士");
   Users u4=new Users("4","博士");
   ArrayList array=new ArrayList();
   array.add(u1);
   array.add(u2);
   array.add(u3);
   array.add(u4);
   request.setAttribute("xueli",array);

使用

<html:options>标签生成可选项

<html:select property="xueli" multiple="true" size="3">
<html:options
   collection="xueli"
   property="userName"
   labelProperty="userValue"/>
</html:select>

等价于

<html:optionsCollection
     name="xueli"
     value="userName"
     label="userValue"/>
</html:select>

collection指定存放在request范围内的集合

property指定<html:option>实际值

labelProperty指定<html:option>显示到页面上的文本。

当使用property属性和labelProperty属性时,会根据属性指定的名称调用相应Bean中的getXXX方法来获得属性值。

生成HTML效果如下

<option value="1">高中</option>
<option value="2">本科</option>
<option value="3">硕士</option>
<option value="4">博士</option>

利用name属性指定存放在某个范围中的对象,并有property属性指定该对象的某个属性来生成列表项。

例如

 Object[] obj=new Object[]{"高中","本科","硕士","博士"};
 request.setAttribute("xueli",array);
<html:options name="xueli"/>

生成HTML效果如下:

<option value="高中">高中</option>
<option value="本科">本科</option>
<option value="硕士">硕士</option>
<option value="博士">博士</option>

如果

<html:options    name="xueli"    property="userName"    labelProperty="userValue"/>

将报如下异常

javax.servlet.jsp.JspException:No getter method available for property userName for bean under name xueli

<html:file>标签

<html:file property="file"/>

当然了在做的同时还要注意以下几点,否则就会出问题:

1.<html:file>标签必须嵌套在<html:form>标签中。

2.<html:from>标签的method属性必须设置为"POST".

3.<html:from>标签的编码类型enctype属性必须为"multipart/form-data".

4.<html:file>标签必须设置为property属性,这个属性和Bean中FormFile类型的属性对应。

上一篇:Photoshop的图片缩放技巧


下一篇:PS合成漂浮在树林的神秘女孩