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格式输出 - 在
上添加一个jquery动态事件处理程序(这样它对每个链接都有效),并调用一个javascript函数class=“linkedWord”
- 在该javascript函数中,读取div的内容(或者可能将文本添加为
属性aas(比如data-
specific
- 调用
(JSF 2.3及以上版本)或
(或`p:remoteCommand),并将div的内容(或属性值)作为参数传递给服务器端方法o:commandScript