jsp中的静态包含和动态包含

本文探讨了JSP中的静态包含和动态包含的区别及其应用场景。通过一个具体案例说明,在特定情况下如何灵活运用这两种包含方式来解决实际问题。
jsp中的静态包含和动态包含
    jsp中有两种包含模式,一种是<%@ include file="要包含的页面路径" %>,这种叫静态包含,另一种是<jsp:include page="要包含的页面路径" /> ,这叫做动态包含.
    静态包含是直接把要包含的页面原样嵌入总的页面后再统一编译,而动态包含总的页面和要嵌入的页面是分开编译的.
    现在看到这两种包含的意义了么?jsp是建议我们凡是*.jsp的页面如果要被另一个页面包含,那么应该用<jsp:include ...>动态包含,如果只是html或者是一段文本,那么用动态包含和静态包含都可以.因此原则上我们都倾向于使用<jsp:include>动态包含.
    但是我们项目中遇到一种特殊情况:一个动态的*.jsp页面,它里面是动态生成的表单元素,我们把它做为一个组件,其它*.jsp页面如果要用这个组件表单的话直接把它包含到自己页面的<form>标签内.实现这个功能明显应该用动态包含,因为组件jsp的页面完全是"动态"生成的,但是这样做在总页面的js脚本中就有问题了,因为这两个页面是分开编译的,有不同的document树,而总页面中的document是取不到组件jsp页面中的表单元素的,即document.getElementById("组件jsp中的表单元素ID")完全失效.
    后来想到一个办法,你知道怎么着?我们把组件的*.jsp改名为*.txt,把里面<%@ page contentType="" %>元素抽到总的页面里去,都不去理会*.txt的java编译报错代码,在总页面中直接<%@ include file=""%>,看到了么?动态的页面用静态包含!这样*.txt 中的代码会原封不动的嵌到总页面中,页面只有一个document树在内存中,这样再document.getElementById("组件中的元素id")就完全没问题了.
    由此可见,虽然jsp规范中定义了动态页面的<jsp:include>包含方式,但对一些特殊情况,完全可以绕开jsp规范的限制以求得更加灵活的效果的,以上意见供大家参考,不对之处欢迎斧正,呵呵:)
 
JSP静态包含动态包含是在 JSP 页面中引入其他文件内容的两种方式,它们在编译方式、执行过程使用场景等方面存在差异,可以从以下几个方面来理解: ### 编译方式 - **静态包含**:通过 JSP 的 `include` 指令实现,语法格式为 `<%@ include file="被包含的文件地址"%>`。静态包含是编译时包含,在编译阶段,JSP 编译器会将被包含文件的代码原封不动地插入到包含页面的指定位置,最终两个页面会合二为一,只产生一个 Java 文件一个 class 文件。如果被包含的页面不存在,则会产生编译错误。同时,两个页面的 `contentType` 属性应保持一致,因为它们实际上变成了一个整体。例如: ```jsp <%@ include file="header.jsp" %> ``` 可以简单地认为这两个页面代码是写在同一个页面里的[^2][^3][^4]。 - **动态包含**:通过 JSP 标准动作 `<jsp:include page="被包含页面" flush="true">` 实现。动态包含是运行时包含,在运行时,当向包含页面发出请求后,会转发到被包含的页面去执行,执行完被包含页面后,再接着执行本页面余下的代码。包含页面包含页面是独立的,会分别编译出两个 Java 文件两个 class 文件。如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行[^2][^4]。 ### 执行过程 - **静态包含**:就像将两个页面的代码合并在一起,被包含页面发生的变动,在包含它的页面更新前不会得到更新。例如,若 `check.jsp` 被静态包含在 `Login.jsp` 中,`<%@ include file="check.jsp"%>` 等同于将 `check.jsp` 中的所有代码直接放到 `Login.jsp` 中该语句所在的位置,直接将代码写到 `Login.jsp` 里效果一样[^2][^4]。 - **动态包含**:当请求包含页面时,会先处理包含页面的代码,遇到动态包含标签时,会将请求转发到被包含页面执行,执行完成后将其执行结果(通常是 HTML 代码)插入到包含页面的相应位置。但被包含页面中关于 `response` 的操作,如 `response.redirect("")` 或者 `response.addCookie("")` 等,会被忽视,不会实现跳转等操作。例如: ```jsp <jsp:include page="check.jsp" flush="true" /> ``` 当向这个页面发出请求后,会转发到 `check.jsp` 页面去执行,执行完了后又接着执行本页面余下的代码[^2][^4]。 ### 使用场景 - **静态包含**:适用于包含一些相对固定的内容,如 HTML 文件、文本文件、公共的页面头部、底部等。因为这些内容不经常变动,静态包含可以提高性能,减少运行时的开销。例如,在实际开发时,需要在 JSP 页面静态包含一个 HTML 文件,可以通过 `include` 指令来实现[^3]。 - **动态包含**:适用于需要向被包含页面传递参数,或者被包含页面内容经常变动的情况。由于动态包含是在运行时处理,可以根据不同的请求动态包含不同的内容,增加了页面的灵活性。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值