⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 组件卷标.htm

📁 java 技术参考汇集超值大礼包
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 1</title>
</head>

<body>

<p>组件卷标</p>
<div id="PageContent">
	<table cellSpacing="0" cellPadding="0" width="100%" border="0" id="table3">
		<tr>
			<td class="pagebody" vAlign="top">
			<table style="CLEAR: both" cellSpacing="0" cellPadding="0" width="100%" border="0" id="table4">
				<tr>
					<td class="pagecontent" vAlign="top" width="100%">
					<div class="wiki-content">
						完成Component的自订,接下来要设定一个自订Tag与之对应,自订Tag的目的,在于设定
						Component属性,取得Componenty型态,取得Renderer型态值等;属性的设定包括了设定静态值、设定绑定值、设定验证器等等。<p>
						  要自订与Component对应的Tag,您可以继承UIComponentTag,例如:</p>
						<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
							<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
								<b>TextWithCmdTag.java</b></div>
							<div class="codeContent">
								<pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar;

 <span class="code-keyword">import</span> javax.faces.application.Application;
 <span class="code-keyword">import</span> javax.faces.component.UIComponent;
 <span class="code-keyword">import</span> javax.faces.context.FacesContext;
 <span class="code-keyword">import</span> javax.faces.el.ValueBinding;
 <span class="code-keyword">import</span> javax.faces.webapp.UIComponentTag;

 <span class="code-keyword">public</span> class TextWithCmdTag <span class="code-keyword">extends</span> UIComponentTag {
    <span class="code-keyword">private</span> <span class="code-object">String</span> size;
    <span class="code-keyword">private</span> <span class="code-object">String</span> value;

    <span class="code-keyword">public</span> <span class="code-object">String</span> getComponentType() {
        <span class="code-keyword">return</span> <span class="code-quote">&quot;onlyfun.caterpillar.TextWithCmd&quot;</span>;
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> getRendererType() {
        <span class="code-keyword">return</span> <span class="code-keyword">null</span>;
    }

    <span class="code-keyword">public</span> void setProperties(UIComponent component) {
        <span class="code-keyword">super</span>.setProperties(component);

        setStringProperty(component, <span class="code-quote">&quot;size&quot;</span>, size);
        setStringProperty(component, <span class="code-quote">&quot;value&quot;</span>, value);
    }

    <span class="code-keyword">private</span> void setStringProperty(UIComponent component,
                       <span class="code-object">String</span> attrName, <span class="code-object">String</span> attrValue) {
        <span class="code-keyword">if</span>(attrValue == <span class="code-keyword">null</span>)
            <span class="code-keyword">return</span>;

        <span class="code-keyword">if</span>(isValueReference(attrValue)) {
            FacesContext context =
                         FacesContext.getCurrentInstance();
            Application application =
                         context.getApplication();
            ValueBinding binding =
                   application.createValueBinding(attrValue);
            component.setValueBinding(attrName, binding);
        }
        <span class="code-keyword">else</span> {
            component.getAttributes().
                          put(attrName, attrValue);
        }
    }

    <span class="code-keyword">public</span> void release() {
        <span class="code-keyword">super</span>.release();
        size = <span class="code-keyword">null</span>;
        value = <span class="code-keyword">null</span>;
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> getSize() {
        <span class="code-keyword">return</span> size;
    }

    <span class="code-keyword">public</span> void setSize(<span class="code-object">String</span> size) {
        <span class="code-keyword">this</span>.size = size;
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> getValue() {
        <span class="code-keyword">return</span> value;
    }

    <span class="code-keyword">public</span> void setValue(<span class="code-object">String</span> value) {
        <span class="code-keyword">this</span>.value = value;
    }
 }</pre>
							</div>
						</div>
						<p>  首先看到这两个方法:</p>
						<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
							<div class="codeContent">
								<pre class="code-java"><span class="code-keyword">public</span> <span class="code-object">String</span> getComponentType() {
        <span class="code-keyword">return</span> <span class="code-quote">&quot;onlyfun.caterpillar.TextWithCmd&quot;</span>;
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> getRendererType() {
        <span class="code-keyword">return</span> <span class="code-keyword">null</span>;
    }</pre>
							</div>
						</div>
						<p>
						  由于我们的Component目前不使用Renderer,所以getRendererType()传回null值,而
						getComponentType()在于让JSF取得这个Tag所对应的Component,所传回的值在faces-config.xml中要有定义,例如:</p>
						<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
							<div class="codeContent">
								<pre class="code-java">....
 &lt;component&gt;
    &lt;component-type&gt;
        onlyfun.caterpillar.TextWithCmd
    &lt;/component-type&gt;
    &lt;component-class&gt;
        onlyfun.caterpillar.UITextWithCmd
    &lt;/component-class&gt;
 &lt;/component&gt;
 ....</pre>
							</div>
						</div>
						<p>  藉由faces-config.xml中的定义,JSF可以得知
						onlyfun.caterpillar.TextWithCmd的真正类别,而这样的定义方式很显然的,您可以随时换掉&lt;component-
						class&gt;所对应的类别,也就是说,Tag所对应的Component是可以随时替换的。</p>
						<p>
						  在设定Component属性值时,可以由component.getAttributes()取得Map对象,并将卷标属性值存入Map
						中,这个Map对象可以在对应的Component中使用getAttributes()取得,例如在上一个主题中的UITextWithCmd中可以如下取得存入Map的size属性:</p>
						<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
							<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
								<b>UITextWithCmd.java</b></div>
							<div class="codeContent">
								<pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar;

 <span class="code-keyword">import</span> java.io.IOException;
 <span class="code-keyword">import</span> java.util.Map;

 <span class="code-keyword">import</span> javax.faces.component.UIInput;
 <span class="code-keyword">import</span> javax.faces.context.FacesContext;
 <span class="code-keyword">import</span> javax.faces.context.ResponseWriter;

 <span class="code-keyword">public</span> class UITextWithCmd <span class="code-keyword">extends</span> UIInput {
    ....
    <span class="code-keyword">private</span> void encodeTextField(ResponseWriter writer,
                        <span class="code-object">String</span> clientId) <span class="code-keyword">throws</span> IOException {
        ....

        <span class="code-object">String</span> size = (<span class="code-object">String</span>) getAttributes().get(<span class="code-quote">&quot;size&quot;</span>);
        <span class="code-keyword">if</span>(size != <span class="code-keyword">null</span>) {
            writer.writeAttribute(<span class="code-quote">&quot;size&quot;</span>, size, <span class="code-keyword">null</span>);
        }
        .....
    }
    ....
 }</pre>
							</div>
						</div>
						<p>  可以使用isValueReference()来测试是否为JSF Expression
						Language的绑定语法,如果是的话,则我们必须建立ValueBinding对象,并设定值绑定:</p>
						<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
							<div class="codeContent">
								<pre class="code-java">....
 <span class="code-keyword">private</span> void setStringProperty(UIComponent component,
                        <span class="code-object">String</span> attrName, <span class="code-object">String</span> attrValue) {
        <span class="code-keyword">if</span>(attrValue == <span class="code-keyword">null</span>)
            <span class="code-keyword">return</span>;

        <span class="code-keyword">if</span>(isValueReference(attrValue)) {
            FacesContext context =
                          FacesContext.getCurrentInstance();
            Application application =
                          context.getApplication();
            ValueBinding binding =
                   application.createValueBinding(attrValue);
            component.setValueBinding(attrName, binding);
        }
        <span class="code-keyword">else</span> {
            component.getAttributes().
                         put(attrName, attrValue);
        }
    }
 ....</pre>
							</div>
						</div>
						<p>  如果是value属性,记得在上一个主题中我们提过,从UIOutput继承下来的getValue()方法可以取得
						Component的value设定值,这个值可能是静态的属性设定值,也可能是JSF
						Expression的绑定值,预设会先从组件的属性设定值开始找寻,如果找不到,再从绑定值(ValueBinding对象)中找寻。</p>
						<p>  最后,我们必须提供自订Tag的tld档:</p>
						<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
							<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
								<b>textcmd.tld</b></div>
							<div class="codeContent">
								<pre class="code-java">&lt;?xml version=<span class="code-quote">&quot;1.0&quot;</span> encoding=<span class="code-quote">&quot;UTF-8&quot;</span>?&gt;
 &lt;taglib version=<span class="code-quote">&quot;2.0&quot;</span>
     xmlns=<span class="code-quote">&quot;http:<span class="code-comment">//java.sun.com/xml/ns/j2ee&quot;</span>
</span>     xmlns:xsi=<span class="code-quote">&quot;http:<span class="code-comment">//www.w3.org/2001/XMLSchema-instance&quot;</span>
</span> xsi:schemaLocation=
 <span class="code-quote">&quot;http:<span class="code-comment">//java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd&quot;</span>&gt;
</span> &lt;tlib-version&gt;1.0&lt;/tlib-version&gt;
 &lt;jsp-version&gt;2.0&lt;/jsp-version&gt;
 &lt;<span class="code-object">short</span>-name&gt;textcmd&lt;/<span class="code-object">short</span>-name&gt;
 &lt;uri&gt;http:<span class="code-comment">//caterpillar.onlyfun.net/textcmd&lt;/uri&gt;
</span>
 &lt;tag&gt;
     &lt;name&gt;textcmd&lt;/name&gt;
     &lt;tag-class&gt;onlyfun.caterpillar.TextWithCmdTag&lt;/tag-class&gt;
     &lt;body-content&gt;empty&lt;/body-content&gt;
     &lt;attribute&gt;
        &lt;name&gt;size&lt;/name&gt;
     &lt;/attribute&gt;
     &lt;attribute&gt;
        &lt;name&gt;value&lt;/name&gt;
        &lt;required&gt;<span class="code-keyword">true</span>&lt;/required&gt;
     &lt;/attribute&gt;
 &lt;/tag&gt;

 &lt;/taglib&gt;</pre>
							</div>
						</div>
					</div>
					</td>
				</tr>
			</table>
			</td>
		</tr>
	</table>
</div>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -