可以制作javax.faces.convert.Comverter接口自定义验证器,这里介绍两个制作方法:
简单的说,第一个方法会接收从客户端经过HTTP传来的字符串信息,在第一个方法中将要转换的内容转换成自定义的组件,这个自定义组件将会自动设定给你指定的Bean组件;第二个方法就是将从你的Bean组件得到组件的转换字符串,如此才能由HTTP传回
给客户端。
直接以一个简单的例子来说明。假设你有一个 User类:
这个User类时我们转换器的目标组件,我们也有一个 GuestBean类:
这个Bean上的属性直接传回或接受User类型的参数,我们作一个简单的转换器,为HTTP字符串与User组件进行转换:
完成了转换器的制作,我们需要告诉JSF有这个事件,这是在faces-config.xml中完成注册:
注册转换器时,需要提供转换器识别(Converter ID)与转换器类,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器标识,例如:
您也可以使用<f:converter>标签并使用converterId属性来指定转换器,例如:
除了向JSF注册转换器之外,还有一个方式可以不用注册,就是直接在Bean上提供一个取得转换器的方法,例如:
之后可以直接结合JSF Expression Language来指定转换器:
java 代码
- public Object getAsObject(FacesContext context,
- UIComponent component,
- String str);
- public String getAsString(FacesContext context,
- UIComponent component,
- Object obj);
简单的说,第一个方法会接收从客户端经过HTTP传来的字符串信息,在第一个方法中将要转换的内容转换成自定义的组件,这个自定义组件将会自动设定给你指定的Bean组件;第二个方法就是将从你的Bean组件得到组件的转换字符串,如此才能由HTTP传回
给客户端。
直接以一个简单的例子来说明。假设你有一个 User类:
java 代码
- User.java
- User.java
- package onlyfun.caterpillar;
- public class User {
- private String firstName;
- private String lastName;
- public String getFirstName() {
- return firstName;
- }
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
- public String getLastName() {
- return lastName;
- }
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
- }
这个User类时我们转换器的目标组件,我们也有一个 GuestBean类:
java 代码
- GuestBean.java
- package onlyfun.caterpillar;
- public class GuestBean {
- private User user;
- public void setUser(User user) {
- this.user = user;
- }
- public User getUser() {
- return user;
- }
- }
这个Bean上的属性直接传回或接受User类型的参数,我们作一个简单的转换器,为HTTP字符串与User组件进行转换:
UserConverter.java 代码
- package onlyfun.caterpillar;
- import javax.faces.component.UIComponent;
- import javax.faces.context.FacesContext;
- import javax.faces.convert.Converter;
- import javax.faces.convert.ConverterException;
- //转换器需要实现(继承) javax.faces.convert.Converter
- public class UserConverter implements Converter {
- public Object getAsObject(FacesContext context,
- UIComponent component,
- String str)
- throws ConverterException {
- String[] strs = str.split(",");
- User user = new User();
- try {
- user.setFirstName(strs[0]);
- user.setLastName(strs[1]);
- }
- catch(Exception e) {
- // 转换错误,简单的抛出异常
- throw new ConverterException();
- }
- return user;
- }
- public String getAsString(FacesContext context,
- UIComponent component,
- Object obj)
- throws ConverterException {
- String firstName = ((User) obj).getFirstName();
- String lastName = ((User) obj).getLastName();
- return firstName + "," + lastName;
- }
- }
完成了转换器的制作,我们需要告诉JSF有这个事件,这是在faces-config.xml中完成注册:
faces-config.xml 代码
- <?xml version="1.0"?>
- <!DOCTYPE faces-config PUBLIC
- "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
- "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
- <faces-config>
- <navigation-rule>
- <from-view-id>/*</from-view-id>
- <navigation-case>
- <from-outcome>show</from-outcome>
- <to-view-id>/pages/index.jsp</to-view-id>
- </navigation-case>
- </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>
注册转换器时,需要提供转换器识别(Converter ID)与转换器类,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器标识,例如:
index.jsp 代码
- <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
- <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
- <%@page contentType="text/html;charset=Big5"%>
- <f:view>
- <html>
- <head>
- <title>自定义转换器</title>
- </head>
- <body>
- Guest名称是:<b>
- <h:outputText value="#{guest.user}"
- converter="onlyfun.caterpillar.User"/>
- </b>
- <h:form>
- <h:inputText id="userField"
- value="#{guest.user}"
- converter="onlyfun.caterpillar.User"/>
- <h:message for="userField" style="color:red"/>
- <br>
- <h:commandButton value="送出" action="show"/>
- </h:form>
- </body>
- </html>
- </f:view>
您也可以使用<f:converter>标签并使用converterId属性来指定转换器,例如:
JSF 代码
- <h:inputText id="userField" value="#{guest.user}">
- <f:converter converterId="onlyfun.caterpillar.User"/>
- </h:inputText>
除了向JSF注册转换器之外,还有一个方式可以不用注册,就是直接在Bean上提供一个取得转换器的方法,例如:
GuestBean.java 代码
- package onlyfun.caterpillar;
- import javax.faces.convert.Converter;
- public class GuestBean {
- private User user;
- private Converter converter = new UserConverter();
- public void setUser(User user) {
- this.user = user;
- }
- public User getUser() {
- return user;
- }
- public Converter getConverter() {
- return converter;
- }
- }
之后可以直接结合JSF Expression Language来指定转换器:
JSF 代码
- <h:inputText id="userField"
- value="#{guest.user}"
- converter="#{guest.converter}"/>