【问题标题】:How to send data to server from html component in JSF如何从JSF中的html组件向服务器发送数据
【发布时间】:2012-01-21 23:13:49
【问题描述】:

我的页面中有一个 CKEditor。像这样

<h:head>
    <title>Facelet Title</title>
    <script type="text/javascript" src="ckeditor/ckeditor.js"></script>

    <script language="JavaScript">

        function comeBack(){
            document.getElementById(editorValue).value = this.value;
        }

    </script>

</h:head>

<h:body >

    <h:form id="ckEditorForm" prependId="false" >

        <textarea id="editor1"
                  name="editor1"
                  onblur="alert(document.getElementById(editorValue).value = this.value);">

        </textarea>

        <script type="text/javascript">
            CKEDITOR.replace( 'editor1' );
        </script>

        <h:inputHidden value="#{editorBean.value}" id="editorValue" />

        <h:commandButton id="submit"
                         value="Submit"
                         action="welcome.xhtml" />


    </h:form>

</h:body>

@ManagedBean
@ViewScoped
public class EditorBean {

    private String value;

    /** Creates a new instance of EditorBean */
    public EditorBean() {

    } //end of constructor

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
        System.out.println("Content: "+value);
        System.out.println();

    }

} //end of class EditorBean

现在我希望该用户按下提交按钮,然后将编辑器值保存到我的 bean 中。我在这个论坛上发现了有人建议的这种隐藏域技术,但它不起作用。难道我做错了什么?我怎样才能达到我想要的?

谢谢

【问题讨论】:

标签: javascript html jsf-2


【解决方案1】:

您需要了解 JSF 是一个 HTML 代码生成器,并且 JavaScript 基本上只能访问 HTML DOM 树,而不是 JSF 源代码。

在浏览器中打开页面,右键单击并选择查看源代码。找到生成的&lt;h:inputHidden&gt; 组件的HTML。它看起来像这样:

<input type="hidden" id="ckEditorForm:editorValue" name="ckEditorForm:editorValue" value="" />

请注意id 属性值。你必须在你的 JavaScript document.getElementById()完全使用这个值:

document.getElementById("ckEditorForm:editorValue");

顺便说一句,使用&lt;h:inputTextarea&gt; 更简单:

<h:inputTextarea id="editor1" value="#{editorBean.value}" />
<script>CKEDITOR.replace("ckEditorForm:editor1");</script>

【讨论】:

  • 这不起作用&lt;h:form id="ckEditorForm" prependId="" &gt; &lt;h:inputTextarea id="editor1" value="#{editorBean.value}" /&gt; &lt;script&gt; CKEDITOR.replace("ckEditorForm:editor1"); &lt;/script&gt; &lt;h:commandButton id="save" value="Save" action="welcome.xhtml" /&gt; &lt;/h:form&gt; 它显示的是普通文本区域,而不是 CkEditor
  • 当我查看源代码时,我得到了这个&lt;input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="6713004186034026806:1751224147377468677" autocomplete="off" /&gt;为什么这里的 id 属性不同?
  • 浏览器的JS控制台是否有JS错误?也许您的 ckeditor.js 根本没有加载。视图状态隐藏字段与您的问题完全无关。
  • 您好,问题已解决。应该是&lt;h:inputTextarea id="editor1" value="#{editorBean.value}" /&gt; &lt;script&gt; CKEDITOR.replace("editor1"); &lt;/script&gt; 谢谢:)
  • 对了,你使用的是prependId="false"。我没想到会这样(这通常是一种糟糕的做法)。
【解决方案2】:
client side:
call this function from your component
function send() {
var imageData = "Anand";
//call remotecommand
passToJSFManagedBean([ {
name : 'imagedata',
value : imageData
} ]);
//Prime faces component
<p:remoteCommand name="passToJSFManagedBean"
action="#{guestPhotoRegiCardMB.onCapture()}" process="@this" />

服务器端: onCapture(){ ... String imagedata = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("imagedata"); ...... }

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 2018-09-01
    • 2017-07-21
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2011-12-21
    • 2014-08-14
    相关资源
    最近更新 更多