如何使用"<%= request.getContextPath()%>"比"../"更好

Rah*_*ran 25 jsp contextpath

我参与了许多J2EE项目,其中视图层是JSP.在大多数项目中,我已经看到我们使用scriptlet中的contextPath引用外部资源,即images,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">
Run Code Online (Sandbox Code Playgroud)

从上面的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">
Run Code Online (Sandbox Code Playgroud)

在第二个例子中,我也引用了战争中的资源.

现在考虑上述两种情况,第一种情况作为最佳实践被赋予更多意义.

为什么?

使用第二种情况有什么缺点?

使用第二种情况,我们的项目是否与contextpath更紧密地结合在一起?

请向我解释.

Sud*_*SMD 54

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>
Run Code Online (Sandbox Code Playgroud)

PS-这是我能弄明白的原因之一.不知道它是否有任何意义.

  • @DhruvPal访问本地变量比访问实例变量更快(可忽略不计),因此我们可以节省一些时间(http://stackoverflow.com/questions/21613098/java-local-vs-instance-variable-access-speed).此外,这种方法将帮助您的链接看起来干净.当您在页面上有大量链接时,它会有所帮助.如果您只想引用一次contextPath,那么就不应该关心在变量中设置它.但是,当你多次使用它时,它会有所帮助.在原始帖子中,OP使用<%= request.getContextPath()%>即scriplet.当然,使用EL标签而不是scriplet是更好的方法. (2认同)