是否静态包含jsp调用它的jsp的名称?

时间:2015-06-25 20:39:50

标签: jsp

根据Google的建议,我希望每个页面都能列出该页面的替代语言版本

即index.jsp

<head>
<link rel="alternate" hreflang="en" href="http://www.widget.net/en/index.jsp" />
<link rel="alternate" hreflang="es" href="http://www.widget.net/es/index.jsp" />
<link rel="alternate" hreflang="de" href="http://www.widget.net/de/index.jsp" />

和buy.jsp

<head>
<link rel="alternate" hreflang="en" href="http://www.widget.net/en/buy.jsp" />
<link rel="alternate" hreflang="es" href="http://www.widget.net/es/buy.jsp" />
<link rel="alternate" hreflang="de" href="http://www.widget.net/de/buy.jsp" />

但是头文件对于所有文件都是相同的文件,因为我们在调用jsp中执行静态包含

<%@ include file="/layout/inc/head.jsp" %>

我的问题是,head.jsp是否有办法确定包含它的jsp,而不必将其作为参数传递给名称,这样我就可以参数化head.jsp而无需修改调用它的所有文件

解决方案

下面提到了一个很好的观点,因为我正在直接调用它,我已经按照以下方式工作了,我使用scriptlet因为Java代码比jsp代码更熟悉。

<link rel="alternate" hreflang="en" href="<%=request.getRequestURL().substring(0,request.getRequestURL().indexOf(language)) + "en" + request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/"))%>"/>
<link rel="alternate" hreflang="es" href="<%=request.getRequestURL().substring(0,request.getRequestURL().indexOf(language)) + "es" + request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/"))%>"/>
    <link rel="alternate" hreflang="de" href="<%=request.getRequestURL().substring(0,request.getRequestURL().indexOf(language)) + "de" + request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/"))%>"/>

1 个答案:

答案 0 :(得分:0)

鉴于直接请求这些JSP文件,没有前端控制器servlet的干预,您可以使用HttpServletRequest#getServletPath()。它返回JSP文件的上下文相关路径,正好是与容器JspServlet匹配的路径。

<c:set var="jsp" value="${pageContext.request.servletPath}" />
...
<link rel="alternate" hreflang="en" href="http://www.widget.net/en${jsp}" />
<link rel="alternate" hreflang="es" href="http://www.widget.net/es${jsp}" />
<link rel="alternate" hreflang="de" href="http://www.widget.net/de${jsp}" />

如果当前请求网址已包含语言部分,您甚至可以使用HttpServletRequest#getRequestURL()获取完整的请求网址并在其上执行一些字符串替换。

<c:set var="url">${pageContext.request.requestURL}</c:set>
<c:set var="languagePath" value="/${language}" />
...
<link rel="alternate" hreflang="en" href="${fn:replace(url, languagePath, '/en')}" />
<link rel="alternate" hreflang="es" href="${fn:replace(url, languagePath, '/es')}" />
<link rel="alternate" hreflang="de" href="${fn:replace(url, languagePath, '/de')}" />

作为建议,将语言重构为List<String>并使用<c:forEach>循环播放。