2012-05-31 7 views
8

Utilizziamo il plugin tomcat urlrewrite per riscrivere gli URL in uscita e quelli in entrata. Per fare ciò, è necessario utilizzare il tag JSTL.Esiste un JSTL EL (linguaggio di espressione) Equivalente a <c:url/>

Questa grande opera per gli URL semplificati e i18n, tuttavia produce codice brutto, compresi i tag-within-tag, in questo modo:

<link href='<c:url value="/content/bootstrap/css/bootstrap.css" />' rel="stylesheet" /> 

o:

<a href='<c:url value="/nextPage.jsp"/>' />Next Page</a> 

Un'alternativa è quella di utilizzare una variabile, come questa:

Questo è veramente pulito, ma dettagliato.

Esiste un modo di esprimersi in un linguaggio amichevole?

mi è stato sorta di speravo in qualcosa di simile:

<a href='${url "/nextPage.jsp}' />Next Page</a> 

Grazie.

+1

'$ {} pageContext.request.contextPath/nextPage.jsp'? Non funzionerà in uscita, ma rende i collegamenti * entro * l'applicazione abbastanza pulita. –

+0

che però non risolve l'obiettivo. il punto è di eseguire l'url attraverso l'intera logica di formattazione dei link in uscita fornita da Tomcat e tutti i filtri installati, come urlrewrite. In questo caso stiamo facendo qualcosa di più complicato dei percorsi assoluti, stavamo riscrivendo file js per includere la versione build per il busting della cache. – JBCP

risposta

0

La soluzione alla fine è stata utilizzare tag personalizzati per risolvere il problema di CSS e JS. Una soluzione simile potrebbe essere applicata anche ai tag, anche se non ne ho ancora avuto la necessità.

<my:csslink url="/css/custom.css" /> 
<my:script url="/script/myscript.js" /> 

Il tag CSS assomiglia a questo, il Javascript uno è ovviamente molto simile:

<%@tag language="java" pageEncoding="UTF-8"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 

<%@attribute name="url" required="true" type="java.lang.String" description="the absolute (to the webapp) path of the css file"%> 
<c:url var="encUrl" value='${url}' /> 
<link href='${encUrl}' rel='stylesheet' /> 

Non dimenticare di importare i tag nel jsp:

<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %> 

Il costume La soluzione EL sarebbe più pulita in alcune circostanze, ma se si desidera aggiungere supporto per parametri o attributi aggiuntivi, un tag è probabilmente la strada da percorrere.

2

Non c'è nulla fuori dalla scatola, ma nulla vieta di scrivere le proprie funzioni EL, e quindi usare qualcosa di simile:

<a href='${myFn:url("/nextPage.jsp")}' />Next Page</a> 

Non mi sento che è più leggibile rispetto alla standard C : url tag, e sarebbe anche peggio se dovesse accettare nomi e valori di parametri, però.

Vedere http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html per come definire e utilizzare le funzioni EL.

+0

Grazie. Il mio obiettivo era evitare di avere tag nidificati. I tag nidificati confondono gli IDE e sono piuttosto sgradevoli da leggere. Sono d'accordo che quanto sopra non è super chiaro, ma è meglio di un tag. Lo esaminerò, grazie. – JBCP

1

Dove ci sono diversi approcci.

1) Base Bind variabile nel frammento comune:

common.jspf:

<%@tag language="java" pageEncoding="UTF-8"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<c:url value="/" var="base"/> 

o simili:

<c:set var="base" value="${pageContext.request.contextPath}"/> 

e includono frammento in ogni pagina:

<%@include file="base.jspf"%> 
<script src="${base}/js/jquery.js"></script> 
<link href="${base}/css/bootstrap.css" rel="stylesheet" type="text/css"> 
<a href="${base}/index.html">Home</a> 

2) Utilizzare${pageContext.request.contextPath} ovunque:

<script src="${pageContext.request.contextPath}/js/jquery.js"></script> 
<link href="${pageContext.request.contextPath}/css/bootstrap.css" rel="stylesheet" type="text/css"> 
<a href="${pageContext.request.contextPath}/index.html">Home</a> 

3) è il mio preferito: aggiungere filtro che includono di base per l'attributo:

/src/java/company/project/web/filter/BaseFilter.java

import java.io.IOException; 
import javax.servlet.*; 

/** 
* Make sane JSP, instead of: 
* <pre>&lt;a href="&lt;c:url value='/my/path/${id}.html'/&gt;"&gt;Title&lt;/a&gt;</pre> 
* allow to use: 
* <pre>&lt;a href="${ctx}/my/path/${id}.html"&gt;Title&lt;/a&gt;</pre> 
*/ 
public class BaseFilter implements Filter { 

    @Override 
    public void init(FilterConfig fc) { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     request.setAttribute("base", request.getServletContext().getContextPath()); 
     chain.doFilter(request, response); 
    } 

    @Override 
    public void destroy() { } 

} 

e registrare che il filtro in web.xml:

<filter> 
    <filter-name>BaseFilter</filter-name> 
    <filter-class>company.project.web.filter.BaseFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>BaseFilter</filter-name> 
    <url-pattern>*.htm</url-pattern> 
    <url-pattern>*.json</url-pattern> 
</filter-mapping> 

e utilizzare la sintassi pulita (come sopra, ma senza necessità di inserire frammenti boilerplate):

<script src="${base}/js/jquery.js"></script> 
<link href="${base}/css/bootstrap.css" rel="stylesheet" type="text/css"> 
<a href="${base}/index.html">Home</a> 

NOTA ho impostato attributi aggiuntivi in ​​quel filtro, per esempio per passare dallo sviluppo alla versione minificata di CSS/JS:

private String min; 

@Override 
public void init(FilterConfig fc) { 
    min = fc.getServletContext().getInitParameter("min"); 
    if (min == null) 
     min = fc.getInitParameter("min"); 
    if (min == null) 
     min = "min"; 
} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    request.setAttribute("ctx", request.getServletContext().getContextPath()); 
    request.setAttribute("min", min); 
    chain.doFilter(request, response); 
} 

e corrispondente codice JSP:

<script src="${base}/js/jquery.${min}.js"></script> 
<link href="${base}/css/bootstrap.${min}.css" rel="stylesheet" type="text/css"> 

parametro iniziale min possono fissare a dev o min in esternamente al file WAR in contex descrittore di distribuzione con ripiegare versione minimizzato quando non impostato.

4) Utilizzare uno scriplet:

<a href="<%=request.getContextPath()%>/index.html">Home</a> 
Problemi correlati