2017-09-06 147 views
0

是否有可能在jsf解析之前执行一些java代码?在解析之前执行代码

我用例:比方说,我在外部属性文件中定义的几个outputText

<h:outputText value="#{msg['my.example.label']}"/> 

前后每本outputText我想有msg键的值另一个的outputText的(用于调试目的)。

<h:outputText value="#{msg['my.example.label']}"/> 
<h:outputText value="my.example.label"/> 

而且我不希望它添加人工每个标签,但写一些代码,可以检测#{msg[...]}片段,提取关键和原始标签后添加。

JSF有可能吗?

+0

你可以做两件事。创建一个将'key'作为属性的自定义组件,并且在它内部既显示密钥又显示已解析的'msg'(如果处于调试模式)或者只显示不在调试/开发者模式下的标签。但是你也可以创建一个资源解析器(在https://stackoverflow.com/questions/13655540/read-resource-bundle-properties-in-a-managed-bean中的答案中的'替代'部分,并让它返回在开发人员模式下键值和解析值 – Kukeltje

回答

0

您可以创建一个扩展为HtmlOutputText<h:outputText>)的自定义组件。在这里,我已经使用了类似的例子,但显示的所有表达式(豆类,resurces和隐含对象),不仅资源变量:

自定义组件:

​​

的标签库:

<namespace>http://com.mycompany/custom-components</namespace> 
<tag> 
    <tag-name>customOutputText</tag-name> 
    <component> 
     <component-type>com.mycompany.component.CustomOutputText</component-type> 
     <renderer-type>com.mycompany.component.CustomOutputText</renderer-type> 
    </component> 
    <attribute> 
     <name>value</name> 
     <required>true</required> 
     <type>java.lang.String</type> 
    </attribute> 
</tag> 

注册在web.xml:

<context-param> 
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name> 
    <param-value>/WEB-INF/custom.taglib.xml</param-value> 
</context-param> 

而且,测试,一个简单的人老化豆(在这种情况下,CDI)

@Named 
@ViewScoped 
public class MyBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    public String getSample() { 
     return "sample text from bean"; 
    } 
} 

在XHTML包括标签库,和使用该组件:

<custom:customOutputText value="#{myBean.sample}" /> 

并且输出是:

sample text from bean 

[expression: #{myBean.sample}] 

注意,组件将生成2个html标签,1 <span>和1 <p>,请考虑应用程序css样式。

+0

很好的解决方案。我在我的评论中写的内容排序...但是... OP想要从表达式中显示“键”,而不是完整的表达式,您可以实现解析表达式(删除'#{msg ['''部分和'']}'部分,但它只适用于msg变体,而不是例如,如果还有'字段'(例如'#{field ['my.other。关键']}',它只适用于这个特定的标签(OP应该更好地使用'outputLabel',但这是另一个问题。)但感谢回答 – Kukeltje

+0

谢谢,有很多方法可以做到这一点,这个例子只是其中的一个。很高兴帮助! –

相关问题