再说<%@ include file=""%>静态包含和<jsp:include page=” ”>动态包含区别之前要明白两个概念
jsp翻译阶段:
我们知道,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet,然后执行这个servlet来完成的。服务器需要一个jsp容器来处理jsp页面。jsp容器通常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的所有请求。
Jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类JSP Page implementation class),并编译这个servlet。这两步就构成了翻译阶段.
jsp请求处理阶段:
Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文件
这两个概念对于我们的问题有什么关系呢,接着来分析
现在有两个页面a.jsp ,b.jsp.
a.jsp代码:
<%@page contentType="text/html;charset=GBK"%>
this is aa.jsp
<%@ include file ="bb.jsp"/>
b.jsp代码:
<%@page contentType="text/html;charset=GBK"%>
<%
String name="我是bb.jsp页面。";
%>
<%=name%>
a.jsp中包含如下
<%@ include file="b.jsp"%>此方法涉及jsp翻译阶段的概念,jsp的翻译阶段的概念我理解再一步就能表示编译阶段执行,此时把b.jsp编译好的程序融合到a.jsp中这时就出现了完整a.jsp在我们tomcat下的临时文件下你根本找不到b.java的影子,因为已经存放到a.java中了。
<jsp:include page=”b.jsp”>了此方法涉及jsp的请求处理阶段的概念,说白了我理解就是表示程序的运行阶段调用,a.jsp和b.jsp编译好在tomcat临时文件中生成类似a.java和b.java后在当请求调用后引用独立的b.java文件。无论a.jsp还是b.jsp都是独立存在的但对于中文都要进行解析如果不设置将会出现错误。
扩展说明:对于上面两个页面我们我们还要说明一个乱码问题,如果b.jsp中涉及中文字符我们就会出现乱码问题
例如:如果上面两段代码将会出现如下错误:
HTTP Status 500 ?
org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType
解决:在b.jsp页面中删除字符集%@page contentType="text/html;charset=GBK"%
代码即可。
(说明:在tomcat中兼容性较好,一半不会报错,但是在weblogic中就会报错。)
如果采用<jsp:include page="b.jsp"/>那么b.jsp中如果没有
%@page contentType="text/html;charset=GBK"%
这段代码,那么将会出现如下错误:
this is aa.jsp ????bb.jsp?????? 乱码
解决:保证b.jsp中也有<%@page contentType="text/html;charset=GBK"%>代码。