JSP中include指令与inlcude动作的区别

本文详细介绍了JSP的工作原理,包括JSP文件如何被编译为Servlet及处理客户端请求的过程。同时深入探讨了Include指令与Include动作的区别及应用,解释了它们如何在JSP程序中整合外部文件。

一、JSP工作原理

  • JSP文件是一种Servlet,其工作方式是先部署源代码后编译为.class文件。服务端在客户端第一次请求JSP文件的时候被编译成Servlet,由Servlet处理客户端的请求。具体流程如下:
    JSP原理

  • 简述下在Intellij Idea中Tomcat项目的工作过程,项目名称为Demo2017:

    1. Intellij Idea在第一此发布Tomcat项目的时候,会在.IntelliJIdea2016.3\system\tomcat文件目录中生成一个tomcat工作目录Tomcat_7_0_73_Demo2017。该目录下包含了conf、logs和work三个目录。

    2. 此时客户端第一次访问Tomcat项目中的index.jsp,此时,Tomcat首先会将index.jsp转换成index_jsp.java,并将该文件放入目录:work\Catalina\localhost\
      demo2017\org\apache\jsp(demo2017为自己设置的虚拟目录)

    3. 然后,Tomcat会将index_jsp.java编译生成index_jsp.class,生成Servlet实例。最后返回响应

    4. 需要注意的是,JSP只会在客户端第一次请求的时候被编译,因此第一次请求会比较慢,

二、Include指令

  • 语法:<%@ include file="filepath" %>

  • Include指令可以在JSP程序中插入多个外部文件(如:JSP\HTML\java程序\甚至是文本)。在转换成Servlet实例之前,include指令会将相应的文件包含进include指令所在文件,最后一并转换成.java为文件,编译生成一个.class文件,一起执行。

  • Include指令的实际作用是将file所指的文件的Java代码包含进include指令所在的文件的Java代码当中,因此在使用include指令时要注意文件与被包含文件不能定义相同的变量,避免命名冲突。

  • 假设includeCommand.jsp中使用include指令包含了一个date.jsp文件,在work工作目录下,Tomcat会生成一个includeCommand_jsp.java和一个includeCommand_jsp.class文件

三、Include动作

  • 语法:<jsp:include page="filepath" flush="false"/>

  • Include动作用于客户端请求时引入指定文件。如果引入的文件是JSP文件,则先编译该JSP文件,然后再把编译结果引入Include动作所在文件。

  • 同样的情况,如果在includeAction.jsp中使用include指令包含一个文件date.jsp,在work工作目录下,Tomcat会生成includeAction_jsp.java、includeAction_jsp.class、date_jsp.java、date_jsp.class

  • 在includeAction_jsp.java中使用
    org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, “date.jsp”, out, false)来引入date.jsp文件。

<think>我们正在讨论C/C++中的#include预处理指令。用户要求了解其正确写法及使用说明。 根据引用内容,我们可以总结如下: 1. #include的作用是文件包含,将头文件内容插入到指令位置。 2. 有两种形式: - #include <filename>:用于系统头文件,从系统目录查找。 - #include "filename":用于用户自定义头文件,从当前目录开始查找。 3. 可以出现在文件的任何位置,但通常放在文件开头。 4. 一条#include只能包含一个文件。 5. 文件包含允许嵌套(即头文件中可以包含其他头文件)。 6. 使用头文件可以避免重复定义,提高代码复用性。 另外,引用[3]还给出了一个简单的例子,展示头文件如何被包含。 我们还需要注意,用户输入中有一个拼写错误:“#inlcude”应为“#include”。 现在,我们按照要求组织回答: - 使用中文。 - 行内公式用$...$(虽然这个问题可能不太涉及数学公式,但如果有变量名等,可以用行内代码形式,但指令要求数学表达式用LaTeX,而代码用代码块。不过这里主要是代码,所以我们将用代码块展示示例)。 - 独立公式用$$...$$(本题可能不需要)。 - 生成相关问题。 由于用户的问题是关于#include的写法和用法,我们将重点解释两种形式的区别和使用场景,并给出一些示例。 回答结构: 1. 解释#include的作用。 2. 说明两种形式的区别和用法。 3. 使用注意事项。 4. 示例代码。 5. 相关问题。 注意:引用标记要自然地添加在引用内容的末尾。 </think> ### #include 的正确写法及使用说明 #### 1. **基本作用** `#include` 是 C/C++ 的预处理指令,用于将指定头文件的内容插入到当前源文件中,相当于复制粘贴头文件的全部内容到指令位置[^1]。 **核心功能**: - 连接头文件(`.h`)当前源文件,形成完整的编译单元 - 避免代码重复,提高复用性(如公用函数声明、常量定义)[^2] #### 2. **正确写法** **两种标准形式**: ```c #include <filename> // 尖括号形式:优先从系统目录查找 #include "filename.h" // 双引号形式:优先从当前目录查找 ``` **区别**: | 形式 | 搜索路径顺序 | 典型使用场景 | |--------------|----------------------------------|---------------------| | `<filename>` | 编译器系统目录 → 环境变量路径 | 标准库(如 `<stdio.h>`) | | `"filename"` | 当前源文件目录 → 系统目录 | 用户自定义头文件 | > 📌 **重要规则**: > - 一条指令只能包含一个文件[^2] > - 文件名需带扩展名(如 `.h` / `.hpp`) > - C++ 标准库头文件通常无扩展名(如 `<iostream>`)[^5] #### 3. **使用位置** - **推荐位置**:源文件开头(全局作用域) - **允许位置**:函数内部(此时头文件内容遵循该函数的变量作用域) ```c void func() { #include "local_defs.h" // 包含的内容仅在 func() 内有效 } ``` #### 4. **嵌套包含** 头文件可嵌套包含其他头文件,但需避免循环引用: ```c // config.h #pragma once #include <vector> // 嵌套包含标准库 // main.cpp #include "config.h" // 同时引入 vector ``` #### 5. **常用头文件示例** | 头文件 | 功能 | |-----------------|------------------------| | `<iostream>` | C++ 输入输出流 | | `<vector>` | 动态数组容器 | | `<cmath>` | 数学函数 | | `<cstring>` | 字符串处理 | | `<algorithm>` | 常用算法(如排序) | #### 6. **错误预防** - **重复包含问题**:使用预处理指令防护 ```c // myheader.h #ifndef MYHEADER_H #define MYHEADER_H /* 头文件内容 */ #endif ``` - **路径错误**:双引号包含自定义头文件时确保路径正确 ### 示例代码 ```c #include <stdio.h> // 系统头文件:标准I/O #include "utils.h" // 自定义头文件 int main() { print_message(); // 函数声明在 utils.h return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值