JSP - 在c:import中使用变量作为url

时间:2011-07-18 14:33:55

标签: jsp jstl

我们是否可以在JSP中的<c:import>语句中使用变量,例如: <c:import url="<%=_header%>"></c:import>,其中_header是由此定义的JSP字符串;

// host will typically equal: uk.domain.com or fr.domain.com
String host = request.getServerName();
// cc is attempting to become the country code for the domain
String cc = host.substring(0, host.indexOf("."));

String _header = "http://assets.domain.com/" + cc + "/includes/header_" + cc + ".jsp";

我们在多个市场中托管了多个网站。能够以这种方式定义一个模板将是理想的,因为这意味着对模板的更改更少。不幸的是,无论何时包括<c:import url="<%=_header%>"></c:import>,服务器都无法加载页面。

但是包括,例如: <c:import url="http://assets.domain.com/uk/includes/header_uk.jsp?market=<%=cc%>"></c:import> 似乎工作得很好......

有什么想法吗?!


编辑:结果显示网址中的<%=cc%> var实际上并未正常工作。不得不做以下事情而不是让它发挥作用;

String cc = host.substring(0, host.indexOf("."));
session.setAttribute("cc", cc);

...

<c:import url="http://assets.domain.com/uk/includes/header_uk.jsp"><c:param name="market">${cc}</c:param></c:import>

还没有解决变量网址问题,但是......

1 个答案:

答案 0 :(得分:2)

您无法可靠地将 scriptlet 与taglibs / EL混合使用。它们在不同的时刻和范围内运行。您应该选择使用其中一个。自从JSP 2.0(2003年11月发布)以来, scriptlets 的使用正式discouraged,我建议完全放弃它并继续使用taglibs / EL。

以下 scriptlet

<%
    // host will typically equal: uk.domain.com or fr.domain.com
    String host = request.getServerName();
    // cc is attempting to become the country code for the domain
    String cc = host.substring(0, host.indexOf("."));
%>

可以替换为以下taglib / EL:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<c:set var="cc" value="${fn:split(pageContext.request.serverName, '.')[0]}" />

以便EL中的${cc}可用。

<c:import url="http://assets.domain.com/${cc}/includes/header_${cc}.jsp" />