2013-07-25 24 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()而不是這個混亂。

相關問題