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