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️⃣第三个标签<%=%>
里面的内容:
如上图,直接被输出流打印了出去。
最新文章
- 视频软件TurboDemo 教程:如何为视频添加旁白和音乐
- apache struts 2 任意代码执行漏洞
- POJ2892Tunnel Warfare (线段树)
- UISearchController的使用。(iOS8+)
- svg 文字
- poj--1517
- linux C/C++开发环境搭建指南
- mvc约定
- win10下安装Ubuntu16.04双系统
- 初始Spring MVC——练手小项目
- ANI功能分析
- SQL解决时间段重复合并问题
- for 循环 与forEach 里面return 的区别
- 常用的几个CSS前端效果
- 使用Visual Studio Team Services持续集成(三)——使用工件
- 五、MongoDB的索引
- 软件工程个人项目作业 Individual Project
- python2 高级编程
- DDD领域模型查询方法实现(八)
- 《CLR via C#》读书笔记 之 计算限制的异步操作
热门文章
- python 爬取豆瓣电影评论,并进行词云展示
- Day34:BigDecimal的使用
- C++面向对象程序设计期末复习笔记[吉林大学](结合历年题速成85)
- STM32用PWM波控制呼吸灯代码
- 二阶段目标检测网络-Cascade RCNN 详解
- 使用命令行运行用例时提示python.exe: Error while finding module specification for &#39;testcase_1.Test&#39;.....
- 编译安装nmon
- java计算器༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽,又是掉发的一天
- 万字干货! 使用docker部署jenkins和gitlab
- Java学习笔记 :2021年12月31日 上午