1

在我的 Facelets 页面中,我有一个<div>并且包含一些输入文本框,供用户输入要提交的值。我将使用这个 HTML 源代码生成 PDF。

<div id="wrapper">
    <h:form prependId="false">
        <h:inputHidden id="source" value="#{bean.source}" />
        <h:inputText id="fName" value="#{bean.firstName}"/>
        <h:inputText id="lName" value="#{bean.lastName}"/>
        <h:inputText id="age" value="#{bean.age}"/>
    </h:form>
</div>

像这样我也有其他表单域。当用户在表单中输入所有数据并单击提交按钮时,我正在<div>使用 JavaScript 获取其中的源代码。

function getHtml() {
    document.getElementById('source').value = document.getElementById('wrapper').innerHTML;
}

并在点击提交时传递给 bean。

<h:commandButton type="submit" id="appl-submit" action="#{bean.submit}"
                 value="Submit" onclick="javascript:getHtml();"/>

在支持 bean 类中

@ManagedBean
@SessionScoped
public class Bean{

    private String firstName;
    private String lastName;
    private int age;
    private String source;

    // Getters and setters for all properties.
}

但我只得到带有空输入字段的表单,而不是 HTML 源以及用户输入的值。如何获取 HTML 源代码和表单值?

4

1 回答 1

1

但我只得到带有空输入字段的表单,而不是 HTML 源以及用户输入的值。

这是预期的行为。这种方法仅在您已经提交表单并因此重新显示提交的表单(作为确认)时才有效。


如何获取 HTML 源代码和表单值?

这已经在您之前从未给出反馈的问题中得到了回答:获取当前 XHTML 页面的 URL,该页面将用户数据填写到 JSF Managed bean中。在您的特定情况下,这甚至可以更简单地完成,因为您显然已经有了一个会话范围的 bean(但是这仍然是糟糕的设计,因为同一会话中多个浏览器窗口/选项卡中的同一页面可能会相互干扰):

public void submit() throws IOException {
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
    HttpSession session = (HttpSession) externalContext.getSession(true);
    String url = request.getRequestURL().append(";jsessionid=").append(session.getId()).toString();

    Document doc = Jsoup.connect(url).get();
    String html = doc.select("#wrapper").html();
    // ...
}
于 2012-11-28T13:51:44.597 回答