JSF отображается только когда значение является числовым - PullRequest
2 голосов
/ 14 февраля 2011
<h:inputText rendered="#{bean.myStringVariable [is numeric]}" 
   id="myID"
   value="#{bean.myStringVariable}"/>

Возможно ли иметь выражение в отображаемом элементе, которое говорит render, только если содержимое myStringVariable является числовым? Я просмотрел http://developers.sun.com/docs/jscreator/help/jsp-jsfel/jsf_expression_language_intro.html, но ничего не выскакивает.

Ргдс, Кевин.

1 Ответ

2 голосов
/ 14 февраля 2011

Создайте пользовательскую функцию EL, чтобы вы могли использовать ее следующим образом:

<h:inputText rendered="#{util:matches(bean.myStringVariable, '\\d+')}">

Сначала создайте некоторый служебный класс.

package com.example.

public final class Util {

    private Util() {
        //
    }

    public static boolean matches(String value, String regex) {
        return value.matches(regex);
    }

}

Если вы используете JSP, определите его следующим образом в /WEB-INF/util.tld:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

    <display-name>Utility Functions</display-name>    
    <tlib-version>1.0</tlib-version>
    <uri>http://example.com/util</uri>

    <function>
        <name>matches</name>
        <function-class>com.example.Util</function-class>
        <function-signature>boolean matches(java.lang.String, java.lang.String)</function-signature>
    </function>
</taglib>

И объявить это следующим образом:

<%@taglib uri="http://example.com/util" prefix="util" %>

Или, если вы используете Facelets, определите его следующим образом в /META-INF/util.taglib.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
    "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
    "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

<facelet-taglib>
    <namespace>http://example.com/util</namespace>
    <function>
        <function-name>matches</function-name>
        <function-class>com.example.Util</function-class>
        <function-signature>boolean matches(java.lang.String, java.lang.String)</function-signature>
    </function>    
</facelet-taglib>

Добавьте его к web.xml следующим образом:

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/META-INF/util.taglib.xml</param-value>
</context-param>

(когда вы используете JSF 2.0, используйте вместо имени javax.faces.FACELETS_LIBRARIES)

И объявить это следующим образом:

<html xmlns:util="http://example.com/util">
...