2013-07-25 22 views
3

作为对Ajax请求的响应,我想要立即返回在客户端上执行的Javascript。 我试过这样,但它不工作:如何将Javascript作为部分响应返回?

<html xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html"> 
<h:head></h:head> 
<h:body> 
    <h:form> 
     <h:commandButton value="js"> 
      <f:ajax event="click" listener="#{myBean.js}"/> 
     </h:commandButton> 
    </h:form> 
</h:body> 
</html> 

豆:

package mypackage; 

import javax.faces.context.ExternalContext; 
import javax.faces.context.FacesContext; 
import javax.faces.context.PartialResponseWriter; 
import javax.inject.Named; 

@Named 
public class MyBean { 

    public void js() { 
     System.out.println("called"); 
     FacesContext ctx = FacesContext.getCurrentInstance(); 
     ExternalContext extContext = ctx.getExternalContext(); 
     if (ctx.getPartialViewContext().isAjaxRequest()) { 
      try { 
       extContext.setResponseContentType("text/xml"); 
       extContext.addResponseHeader("Cache - Control ", "no - cache"); 
       PartialResponseWriter writer = ctx.getPartialViewContext() 
         .getPartialResponseWriter(); 
       writer.startDocument(); 
       writer.startEval(); 
       writer.write("alert(’Works!’);"); 
       writer.endEval(); 
       writer.endDocument(); 
       writer.flush(); 
       ctx.responseComplete(); 
      } catch (Exception e) { 
       System.out.println(e); 
      } 
     } 
    } 
} 
+0

响应将是Javascript文本。你需要通过它,评估它。 但这将是危险的,为什么不只是从JSON获取明确的数据,并基于此做一些事情,并保持Java脚本在客户端? –

+0

@Amogh:如果它包含内联的用户控制输入,那将是危险的。目前,它只是在服务器中进行硬编码。 – BalusC

回答

5
writer.write("alert(’Works!’);"); 

弯引号不是JS有效的字符串分隔符。使用直引号。

writer.write("alert('Works!');"); 

无关的具体问题,根据您的问题记录你使用PrimeFaces,或至少熟悉它。在这种情况下,只需使用RequestContext#execute()而不是这个混乱。

相关问题