2012-05-31 8 views
8

हम आउटबाउंड यूआरएल के साथ-साथ इनबाउंड वाले को फिर से लिखने के लिए टोमकैट urlrewrite प्लगइन का उपयोग करते हैं। ऐसा करने के लिए, आपको जेएसटीएल टैग का उपयोग करने की आवश्यकता है।क्या कोई जेएसटीएल ईएल (अभिव्यक्ति भाषा) समतुल्य है <c:url/>

यह साफ यूआरएल और i18n के लिए अच्छा काम करता है, लेकिन यह टैग के भीतर टैग सहित बदसूरत कोड,, इस तरह की पैदावार:

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

या:

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

एक वैकल्पिक उपयोग करने के लिए है एक चर, इस तरह:

<c:url value="/nextPage.jsp" var="nextPageUrl"/> 
<a href='${nextPageUrl}' />Next Page</a> 

यह वास्तव में साफ है, लेकिन वर्बोज़ है।

क्या ऐसा करने के लिए कोई अभिव्यक्ति-भाषा अनुकूल तरीका है?

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

धन्यवाद:

मैं इन सबसे छुटकारा की तरह कुछ के लिए उम्मीद की गई थी।

+1

'$ {pageContext.request.contextPath}/nextPage.jsp'? आउटबाउंड के लिए काम नहीं करेगा, लेकिन यह एप्लिकेशन * के भीतर लिंक * साफ बनाता है। –

+0

हालांकि लक्ष्य को हल नहीं करता है। बिंदु पूरे आउटबाउंड लिंक स्वरूपण तर्क के माध्यम से यूआरएल चलाने के लिए है, टोमकैट प्रदान करता है, और आपके द्वारा इंस्टॉल किए गए किसी भी फ़िल्टर, जैसे urlrewrite। इस मामले में हम केवल पूर्ण पथों की तुलना में कुछ अधिक जटिल कर रहे हैं, हम कैश बस्टिंग के लिए बिल्ड संस्करण को शामिल करने के लिए जेएस फाइलों को फिर से लिख रहे थे। – JBCP

उत्तर

0

मैं जिस समाधान के साथ आया था वह सीएसएस और जेएस के लिए समस्या को हल करने के लिए कस्टम टैग का उपयोग करना था। एक समान समाधान भी टैग पर भी लागू किया जा सकता है, हालांकि मुझे अभी तक आवश्यकता नहीं है।

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

सीएसएस टैग इस तरह दिखता है, जावास्क्रिप्ट एक स्पष्ट रूप से बहुत समान है:

<%@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' /> 

अपने jsp में टैग आयात करने के लिए मत भूलना:

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

कस्टम ईएल समाधान क्लीनर कुछ परिस्थितियों में होगा, लेकिन यदि आप अतिरिक्त पैरामीटर या विशेषताओं के लिए समर्थन जोड़ना चाहते हैं, तो शायद टैग जाने का तरीका है।

2

कुछ भी बॉक्स से बाहर है, लेकिन कुछ भी नहीं रोकता है अपने स्वयं के ईएल कार्यों लिखते हैं, और इस प्रकार ऐसा ही कुछ का उपयोग करें:

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

मैं नहीं लग रहा है कि यह मानक सी की तुलना में अधिक पठनीय है : यूआरएल टैग, और यह भी बदतर होगा अगर इसे पैरामीटर नाम और मान स्वीकार करना होगा।

ईएल कार्यों को परिभाषित करने और उपयोग करने के लिए http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html देखें।

+0

धन्यवाद। मेरा लक्ष्य घोंसला वाले टैग से बचने के लिए था। नेस्टेड टैग आईडीई को भ्रमित करते हैं और पढ़ने के लिए बहुत बुरा हैं। मैं सहमत हूं कि उपरोक्त सुपर स्पष्ट नहीं है, लेकिन यह टैग से बेहतर है। मैं इसे देख लूंगा, धन्यवाद। – JBCP

1

कई दृष्टिकोण कहां हैं।

1) आम टुकड़ा में चर से आबद्ध आधार:

common.jspf:

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

या की तरह:

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

और प्रत्येक पृष्ठ में टुकड़ा में शामिल हैं:

<%@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)${pageContext.request.contextPath} हर जगह का उपयोग करें:

<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) मेरी पसंदीदा है:

/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() { } 

} 

: फिल्टर उस विशेषता के लिए आधार में शामिल जोड़ने तथा 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> 

और (ऊपर लेकिन आवश्यकता के बिना की तरह बॉयलरप्लेट टुकड़े शामिल करने के लिए) स्वच्छ सिंटैक्स का उपयोग करें:

<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> 

नोट मुझे लगता है कि फिल्टर में अतिरिक्त विशेषताएं निर्धारित करते हैं, के लिए सीएसएस/जेएस के विकास और minified संस्करण के बीच स्विच करने के लिए उदाहरण:

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); 
} 

और इसी JSP कोड:

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

प्रारंभिक पैरामीटर min minified संस्करण के लिए फॉल-बैक के साथ contex तैनाती डिस्क्रिप्टर में युद्ध फाइल करने के लिए बाहर से में dev या min करने के लिए सेट जब सेट नहीं कर सकता है।

4) एक scriplets का उपयोग करें:

<a href="<%=request.getContextPath()%>/index.html">Home</a> 
संबंधित मुद्दे