【问题标题】:How is using "<%=request.getContextPath()%>" better than "../"如何使用 "<%=request.getContextPath()%>" 比 "../" 更好
【发布时间】:2013-11-12 12:34:49
【问题描述】:

我参与过许多视图层为 JSP 的 J2EE 项目。在大多数项目中,我看到我们使用 scriptlet 中的 contextPath 引用外部资源,即图像、javascript、jsp、css 等。

代码如下,

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>GC Demo Using HandlebarsJS</title>
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/jqueryUI-AutoComplete/jquery-1.9.1.js"></script>
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/jqueryUI-AutoComplete/jquery-ui-1.10.3.custom.js"></script>
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/handlebarsJS/handlebars.js"></script>
    <link rel="stylesheet" type="text/css" href="${pageContext.servletContext.contextPath}/js/jqueryUI-AutoComplete/jquery-ui-1.10.3.custom.css">

从上面的 jsp 中,我在这里导入了在我的同一个项目包中的外部资源,即在我的战争中。

现在上面的JSP可以写成下面的代码了,

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>GC Demo Using HandlebarsJS</title>
    <script type="text/javascript" src="../js/jqueryUI-AutoComplete/jquery-1.9.1.js"></script>
    <script type="text/javascript" src="../js/jqueryUI-AutoComplete/jquery-ui-1.10.3.custom.js"></script>
    <script type="text/javascript" src="../js/handlebarsJS/handlebars.js"></script>
    <link rel="stylesheet" type="text/css" href="../js/jqueryUI-AutoComplete/jquery-ui-1.10.3.custom.css">

在第二个示例中,我也引用了战争中存在的资源。

现在考虑以上两种情况,作为最佳实践,第一种情况具有更大的意义。

为什么?

以及使用第二种情况的缺点是什么?

是否使用第二种情况,我们的项目与上下文路径的耦合更紧密?

请给我解释一下。

【问题讨论】:

  • 第二种情况的上下文路径在哪里?

标签: jsp contextpath


【解决方案1】:

request.getContextPath()- 返回应用程序的根路径,而 ../ - 返回文件的父目录。

您使用 request.getContextPath(),因为它总是指向您的应用程序的根目录。如果要将 jsp 文件从一个目录移动到另一个目录,则无需进行任何更改。 现在,考虑第二种方法。如果要将 jsp 文件从一个文件夹移动到另一个文件夹,则必须在引用文件的每个位置进行更改。

此外,使用 request.getContextPath() 的更好方法是在变量中设置 'request.getContextPath()' 并使用该变量来引用您的路径。

<c:set var="context" value="${pageContext.request.contextPath}" />
<script src="${context}/themes/js/jquery.js"></script>

PS- 这是我能弄清楚的一个原因。不知道还有没有意义。

【讨论】:

  • “${pageContext.servletContext.contextPath}”与您的建议不同吗?应该使用哪一个?为什么?
  • ${pageContext.servletContext.contextPath} 和 ${pageContext.request.contextPath} 将给出相同的 contextPath 除了一个条件,如果 servlet 容器通过多个上下文路径匹配上下文,即您的单个应用程序使用多个上下文路径访问。在这种情况下,建议使用 ${pageContext.servletContext.contextPath}。
  • 另外,使用 request.getContextPath() 的更好方法是在变量中设置 'request.getContextPath()' 并使用该变量来引用您的路径。有人可以强调它的原因吗?
  • @DhruvPal 访问局部变量比访问实例变量更快(可以忽略不计),所以我们可以节省一些时间(stackoverflow.com/questions/21613098/…)。此外,这种方法将帮助您的链接看起来干净。当您在页面上有很多链接时,它会有所帮助。如果你打算只引用一次 contextPath,那么你不应该关心将它设置在一个变量中。但是,当您使用多个它们时,它会有所帮助。在原始帖子中,OP 使用了 即脚本。当然,使用 EL 标签比使用 scriplet 更好。
  • @DhruvPal 是的,如果您使用 Tiles,您可以将变量放在 common.jsp 或默认布局中。是的,它不是很重的方法。如果有的话,性能差异可以忽略不计。
猜你喜欢
  • 2019-11-14
  • 2018-04-29
  • 2011-06-30
  • 2018-05-13
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多