2013-07-25 2 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 текста. вам нужно передать его через, eval, чтобы оценить его. , но это будет опасно, почему бы вам просто не получить данные из json и не сделать что-то на этом основании и сохранить java-скрипт в клиенте? –

+0

@Amogh: Это опасно, если он содержит встроенный пользовательский вход. В настоящее время он просто жестко закодирован на сервере. – BalusC

ответ

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

Фигурные кавычки не является допустимой строкой разделителем в JS. Используйте прямые кавычки.

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

Unrelated к конкретной проблеме, основанный на истории вопроса вы используете PrimeFaces или, по крайней мере, знакомы с ним. В этом случае просто используйте RequestContext#execute() вместо этого беспорядка.

Смежные вопросы