Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 动态创建链接_Jsf - Fatal编程技术网

Jsf 动态创建链接

Jsf 动态创建链接,jsf,Jsf,我有一个用户定义的文本,例如 @SessionScoped public class MyBean { private String text = "Life’s but a walking shadow, a poor player that struts and frets his hour upon the stage and then is heard no more."; public String getText() { ret

我有一个用户定义的文本,例如

@SessionScoped
public class MyBean {
    private String text = "Life’s but a walking shadow, a poor player  
    that struts and frets his hour upon the stage and 
    then is heard no more.";

    public String getText() {
        return text;
    }
}
当然,文本不是静态的,而是从其他地方加载的。我希望文本在页面上显示一次,如中所示

<h:form id="myForm">
    <h:outputText value="#{myBean.text}" />
</h:form>

现在在bean中有一个逻辑,它标记文本中的某些单词,例如每个名词。这些单词应该作为链接呈现,就像它们是commandLinks一样。 也就是说,表格应该提交,我应该能够找到哪个链接被点击。 已经有人问过类似的问题,但我不确定那里给出的解决方案是否适合我的情况


我现在最好的猜测是将标记单词处的文本拆分为bean中的片段列表,例如

List<TextSnippet> textSnippets;

class TextSnippet {
    private String precedingText;
    private String markedWord;
    ...
}
列出文本片段;
类文本片段{
私有字符串;
私有字符串标记字;
...
}
这样,每个文本片段都以一个标记的单词结尾。然后我就可以在xhtml中迭代列表,例如

<h:form id="myForm">
    <ui:repeat var="snippet" value="#{myBean.textSnippets}">
        <h:outputText value="#{snippet.precedingText}" />
        <h:commandLink action="#{myBean.clickedOn(snippet.markedWord)}">
            <h:outputText value="#{snippet.markedWord}">
        </h:commandLink>
    </ui:repeat>
</h:form>


然而,我觉得这将bean(分割逻辑)与视图紧密地结合在一起。有更好的主意吗?

你似乎走对了路,但我想我可以建议你一些改进。我不知道你的确切要求,但你目前的结构限制了标记的单词(我想它只是一个链接)在段落的末尾。如果后面有文本,会发生什么?有两个标记的单词怎么样?这门课可能更适合:

class TextSnippet {
    private String text;
    private String linkUrl;
    ...
}
您需要按照您的方式构建
列表
,但要先评估链接,以便
ui:repeat
可以访问它们

然后,迭代它。您已经有了一个POST来评估去哪里,而不是执行POST来评估去哪里,因此如果您想指向应用程序中的某个地方,您可以使用,如果它在应用程序之外,则可以使用
h:outputLink

<ui:repeat var="snippet" value="#{myBean.textSnippets}">
    <h:outputText value="#{snippet.text}" rendered="#{empty snippet.linkUrl}" />
    <h:link outcome="#{snippet.linkUrl}" rendered="#{not empty snippet.linkUrl}">
        <h:outputText value="#{snippet.text}">
    </h:link>
</ui:repeat>

我个人要做的是尽量保持jsf树的小型化,并实现一些我认为性能更好的东西,如下面的几行(disclamer:没有完整的代码)

  • 在bean中准备文本serverside作为
    这是一个需要链接的特定单词,这也是
  • 通过
    (用于转义!)以纯html格式输出
  • class=“linkedWord”
    上添加一个jquery动态事件处理程序(这样它对每个链接都有效),并调用一个javascript函数
  • 在该javascript函数中,读取div的内容(或者可能将文本添加为
    data-
    属性aas(比如
    specific
  • 调用
    (JSF 2.3及以上版本)或
    o:commandScript
    (或`p:remoteCommand),并将div的内容(或属性值)作为参数传递给服务器端方法
请记住,没有明确的理由以“JSF”的方式做任何事情。使用客户端功能和一些与JSF的小型集成是非常有效的用法。不这样做的人通常会“责怪”JSF,但他们自己实际上是导致不太理想行为的原因。)

另请参见: