jsp页面的动态include与静态include原理

jsp包含写法有两种,一种静态包含(include指令),一种动态包含(include标签)

下面来说说这两者的区别:

静态包含:

写法:<%@ include file="..."%>

静态包含不能传递参数

动态包含:

写法:<jsp:include page="..." />

或者:<jsp:include page="..."> </jsp:include>

动态包含可以传递参数

写法:

<jsp:include page="...">
       <jsp:param value="1" name="type"/>
</jsp:include>

 

接下来是重点,分析他们的底层原理

静态包含的本质:它的本质是文件的导入(不会对导入的文件进行编译),它不管是什么文件,.jsp,.txt,.json,.html,还是各种各样的文件后缀都行。只要是文本文件就行,因为它的本质是文件的导入。

查看tomcat 中jsp用了静态包含的jsp servlet,jsp最终都会被编译成servlet class文件。反编译查看,被包含的界面原封不动的导入到被包含的jsp中。所以静态包含就是普通的文件导入。

动态包含的本质:它的本质是先编译包含的文件,然后再进行导入,而且文件只能是.jsp后缀,因为是jsp标签的动态包含,tomcat只识别jsp后缀的文件,其实再往底层分析,一个jsp就是一个servlet,动态包含,其实包含的是一个servlet,而可以传参是,传参给包含的servlet,所以动态包含相当于http请求调用了一次servlet,而这个包含的servlet就会接受参数,并且解析自己的页面数据,最后response.write发送回被包含的jsp里面,jsp会整合包含的servlet发送回的数据,然后再统一返回给前端。

思路扩展:所以,我们用动态包含的时候,不仅仅只能用.jsp文件,还可以用servlet接口,@Controller也可以(@Controller也是一个servlet接口),只要记得返回一个视图对象给被包含的jsp页面就可以了。

示例:

<jsp:include page="/foreground/content/list.do">
       <jsp:param value="1" name="type"/>
</jsp:include>

写一个 Controller,RequestMapping("/foreground/content/list.do"),然后记得再方法里返回一个视图对象,有很多种写法,示例一种,

ModelAndView a = new ModelAndView();

a.serViewName("/foreground/content/list.jsp");

这样就实现了Controller代理 jsp界面,可以在jsp里动态显示数据。

 

总结:动态include可以包含.jsp(本质是servlet),servlet,继承servlet的子类。静态include可以包含无论什么后缀都行,只要是文本文件就可以,而且静态包含不能传参数,包含的文件不进行编译。

 

如果jsp文件静态包含,去包含servlet的话,首先,jsp文件会去文件路径找这个文件,因为是一个接口,压根就没有这个文件,所以jsp文件会报错,报找不到文件异常。

 

 

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