私は最近、レガシー (JSF 1.2) プロジェクトを継承し、それを JSF 2.2 に準拠させる任務を負っています。私は経験豊富な JSF 開発者ではなく、Web 上のさまざまなアドバイスに従っています。私が直面している適切な解決策が見つからない問題の 1 つは、式言語パラメーターを介してメソッド バインディングをカスタム コンポーネントに渡すことです。以下に例を示します。
ブラウズ.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:custom="http://www.custom.com/jsf/custom">
<f:view>
<head>
<title>Title</title>
</head>
<body>
<custom:condition test="#{MyBean.canView}">
Some private data here
</custom:condition>
</body>
</f:view>
</html>
MyBean.java:
public class MyBean {
public String canView() { return "true"; }
}
Conditional.java (custom:condition タグにマッピング):
public class Conditional extends UIComponentBase {
<snip>
private MethodBinding testBinding;
public MethodBinding getTest() {
return testBinding;
}
public void setTest(MethodBinding test) {
testBinding = test;
}
public boolean test(FacesContext context) {
boolean ret = true;
if (testBinding != null) {
try {
Object o = testBinding.invoke(context, null);
ret = o != null;
} catch (Exception e) {
e.printStackTrace();
}
}
return ret;
}
<snip>
}
EL ハッシュ/中かっこをオフString
の"MyBean.canView"
ままにし、それらをコンポーネントに連結し、MethodExpression
. 以前の JSF 1.2 コードのように、Facelet で EL 式の評価を実行していないことは言うまでもありません。
何か不足していますか?この JSF 1.2 コードを JSF 2.2 にアップコンバートするにはどうすればよいですか?
編集:これは私の「ハック」です。より良い方法があることを願っています。
public class Conditional extends UIComponentBase {
<snip>
public boolean test(FacesContext context) {
if (testBinding != null) {
Object ret = null;
try {
ApplicationFactory factory = (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
MethodExpression methodExpression = factory.getApplication().getExpressionFactory().createMethodExpression(
FacesContext.getCurrentInstance().getELContext(),
"#{" + testBinding + "}", Boolean.class, new Class[] {});
ret = methodExpression.invoke(FacesContext.getCurrentInstance().getELContext(), null);
} catch (Exception e) {
e.printStackTrace();
}
if (ret == null) return false;
}
return true;
}
<snip>
}