【发布时间】:2011-04-12 06:33:59
【问题描述】:
一些背景知识:我正在构建一个自定义 JSF 组件。该组件基本上是一个文本编辑器,它应该有一个“保存”按钮,用于保存编辑器的内容字符串。当我使用CodeMirror 库时,我需要使用javascript 从编辑器中获取内容(字符串)并将其发送到服务器。因此,在这种情况下,我不能使用基于 XML 的 JS 调用,例如 f:ajax。
问题:我打算用jsf.ajax.request 发送字符串,但它不直接支持在bean 上调用方法。如何以 AJAX 方式调用带有 JSF 的 bean 中的方法?
至少有两种方法可以解决这个问题:
- 在带有隐藏输入字段的页面中包含一个隐藏表单。从 javascript 更新该输入字段,然后调用 jsf.ajax.request 来发布该表单。如果需要,可以在属性的 getter 或 setter 中调用自定义操作。
- 使用原始的
XMLHttpRequest(或者可能在其他一些 JS 库的帮助下)执行请求。创建一个 servlet 并调用它。
这两种方式都很笨拙,而且后者也超出了 JSF 的范围。
我错过了什么吗?你是怎么做到的?
有一个quite similar question,但给出的答案仅涉及基于 XML 的 AJAX 调用。还有another similar question,不过也指基于XML的AJAX调用。
【问题讨论】:
-
你是如何构建它的?作为
UIComponent或<ui:composition>或<composite:implementation>? -
这个只是建立在
ui:composition之上。基本上我在那里有一个textarea,我在script元素中使用JS 调用进行初始化。我还有一个commandButton,它应该用作保存按钮。为什么,我使用复合组件还是 UIComponents 有关系吗? -
使用
UIComponent,您可以扩展UIInput,JSF 将负责更新模型值。但是再想一想,当涉及到基于 3rd 方 HTML/CSS/JS 的编辑器时,这当然很棘手。您是否考虑过一个完全值得的 JSF 组件?例如。 PrimeFacesp:editor. -
扩展
UIInput的好点,但你可能是对的,在这种情况下这不是一个真正的选择。我快速搜索了现有组件,还找到了p:editor。不幸的是,现有的组件都不适合我们的需求,所以我不得不走这条路。
标签: java javascript ajax jsf jsf-2