如何在jstl代码中混合href

blu*_*sky 4 jstl

当我使用下面的jstl代码

  <a href="http://mysite.com?id="<c:out value="${myid}"/>/><c:out value="${myid}"/></a> 
Run Code Online (Sandbox Code Playgroud)

输出是:

"1234"

值1234对应于myid的变量值,但生成的url是" http://mysite.com?id= ",因此myid的值不会作为href的一部分生成.

如何修改href以显示整个href:

" http://mysite.com?id=1234 "

代替 :

" http://mysite.com?id= "

Bal*_*usC 22

最终,JSP/JSTL生成HTML.你熟悉基本的HTML,对吧?

通过右键单击浏览器中的View Source,仔细查看生成的HTML输出.你会看到的:

<a href="http://mysite.com?id="1234/>1234</a> 
Run Code Online (Sandbox Code Playgroud)

这是有效的 HTML吗?不,您"在错误的地方过早关闭属性值,并且您很快就会关闭标记/>.看,Stack Overflow HTML语法荧光笔也搞糊涂了.相反,应该是:

<a href="http://mysite.com?id=1234">1234</a> 
Run Code Online (Sandbox Code Playgroud)

相应地修复HTML生成器(即JSP/JSTL代码),以便生成所需的HTML:

<a href="http://mysite.com?id=<c:out value="${myid}"/>"><c:out value="${myid}"/></a> 
Run Code Online (Sandbox Code Playgroud)

具体问题无关,<c:out>只有在重新显示用户控制的输入时才有助于防止XSS攻击漏洞,实际上是错误的内联URL参数工具.如果你可以保证它${myid}总是一个数字(因为它是一个Long或多个Integer),你甚至可以完全放弃它,使代码更漂亮:

<a href="http://mysite.com?id=${myid}">${myid}</a> 
Run Code Online (Sandbox Code Playgroud)

${myid}但是,如果不能保证是一个数字(因为它是a String),那么你应该使用<c:url>并对其<c:param>进行正确的URL编码:

<c:url value="http://mysite.com" var="myURL">
    <c:param name="id" value="${myid}" />
</c:url>
<a href="${myURL}"><c:out value="${myid}" /></a>
Run Code Online (Sandbox Code Playgroud)