TutorialPoint有一个c:url
标记的简单示例,如下所示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title><c:url> Tag Example</title>
</head>
<body>
<a href="<c:url value="/jsp/index.htm"/>">TEST</a>
</body>
</html>
当使用Chrome的开发人员工具查看相应的渲染时,它呈现如下:
<a href="/jsp/index.htm">TEST</a>
所以c:url
标签看似多余,但我确定我错过了什么?
答案 0 :(得分:8)
正如教程要点所说,它是用于格式化目的的 URL ,它可以存储在变量中。< / p>
示例你有:
<a href="<c:url value="/test.html"/>">TEST</a>
如果您点击 TEST ,则会转到第test.html
页。就那么简单。但问题是,<c:url value="/test.html"/>
的价值是什么?
您认为该值仅为/test.html
吗?
尝试测试它,就像这样:
<a href="<c:url value="/test.html" var="testvar" />">TEST</a> // testvar is where you put the url formatted by c:url
<c:out value="${testvar}"/> // you print what is the formatted url
答案将是您项目的上下文文件夹以及您输入的网址。
context /test.html将是输出。
我认为其目的是让context
(当前申请)已经提供给URL
,您只需要添加剩余的URL
部分。
答案 1 :(得分:1)
这是我的训练应用中的一小段代码,其中我使用了<c:url>
标签:
<table>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Email</th>
<th>Action</th>
</tr>
<c:forEach var="student" items="${student_list}">
<c:url var="loadStudentLink" value="StudentControllerServlet">
<c:param name="command" value="load"/>
<c:param name="id" value="${student.id}"/>
</c:url>
<tr>
<td> ${student.firstName} </td>
<td> ${student.lastName} </td>
<td> ${student.email} </td>
<td>
<a href="${loadStudentLink}">Update</a>
</td>
</tr>
</c:forEach>
</table>
在这种情况下,我当然可以使用下面的链接,它是相同的:
<a href="StudentControllerServlet?command=load&id=${student.id}">Update</a>
简而言之,<c:url>
创建了一个普通链接,您可以将其存储在变量中并定义其范围。
使用<c:param>
标签可以为链接设置参数。
另外,有些人可能会说它与JSTL看起来更加整齐。
而且,正如之前所说,<c:url>
已经具有应用程序的上下文路径。
因此,例如,您可以执行此操作
<link rel="stylesheet" href="<c:url value="/resources/css/test.css"/>" />
代替那个
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/test.css" />
我希望你明白我的意思:)
答案 2 :(得分:0)
除了其他答案中已经提到的目的之外,c:url
标记的另一个目的是重写从JSP页面返回的URL。例如会话跟踪。如果用户代理不支持(或已禁用)cookie,则将jsessionid附加到URL。
仅在禁用cookie的情况下,标记才会在URL中包含会话ID;否则,它将返回不变的URL。
请参阅:https://docs.oracle.com/javaee/5/tutorial/doc/bnakh.html#bnakn