<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&prop2=123
提示:在HTML 中& 代表特殊字符"&"
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=weiqin6、在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类型的属性对应。