根据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("/"))%>"/>
答案 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>
循环播放。