我在我的JSF页面中使用验证码(不是重新收集或随机生成的图像值等)。最初它从CaptchaServlet
获得其值。我想添加“刷新图像”按钮而不刷新整个页面,但下面的代码不起作用。
<h:panelGrid id="grid" columns="1" style="margin-bottom:10px">
<h:graphicImage id="capimg" value="#{facesContext.externalContext.requestContextPath}/../Captcha.jpg"/>
</h:panelGrid>
PrimeFaces <p:commandButton>
<p:commandButton value="This" process="@this" update="grid" onclick="#{facesContext.externalContext.requestContextPath}/../Captcha.jpg"/>
刷新整个页面。
你有什么建议吗?我可以使用托管bean并转发到servlet吗?
答案 0 :(得分:2)
<p:commandButton>
使用Ajax异步更新页面的某些部分。但是,它需要包含所有必需的JavaScript库来完成所有Ajax工作。如果主模板中有<h:head>
而不是<head>
,则会自动执行此操作。然后,JSF 2.0资源管理将包含必要的<script>
元素。如果您已经阅读了服务器日志,那么您应该注意到由于<h:head>
丢失而导致失败的警告。
以下是最小的JSF 2.0 Facelet主模板的样子,并声明了PrimeFaces taglib:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.som/jsf/core"
xmlns:h="http://java.sun.som/jsf/html"
xmlns:ui="http://java.sun.som/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<title>Page title</title>
</h:head>
<h:body>
<h1>Put your content here</h1>
</h:body>
</html>
请注意<h:head>
和<h:body>
,而不是<head>
和<body>
。在Web浏览器中右键单击生成的HTML页面,然后选择查看源。您应该在其中看到包含的<script>
元素。
更新:摆脱onclick
属性。它不是有效的JavaScript代码。此外,您还需要确保webbrowser不缓存带有图像的servlet响应。您可以通过添加以下标题之前将任何位写入响应:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.