问题用ajax刷新验证码

时间:2011-05-11 18:18:07

标签: java ajax jsf facelets primefaces

我在我的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吗?

1 个答案:

答案 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.