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

静态包含的jsp是否为调用它的jsp的名称?,jsp,Jsp,按照谷歌的建议,我希望每个页面都列出该页面的其他语言版本 i、 e代表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="alte

按照谷歌的建议,我希望每个页面都列出该页面的其他语言版本

i、 e代表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" />

和for 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" />

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

i、 e


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

解决方案

下面提出了一个很好的观点,因为我直接对它进行了校准,所以我使用Scriptlet,因为它比jsp代码更熟悉Java代码

<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("/"))%>"/>

鉴于这些JSP文件是直接请求的,无需前端控制器servlet的干预,因此您可以使用。它返回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}" />

建议将这些语言重构成一个
列表
,并使用
对其进行循环,因为这些JSP文件是直接请求的,无需前端控制器servlet的干预,您可以使用它。它返回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}" />

建议将这些语言重构成一个
列表
,并使用

对其进行循环。答案取决于通常如何请求这些索引/购买JSP文件。给定备用URL,我是否可以假设它们是直接请求的,而不需要前端控制器servlet的干预?换句话说,这个表达式
${pageContext.request.requestURL}
已经打印出感兴趣的JSP文件的完整URL?@BalusC,谢谢,这很有帮助。这只是一个排除一个和另一个的问题,以便准备正确的答案。好的,如果但是出于兴趣如果有前端控制器,您会采取什么方法,
getRequestURL()
getServletPath()
等将指向JSP本身,而不是前端控制器。因此,在例如
getRequestURL()
的情况下,您需要获取“浏览器地址栏URL”作为请求属性,并使用
RequestDispatcher.FORWARD\u request\u URI
。答案取决于通常如何请求这些索引/购买JSP文件。给定备用URL,我是否可以假设它们是直接请求的,而不需要前端控制器servlet的干预?换句话说,这个表达式
${pageContext.request.requestURL}
已经打印出感兴趣的JSP文件的完整URL?@BalusC,谢谢,这很有帮助。这只是一个排除一个和另一个的问题,以便准备正确的答案。好的,如果但是出于兴趣如果有前端控制器,您会采取什么方法,
getRequestURL()
getServletPath()
等将指向JSP本身,而不是前端控制器。因此,在例如
getRequestURL()
的情况下,您需要获取“浏览器地址栏URL”作为请求属性,并使用
RequestDispatcher.FORWARD\u request\u URI
键控。
<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')}" />