【问题标题】:Get the URL of current XHTML page which has user data filled in the form into the JSF Managed bean获取当前 XHTML 页面的 URL,该页面在 JSF Managed bean 中填写了表单中的用户数据
【发布时间】:2012-10-05 23:29:35
【问题描述】:
我正在使用 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();
【问题讨论】:
标签:
url
session
jsf-2
itext
【解决方案1】:
只有当持有与视图关联的模型数据的托管 bean 存储在会话范围内时,您的 Jsoup 方法才有效。 Jsoup 正在触发一个全新的 HTTP GET 请求,这意味着它会在请求或视图范围 bean 的情况下获得一个全新且完全不同的实例,所有属性都设置为默认值。
如果你想让你的 bean 保持在请求或视图范围内(非常合理),那么你需要在 Jsoup 调用之前将模型数据临时放入会话中,并在 Jsoup 调用之后将其移除。
您的另一个错误是您将JSESSIONID URL 路径片段大写。它区分大小写,实际上应该全部小写: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");
// ...
}
}