今天在弄JSTL标签的时候,用到了<c:redirect>重定向标签的时候遇到一个很是蛋疼的问题,就是当我测试完成这个标签的时候,我想测试其他的内容,由于它是重定向的(浏览器地址会发生改变的),这样肯定会影响我后面的测试,于是我就想把这行代码注释了:
<!–<c:redirect url=”/include.jsp”></c:redirect>–>
然后测试其他的内容了,但是问题来了,我每次刷新浏览器的时候,还是重定向了,我就纳闷了,这句话不是注释了吗?怎么还是执行了,然后我就把这句话删除了,这时候就好了,此时就怀疑这个注释到底有没有用,然后上网查看资料,知道这种注释对于Jsp是没有用的,它是html/xml的原版注释,应该使用
<%–<c:redirect url=”/include.jsp”></c:redirect>–%>
这个注释就可以了,随后又想起来了,还有Java中原版注释://和/**/,其实也可以这样注释的:
<%//–<c:redirect url=”/include.jsp”></c:redirect>–%>,
这个和上面的两种有什么区别呢?这时候就可能需要jsp的执行过程了,这里就简单说一下:每个jsp页面都会被jsp引擎翻译成servlet.java的,具体内容可以到tomcat目录下的work文件夹中的项目工程中找到对应的文件,所以最后一种注释是彻底的注释了,因为他在servlet.java中就被注释了,而前面的两种注释在servlet.java代码中是没有被注释的,下面就是servlet.java中的代码片段:
使用<%//….%>注释的:
out.write(" -->\r\n"); out.write(" <br><br>\r\n"); out.write(" \r\n"); out.write(" <!-- c:redirect标签的使用:重定向打开include.jsp页面 -->\r\n"); out.write(" "); //<c:redirect url="/include.jsp"></c:redirect>
这里可以看到,这句话直接被注释了,即:Jsp中<%…%>中的内容会原封不动的翻译成servlet.java
使用<%—-%>注释的:
out.write(" -->\r\n"); out.write(" <br><br>\r\n"); out.write(" \r\n"); out.write(" <!-- c:redirect标签的使用:重定向打开include.jsp页面 -->\r\n"); out.write(" ");
使用<!—->注释的:
out.write(" -->\r\n"); out.write(" <br><br>\r\n"); out.write(" \r\n"); out.write(" <!-- c:redirect标签的使用:重定向打开include.jsp页面 -->\r\n"); out.write(" <!--"); if (_jspx_meth_c_005fredirect_005f0(_jspx_page_context)) return;
综上所述可以发现,原因可能在于那段代码:
if (_jspx_meth_c_005fredirect_005f0(_jspx_page_context))
return;
这个方法是针对redirect标签的做判断的,所以原因就在这个方法内部,可以自行查看,需要注意的是,如果使用<%…%>和<%—-%>的话,servelet.java中是没有这个方法的,这一点更能说明为什么<!—->注释没有效果了!
总结:
1.第一种注释:
<!–注释内容–>
这是HTML/XML的原版注释,会老老实实的发到客户端的,有什么见不得人的就别用这个写了
2.第二种注释:
<%–注释内容–%>
有<% %>的东西都是写给JSP应用服务器看的,不会发到客户端的。编译器将其置之不理,html也无缘与其相见,被应用服务器打入冷宫了。这个注释感觉比较多余,不知道专门又搞一个这种注释干什么。
3.第三种注释:
<%
//当行注释
/**
多行注释
*/
%>