jsp ページで使用される EL 式では、文字列は文字どおりに解釈されます。たとえば、次のコード スニペットでは
<c:when test="${myvar == 'prefix.*'}">
myvar の値が「prefixxxxx」の場合、test は true と評価しません。代わりに文字列を正規表現として解釈する方法があるかどうかは誰にもわかりませんか? EL には awk のチルダ ~ 演算子に似たものがありますか?
この特殊なケースは JSTL 関数で処理できますがfn:startsWith
、通常、正規表現は非常に可能性の高いテストのように見えます。JSTL にこれらの関数が含まれていないのは残念です。
明るい面としては、必要なことを行う EL 関数を作成するのは非常に簡単です。関数の実装と、Web アプリケーションにその場所を知らせる TLD が必要です。これらを JAR にまとめて、WEB-INF/lib ディレクトリにドロップします。
概要は次のとおりです。
com/x/taglib/core/Regexp.java:
import java.util.regex.Pattern;
public class Regexp {
public static boolean matches(String pattern, CharSequence str) {
return Pattern.compile(pattern).matcher(str).matches();
}
}
META-INF/xc.tld:
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>x-c</short-name>
<uri>http://dev.x.com/taglib/core/1.0</uri>
<function>
<description>Test whether a string matches a regular expression.</description>
<display-name>Matches</display-name>
<name>matches</name>
<function-class>com.x.taglib.core.Regexp</function-class>
<function-signature>boolean matches(java.lang.String, java.lang.CharSequence)</function-signature>
</function>
</taglib>
申し訳ありませんが、私はこの特定の機能をテストしていませんが、正しい方向に向けるのに十分であることを願っています.
以下を WEB-INF/tags.tld に追加するだけです。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib version="2.1"
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">
<display-name>Acme tags</display-name>
<short-name>custom</short-name>
<uri>http://www.acme.com.au</uri>
<function>
<name>matches</name>
<function-class>java.util.regex.Pattern</function-class>
<function-signature>
boolean matches(java.lang.String, java.lang.CharSequence)
</function-signature>
</function>
</taglib>
次に、あなたのjspで
<%@taglib uri="http://www.acme.com.au" prefix="custom"%>
custom:matches('aaa.+', someVar) }
これはPattern.matchとまったく同じように機能します
次のようにJSTL関数を使用できます-
<c:when test="${fn:startsWith(myVar, 'prefix')}">
見てみましょう: http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fn/tld-summary.html
私の場合、jsp ページ内で Pattern.matches を使用するには、java.util.regex.Pattern.matches(regexString,stringToCompare) を呼び出すだけで十分でした。これは、jsp でパッケージをインポートできないためです。