📄 自订转换器.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">","</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">","</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"><?xml version=<span class="code-quote">"1.0"</span>?>
<!DOCTYPE faces-config PUBLIC
<span class="code-quote">"-<span class="code-comment">//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"</span>
</span> <span class="code-quote">"http:<span class="code-comment">//java.sun.com/dtd/web-facesconfig_1_0.dtd"</span>>
</span>
<faces-config>
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-<span class="code-keyword">case</span>>
<from-outcome>show</from-outcome>
<to-view-id>/pages/index.jsp</to-view-id>
</navigation-<span class="code-keyword">case</span>>
</navigation-rule>
<converter>
<converter-id>onlyfun.caterpillar.User</converter-id>
<converter-class>
onlyfun.caterpillar.UserConverter
</converter-class>
</converter>
<managed-bean>
<managed-bean-name>guest</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.GuestBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config></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"><%@ taglib uri=<span class="code-quote">"http:<span class="code-comment">//java.sun.com/jsf/core"</span> prefix="f" %>
</span> <%@ taglib uri=<span class="code-quote">"http:<span class="code-comment">//java.sun.com/jsf/html"</span> prefix="h" %>
</span> <%@page contentType=<span class="code-quote">"text/html;charset=Big5"</span>%>
<f:view>
<html>
<head>
<title>自订转换器</title>
</head>
<body>
Guest名称是:<b>
<h:outputText value=<span class="code-quote">"#{guest.user}"</span>
converter=<span class="code-quote">"onlyfun.caterpillar.User"</span>/>
</b>
<h:form>
<h:inputText id=<span class="code-quote">"userField"</span>
value=<span class="code-quote">"#{guest.user}"</span>
converter=<span class="code-quote">"onlyfun.caterpillar.User"</span>/>
<h:message <span class="code-keyword">for</span>=<span class="code-quote">"userField"</span> style=<span class="code-quote">"color:red"</span>/>
<br>
<h:commandButton value=<span class="code-quote">"送出"</span> action=<span class="code-quote">"show"</span>/>
</h:form>
</body>
</html>
</f:view></pre>
</div>
</div>
<p> 您也可以<f:converter>卷标并使用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"><h:inputText id=<span class="code-quote">"userField"</span> value=<span class="code-quote">"#{guest.user}"</span>>
<f:converter converterId=<span class="code-quote">"onlyfun.caterpillar.User"</span>/>
</h:inputText></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"><h:inputText id=<span class="code-quote">"userField"</span>
value=<span class="code-quote">"#{guest.user}"</span>
converter=<span class="code-quote">"#{guest.converter}"</span>/></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 + -