JSP入门:include指令与jsp:include动作标志

初学JSP时碰到两个看似没有什么差别include指令与jsp:include动作标志。

这两个指令看上去没什么不同,但其实是存在很大差别的。

我在初学时新建了一个web项目,并创建了三个jsp页面top.jsp,center.jsp,bottom.jsp.

通过<include file="top.jsp">和<include file="bottom.jsp">在center.jsp中引用

结果在编译的时候报错,不能保存。

而使用<jsp:include oage="top.jsp"/>.....则没有问题。

查阅了《Java Web从入门到精通》,找到了答案:

1.include指令通过file属性指定被包含的文件,并且file属性不支持任何表达式;<jsp:include>动作标志通过page属性置顶被包含的文件,而且page属性支持JSP表达式。

2.使用include指令时,被包含的文件内容会原封不动地插入到包含页中,然后JSP编译器再将合成后的文件最终编译成一个Java文件;使用<jsp:include>动作标志包含文件时,当标志被执行时,程序将会请求转发(注意是转发,而不是请求重定向)到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页继续执行后面的代码。因为服务器执行的是多个文件,所以JSP编译器会分别对这些文件进行编译。

3.在应用include指令包含文件时,由于被包含的文件最终会生成一个文件,所以被包含文件、包含文件中不能有重名的变量或者方法;而在应用<jsp:include>动作标志包含文件时,由于每个文件都是单独编译的,所以在被包含文件中重名的变量和方法都是不相冲突的。


也就是说。include指令实际上是把我所创建的三个页面的代码都给拼到了一起。实际上就会重复 这样能不报错么?

而使用jsp:include相当于<frame src>,并非强制性的拼凑,而是各干各的,互不影响。所以才能运转正常。

对于有强迫症的朋友,这里提供使用include指令的解决方法。就是把jsp页面<html>标签前面的两个地方代码给删掉

1:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

2:
    <base href="<%=basePath%>">



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章