jstl 的 c:url 标签的用途是什么?
What is the purpose of jstl's c:url tag?
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
标签似乎是多余的,但我确定我遗漏了什么?
正如教程要点所说,它是为了 格式化 目的 URL 您输入并可以存储在 变量.
例如你有这个:
<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
答案将是您项目的上下文文件夹[=41=]加上您输入的URL。
context/test.html 将是输出。
我认为它的目的是让context
(当前申请)已经给了URL
,你只需要添加剩余的URL
部分。
这是我使用 <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>
当然在这种情况下,我可以只使用下面的 link,结果是一样的:
<a href="StudentControllerServlet?command=load&id=${student.id}">Update</a>
简而言之,<c:url>
创建一个普通的 link,您可以将其存储在变量中并定义其范围。
使用 <c:param>
标签,您可以为 link 设置参数。
另外,有人说用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" />
除了其他答案中已经提到的目的之外,c:url
标记的另一个目的是重写从 JSP 页面返回的 URLs。例如会话跟踪。如果用户代理不支持(或已禁用)cookie,则 jsessionid 将附加到 URL.
The tag includes the session ID in the URL only if cookies are disabled; otherwise, it returns the URL unchanged.
参见:https://docs.oracle.com/javaee/5/tutorial/doc/bnakh.html#bnakn
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
标签似乎是多余的,但我确定我遗漏了什么?
正如教程要点所说,它是为了 格式化 目的 URL 您输入并可以存储在 变量.
例如你有这个:
<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
答案将是您项目的上下文文件夹[=41=]加上您输入的URL。
context/test.html 将是输出。
我认为它的目的是让context
(当前申请)已经给了URL
,你只需要添加剩余的URL
部分。
这是我使用 <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>
当然在这种情况下,我可以只使用下面的 link,结果是一样的:
<a href="StudentControllerServlet?command=load&id=${student.id}">Update</a>
简而言之,<c:url>
创建一个普通的 link,您可以将其存储在变量中并定义其范围。
使用 <c:param>
标签,您可以为 link 设置参数。
另外,有人说用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" />
除了其他答案中已经提到的目的之外,c:url
标记的另一个目的是重写从 JSP 页面返回的 URLs。例如会话跟踪。如果用户代理不支持(或已禁用)cookie,则 jsessionid 将附加到 URL.
The tag includes the session ID in the URL only if cookies are disabled; otherwise, it returns the URL unchanged.
参见:https://docs.oracle.com/javaee/5/tutorial/doc/bnakh.html#bnakn