Sirviendo recursos javascript / jsf desde una aplicación jsf

Tengo un archivo "/js/ajax-error.js" que me gustaría servir en una "forma richfaces" de la siguiente manera: "/js/ajax-error.js.jsf" para que use ese tipo de variables jsf en mi archivo js: "# {facesContext.externalContext.requestContextPath}".

¿Es eso posible? He intentado prefijar mi archivo js con xhtml: no funciona.

Yo uso richfaces + jsf 2.0 + servlet 3.0

Alguien puede ayudarme porfavor?

(agregado) ¿No hay una limpieza JSF forma de lograr el efecto deseado?

preguntado el 27 de agosto de 11 a las 14:08

2 Respuestas

Es posible hacer eso, pero le sugiero que no lo haga. Mantenga su JavaScript limpio y almacenable en caché.

Un patrón común utilizado para disponer que los datos del lado del servidor estén disponibles para JavaScript es colocar valores en atributos de "datos" en las partes apropiadas del HTML. Por ejemplo, se puede adjuntar información "global" (por ejemplo, cosas sobre la sesión del usuario, como el nombre de usuario, el nombre de la empresa, etc.) <body>:

<body data-username='John Phillip Sousa' data-registered='05 Jul 1903'>

Ahora JavaScript puede averiguar el nombre de usuario y la fecha de registro con solo tomar los atributos de datos del <body> etiqueta. editar Me gusta esto:

var body = document.getElementsByTagName('body')[0];
var username = body.getAttribute("data-username");
var registrationDate = body.getAttribute("data-registered");

Respondido 27 ago 11, 19:08

"Ahora JavaScript puede averiguar el nombre de usuario y la fecha de registro con solo tomar los atributos de datos de la etiqueta. "Gracias. ¿Cómo haces eso? - balteo

Bueno, depende de si está utilizando un marco de JavaScript, pero son solo atributos: actualizaré la respuesta. - Puntiagudo

Si su único propósito es servirlo "al estilo Richfaces" (en realidad es el método JSF 2.0), utilice <h:outputScript>. Pon el archivo en /resources/js/ajax-error.js de contenido web público (la ruta principal /resources es obligatorio y su nombre no se puede cambiar). Luego haga referencia a él de la siguiente manera:

<h:outputScript name="js/ajax-error.js" />

Independientemente de su ubicación en la plantilla, se generará en el HTML <head> como sigue asumiendo que tu FacesServlet está mapeado en *.jsf:

<script type="text/javascript" src="/contextname/javax.faces.resource/js/ajax-error.js.jsf"></script>

¡Pero eso no le ofrece apoyo EL! No podrás usar #{} en ese guión. Solo en hojas de estilo incluidas por <h:outputStylesheet> los #{} es compatible con el fin de localizar imágenes de fondo el JSF 2.0 #{resource['logo.png']} manera, pero nada más que eso.

En su caso particular, prefiero hacer referencia #{facesContext.externalContext.requestContextPath} (o su contraparte más corta y popular #{request.contextPath}) en el HTML <base> etiqueta o alguna variable JS global o el HTML data atributo. Si se establece como <base>, todos los enlaces relativos serán relativos a él, también en JS.

Ver también:

Respondido el 20 de junio de 20 a las 12:06

Gracias BalusC. ¿Puede explicar cómo se utiliza el etiqueta y la variable js global? - balteo

Consulte el enlace "Ver también" para <base> ejemplo. En cuanto a la variable JS global, simplemente agregue algo como <script>var base = '#{request.contextPath}';</script> para usted <head>. Estará disponible como variable global base en todos los JavaScripts que se invocan después de inicializar esa línea. - BalusC

Gracias. OK veo. Me doy cuenta de que no incluí suficiente información sobre mi problema y creo que sería más apropiado abrir un segundo hilo. - balteo

Woah, estaba tratando de obtener el contexto en Javascript con algo como window.location.pathname.split ('/') [1] == ''? '': '/'+window.location.pathname.split('/')[1]; que, por supuesto, tenía fallas. var base = '#{request.contextPath}'; ¡es genial! - Nada

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.