JSP 与 Servlet 之间的联系,及其语法
JSP 是什么
JSP 将 Java 代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP 文件在运行时会被其编译器转换成更原始的 Servlet 代码。JSP 编译器可以把 JSP 文件编译成用 Java 代码写的 Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
️JSP 是 Servlet 吗?
JSP 实际上是 Servlet。JSP 的 Java 源文件在 Tomcat 安装目录下work\Catalina\localhost\[项目名称]\org\apache\jsp:
public final class ch_005fjsp_005f01_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports
{ /* ... */ }
我们写的 JSP 继承自 HttpJspBase?,HttpJspBase 又是 HttpServlet 的子类。下图是截取自 Tomcat 官方文档的类继承关系图:

为何可以写 HTML?
在 Servlet 中,我们可以在 doGet 或 doPost 方法中获取 PrintWriter 输出流向前端输出一些 HTML 标签:
@WebServlet(name = "register_servlet", urlPatterns = {"/register.do"})
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("<div>博客地址:<a href='https://www.cnblogs.com/Enziandom/'></a></div>");
}
}
JSP 里头写的 HTML 标签是如何显示到浏览器中的呢?打开 JSP 页面的 Java 源文件,找到_jspService()方法。可以看到一些输出流语句,JSP 的输出流是 JspWriterImpl:
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Chapter JSP 01</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
JSP 语法
JSP 虽然可以嵌入 Java 代码,但也不可能随便就直接写 Java 代码在里面。所以,JSP 提供三个标签专门做这个工作:
| 标签名 | 描述 | 举例 |
|---|---|---|
| <%%> | 脚本段 | 声明全局变量、函数 |
| <%!%> | JSP声明 | 声明局部变量、写 Java 语句 |
| <%=%> | JSP表达式 | 输出内容到页面中 |
这三个标签其实还是挺令人费解的,因为 Java 的语句、全局变量、函数声明、表达式、局部变量被三个标签安排得明明白白,对于不熟练的初学者来说,还是很容易用混淆。这个时候就体现出源码的重要性了。每一个标签都用一次,然后打开 JSP 的 Java 源文件看看它们都被编译到了什么位置:
<html>
<head>
<title>Chapter JSP 01</title>
</head>
<body>
<%!
private final String outside = "global variable";
private void speak(String msg) {
System.out.println(msg);
}
%>
<%
String msg = "Hello World";
speak(msg);
%>
<%=msg%>
</body>
</html>
1️⃣第一个标签<%!%>里面的内容:

如上图,我们声明的变量就是全局变量,不是在_jspService()里面声明的局部变量。而且,函数的声明也是在正确的位置中,这完全都是 Java 的基础语法了。
2️⃣第二个标签<%%>里面的内容:

上图截取了一部分内容,因为_jspService()函数的内容太多了,而且前面也说到,输出流语句就是在这个函数内的。<%%>里面声明变量是局部变量,还有一些 Java 语句。
3️⃣第三个标签<%=%>里面的内容:

如上图,直接被输出流打印了出去。
JSP 与 Servlet 之间的联系,及其语法的更多相关文章
- 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例
初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...
- jsp与servlet之间的参数传递【转】
JSP与 servlet之间的传值有两种情况:JSP -> servlet, servlet -> JSP. 通过对象 request和 session (不考虑 application) ...
- Jsp与servlet之间页面跳转及参数传递实例(转)
原网址:http://blog.csdn.net/ssy_shandong/article/details/9328985 11. jsp与servlet之间页面跳转及参数传递实例 分类: Java ...
- JSP与Servlet之间传值
Jsp与Servlet之间的传值有两种,一种是Jsp传值给Sevlet,另一种是Servlet传值给Jsp:使用request.response对象完成传值,具体实现如下: 1.JSP传值给Servl ...
- JSP与Servlet之间传值的一般方法,适合新手做练习
#JSP与Servlet之间传值 Jsp与Servlet之间的传值有两种,一种是Jsp传值给Sevlet,另一种是Servlet传值给Jsp:使用request.response对象完成传值,具体实现 ...
- js、JSP、servlet之间的传递小结
@ JS 与 JSP :JSP无法直接获取JS的值,只能通过隐藏表单或者dom节点设置. JSP中设置隐藏表单input,或者设置任意一个隐藏或者不隐藏的节点比如div, 而JS就通过document ...
- JSP与Servlet之间的关系事例说明
Servlet Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器.Servlet 运行在 Servlet 容器中, ...
- jsp和servlet之间传数据
一.jsp与java文件传递数据可以使用Servlet类来传递,jsp将数据存入到request对象中,Servlet类获取这个request对象,并将数据取出. 示例代码如下: JSP代码: < ...
- java web基础 js、JSP、servlet之间的传递
@ JS 与 JSP :JSP无法直接获取JS的值,只能通过隐藏表单或者dom节点设置. JSP中设置隐藏表单input,或者设置任意一个隐藏或者不隐藏的节点比如div, 而JS就通过document ...
- JSP与Servlet之间的交互,传值
一.Servlet 首先要明白一点,servlet需要容器的支持才能够运行,如Tomcat.jetty 达到servlet的请求,需要ServletRequest对象和ServletResponse对 ...
随机推荐
- 4.4:Sqoop数据导入实验
〇.概述 1.拓扑结构 2.目标 使用sqoop工具将数据从mysql数据库导入到HDFS和Hbase 一.配置免密登录hdfs 三.导入到hdfs中 sqoop import --connect j ...
- 【Shell案例】【for循环、seq生成】3、输出7的倍数
描述写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21...)的命令 方法1:in方式循环 [if的括号是中括号,中间的条件要有空格] [循环体用do和done配对] ...
- 【实时数仓】Day01-数据采集层:数仓分层、实时需求、架构分析、日志数据采集(采集到指定topic和落盘)、业务数据采集(MySQL-kafka)、Nginx反向代理、Maxwell、Canel
一.数仓分层介绍 1.实时计算与实时数仓 实时计算实时性高,但无中间结果,导致复用性差 实时数仓基于数据仓库,对数据处理规划.分层,目的是提高数据的复用性 2.电商数仓的分层 ODS:原始日志数据和业 ...
- 关键字break和continue
关键字:break 和continue提供了另一种控制循环的方式. break 是直接退出循环体 如: continue 是退出当前循环迭代 如: 需要注意的是:使用过多的break和continu ...
- 1.5.5 HDFS读写解析-hadoop-最全最完整的保姆级的java大数据学习资料
目录 1.5.5 HDFS读写解析 1.5.5.1 HDFS读数据流程 1.5.5.2 HDFS写数据流程 1.5.5 HDFS读写解析 1.5.5.1 HDFS读数据流程 客户端通过Distribu ...
- [cocos2d-x]关于定时器
什么是定时器 定时器的作用就是每隔一段时间,就执行一段自定义的动作,比如飞机向前方移动,子弹的移动等等.该函数定义在CCNode头文件中,基本上cocos2dx中所有的东西都能够使用定时器. 定时器的 ...
- [LeetCode]819. 最常见的单词
题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned).返回出现次数最多,同时不在禁用列表中的单词.题目保证至少有一个词不在禁用列表中,而且答案唯一. 禁用列表中的单词用小写 ...
- P8773 [蓝桥杯 2022 省 A] 选数异或
题面 给定一个长度为 \(n\) 的数列 \(A_{1}, A_{2}, \cdots, A_{n}\) 和一个非负整数 \(x\), 给定 \(m\) 次查询, 每次询问能否从某个区间 \([l, ...
- Ubuntu 22.04 安装搜狗输入法
下载搜狗输入法 下载地址https://shurufa.sogou.com/linux 也可以命令下载 wget https://ime.sogouimecdn.com/202212182151/3b ...
- 基于 VScode 搭建 Qt 运行环境
插件 C/C++ Qt tools Qt Configure CMake CMake Tools 下载 qt https://download.qt.io/official_releases/onli ...