0

我正在使用 JSF 2.0 和 iText 从 XHTML 创建 PDF。该页面是简单的注册表单。当用户在页面中输入所有数据并单击提交时,我必须将用户输入值的整个 HTML 页面源获取到 bean 中。我使用 Jsoup 来获取 HTML,但我只得到 HTML 源而不是用户输入的值。我该怎么做?

我目前的代码是

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        HttpSession session = (HttpSession) externalContext.getSession(true);
        String url = "http://localhost:8080/Pro/faces/part1.xhtml;JSESSIONID=" + session.getId();
        try {
        Document doc = Jsoup.connect(url).get();
4

1 回答 1

2

仅当持有与视图关联的模型数据的托管 bean 存储在会话范围中时,您的 Jsoup 方法才有效。Jsoup 正在触发一个全新的 HTTP GET 请求,这意味着它会在请求或视图范围 bean 的情况下获得一个全新且完全不同的实例,所有属性都设置为默认值。

如果您想将 bean 保留在请求或视图范围内(非常合理),那么您需要在 Jsoup 调用之前将模型数据临时放入会话中,并在 Jsoup 调用之后将其删除。

您的另一个错误是您将JSESSIONIDURL 路径片段大写。它区分大小写,实际上应该全部小写:jsessionid.

所以,总而言之,如果你想保持你的 bean 请求或视图范围,这应该做:

@ManagedBean
@ViewScoped
public class Bean {

    @ManagedProperty("#{beanModel}") // Must match (unique!) session attribute name.
    private Model model;

    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();

        session.setAttribute("beanModel", model);
        Document doc = Jsoup.connect(url).get();
        session.removeAttribute("beanModel");

        // ...
    }

}
于 2012-10-16T19:02:20.337 回答