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

📄 自订转换器.htm

📁 良葛格學習筆記,《jsf入门》简体中文版,对学习JSF有帮助
💻 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">
						除了使用标准的转换器之外,您还可以自行定制您的转换器,您可以实作javax.faces.convert.Converter接口,这个接口有两个要实作的方法:<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">Object</span> getAsObject(FacesContext context,
                           UIComponent component,
                           <span class="code-object">String</span> str);
 <span class="code-keyword">public</span> <span class="code-object">String</span> getAsString(FacesContext context,
                           UIComponent component,
                           <span class="code-object">Object</span> obj);</pre>
							</div>
						</div>
						<p>
						  简单的说,第一个方法会接收从客户端经由HTTP传来的字符串数据,您在第一个方法中将之转换为您的自订对象,这个自订对象将会自动设定给您指定的Bean对象;第二个方法就是将从您的Bean对象得到的对象转换为字符串,如此才能藉由HTTP传回给客户端。</p>
						<p>  直接以一个简单的例子来作说明,假设您有一个User类别:</p>
						<ul>
							<li>User.java </li>
						</ul>
						<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>User.java</b></div>
							<div class="codeContent">
								<pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar;

 <span class="code-keyword">public</span> class User {
    <span class="code-keyword">private</span> <span class="code-object">String</span> firstName;
    <span class="code-keyword">private</span> <span class="code-object">String</span> lastName;

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

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

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

    <span class="code-keyword">public</span> void setLastName(<span class="code-object">String</span> lastName) {
        <span class="code-keyword">this</span>.lastName = lastName;
    }
 }</pre>
							</div>
						</div>
						<p>  这个User类别是我们转换器的目标对象,而您有一个GuestBean类别:</p>
						<ul>
							<li>GuestBean.java </li>
						</ul>
						<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>GuestBean.java</b></div>
							<div class="codeContent">
								<pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar;

 <span class="code-keyword">public</span> class GuestBean {
    <span class="code-keyword">private</span> User user;

    <span class="code-keyword">public</span> void setUser(User user) {
        <span class="code-keyword">this</span>.user = user;
    }

    <span class="code-keyword">public</span> User getUser() {
        <span class="code-keyword">return</span> user;
    }
 }</pre>
							</div>
						</div>
						<p>
						  这个Bean上的属性直接传回或接受User型态的参数,我们来实作一个简单的转换器,为HTTP字符串与User对象进行转换:</p>
						<ul>
							<li>UserConverter.java </li>
						</ul>
						<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>UserConverter.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.component.UIComponent;
 <span class="code-keyword">import</span> javax.faces.context.FacesContext;
 <span class="code-keyword">import</span> javax.faces.convert.Converter;
 <span class="code-keyword">import</span> javax.faces.convert.ConverterException;

 <span class="code-keyword">public</span> class UserConverter <span class="code-keyword">implements</span> Converter {
    <span class="code-keyword">public</span> <span class="code-object">Object</span> getAsObject(FacesContext context,
                              UIComponent component,
                              <span class="code-object">String</span> str)
                                 <span class="code-keyword">throws</span> ConverterException {
        <span class="code-object">String</span>[] strs = str.split(<span class="code-quote">&quot;,&quot;</span>);

        User user = <span class="code-keyword">new</span> User();

        <span class="code-keyword">try</span> {
            user.setFirstName(strs[0]);
            user.setLastName(strs[1]);
        }
        <span class="code-keyword">catch</span>(Exception e) {
            <span class="code-comment">// 转换错误,简单的丢出例外
</span>            <span class="code-keyword">throw</span> <span class="code-keyword">new</span> ConverterException();
        }

        <span class="code-keyword">return</span> user;
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> getAsString(FacesContext context,
                              UIComponent component,
                              <span class="code-object">Object</span> obj)
                                 <span class="code-keyword">throws</span> ConverterException {
        <span class="code-object">String</span> firstName = ((User) obj).getFirstName();
        <span class="code-object">String</span> lastName = ((User) obj).getLastName();

        <span class="code-keyword">return</span> firstName + <span class="code-quote">&quot;,&quot;</span> + lastName;
    }
 }</pre>
							</div>
						</div>
						<p>  实作完成这个转换器,我们要告诉JSF这件事,这是在faces-config.xml中完成注册:</p>
						<ul>
							<li>faces-config.xml </li>
						</ul>
						<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>faces-config.xml</b></div>
							<div class="codeContent">
								<pre class="code-java">&lt;?xml version=<span class="code-quote">&quot;1.0&quot;</span>?&gt;
 &lt;!DOCTYPE faces-config PUBLIC
 <span class="code-quote">&quot;-<span class="code-comment">//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN&quot;</span>
</span> <span class="code-quote">&quot;http:<span class="code-comment">//java.sun.com/dtd/web-facesconfig_1_0.dtd&quot;</span>&gt;
</span>
 &lt;faces-config&gt;
    &lt;navigation-rule&gt;
        &lt;from-view-id&gt;/*&lt;/from-view-id&gt;
        &lt;navigation-<span class="code-keyword">case</span>&gt;
            &lt;from-outcome&gt;show&lt;/from-outcome&gt;
            &lt;to-view-id&gt;/pages/index.jsp&lt;/to-view-id&gt;
        &lt;/navigation-<span class="code-keyword">case</span>&gt;
    &lt;/navigation-rule&gt;

    &lt;converter&gt;
        &lt;converter-id&gt;onlyfun.caterpillar.User&lt;/converter-id&gt;
        &lt;converter-class&gt;
            onlyfun.caterpillar.UserConverter
        &lt;/converter-class&gt;
    &lt;/converter&gt;

    &lt;managed-bean&gt;
        &lt;managed-bean-name&gt;guest&lt;/managed-bean-name&gt;
        &lt;managed-bean-class&gt;
            onlyfun.caterpillar.GuestBean
        &lt;/managed-bean-class&gt;
        &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;
    &lt;/managed-bean&gt;
 &lt;/faces-config&gt;</pre>
							</div>
						</div>
						<p>  注册转换器时,需提供转换器识别(Converter
						ID)与转换器类别,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器识别,例如:</p>
						<ul>
							<li>index.jsp </li>
						</ul>
						<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>index.jsp</b></div>
							<div class="codeContent">
								<pre class="code-java">&lt;%@ taglib uri=<span class="code-quote">&quot;http:<span class="code-comment">//java.sun.com/jsf/core&quot;</span> prefix=&quot;f&quot; %&gt;
</span> &lt;%@ taglib uri=<span class="code-quote">&quot;http:<span class="code-comment">//java.sun.com/jsf/html&quot;</span> prefix=&quot;h&quot; %&gt;
</span> &lt;%@page contentType=<span class="code-quote">&quot;text/html;charset=Big5&quot;</span>%&gt;

 &lt;f:view&gt;

 &lt;html&gt;
 &lt;head&gt;
 &lt;title&gt;自订转换器&lt;/title&gt;
 &lt;/head&gt;
 &lt;body&gt;

 Guest名称是:&lt;b&gt;
           &lt;h:outputText value=<span class="code-quote">&quot;#{guest.user}&quot;</span>
                   converter=<span class="code-quote">&quot;onlyfun.caterpillar.User&quot;</span>/&gt;
           &lt;/b&gt;

    &lt;h:form&gt;
        &lt;h:inputText id=<span class="code-quote">&quot;userField&quot;</span>
                     value=<span class="code-quote">&quot;#{guest.user}&quot;</span>
                     converter=<span class="code-quote">&quot;onlyfun.caterpillar.User&quot;</span>/&gt;
        &lt;h:message <span class="code-keyword">for</span>=<span class="code-quote">&quot;userField&quot;</span> style=<span class="code-quote">&quot;color:red&quot;</span>/&gt;
        &lt;br&gt;
        &lt;h:commandButton value=<span class="code-quote">&quot;送出&quot;</span> action=<span class="code-quote">&quot;show&quot;</span>/&gt;
    &lt;/h:form&gt;
 &lt;/body&gt;
 &lt;/html&gt;
	
 &lt;/f:view&gt;</pre>
							</div>
						</div>
						<p>  您也可以&lt;f:converter&gt;卷标并使用converterId属性来指定转换器,例如:</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;h:inputText id=<span class="code-quote">&quot;userField&quot;</span> value=<span class="code-quote">&quot;#{guest.user}&quot;</span>&gt;
     &lt;f:converter converterId=<span class="code-quote">&quot;onlyfun.caterpillar.User&quot;</span>/&gt;
 &lt;/h:inputText&gt;</pre>
							</div>
						</div>
						<p>
						  除了向JSF注册转换器之外,还有一个方式可以不用注册,就是直接在Bean上提供一个取得转换器的方法,例如:</p>
						<ul>
							<li>GuestBean.java </li>
						</ul>
						<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>GuestBean.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.convert.Converter;

 <span class="code-keyword">public</span> class GuestBean {
    <span class="code-keyword">private</span> User user;
    <span class="code-keyword">private</span> Converter converter = <span class="code-keyword">new</span> UserConverter();

    <span class="code-keyword">public</span> void setUser(User user) {
        <span class="code-keyword">this</span>.user = user;
    }

    <span class="code-keyword">public</span> User getUser() {
        <span class="code-keyword">return</span> user;
    }

    <span class="code-keyword">public</span> Converter getConverter() {
        <span class="code-keyword">return</span> converter;
    }
 }</pre>
							</div>
						</div>
						<p>  之后可以直接结合 JSF Expression Language 来指定转换器:</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;h:inputText id=<span class="code-quote">&quot;userField&quot;</span>
     value=<span class="code-quote">&quot;#{guest.user}&quot;</span>
     converter=<span class="code-quote">&quot;#{guest.converter}&quot;</span>/&gt;</pre>
							</div>
						</div>
					</div>
					</td>
				</tr>
			</table>
			</td>
		</tr>
	</table>
</div>
<p> </p>

</body>

</html>

⌨️ 快捷键说明

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