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️⃣第三个标签<%=%>里面的内容:

如上图,直接被输出流打印了出去。

最新文章

  1. 视频软件TurboDemo 教程:如何为视频添加旁白和音乐
  2. apache struts 2 任意代码执行漏洞
  3. POJ2892Tunnel Warfare (线段树)
  4. UISearchController的使用。(iOS8+)
  5. svg 文字
  6. poj--1517
  7. linux C/C++开发环境搭建指南
  8. mvc约定
  9. win10下安装Ubuntu16.04双系统
  10. 初始Spring MVC——练手小项目
  11. ANI功能分析
  12. SQL解决时间段重复合并问题
  13. for 循环 与forEach 里面return 的区别
  14. 常用的几个CSS前端效果
  15. 使用Visual Studio Team Services持续集成(三)——使用工件
  16. 五、MongoDB的索引
  17. 软件工程个人项目作业 Individual Project
  18. python2 高级编程
  19. DDD领域模型查询方法实现(八)
  20. 《CLR via C#》读书笔记 之 计算限制的异步操作

热门文章

  1. python 爬取豆瓣电影评论,并进行词云展示
  2. Day34:BigDecimal的使用
  3. C++面向对象程序设计期末复习笔记[吉林大学](结合历年题速成85)
  4. STM32用PWM波控制呼吸灯代码
  5. 二阶段目标检测网络-Cascade RCNN 详解
  6. 使用命令行运行用例时提示python.exe: Error while finding module specification for &#39;testcase_1.Test&#39;.....
  7. 编译安装nmon
  8. java计算器༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽,又是掉发的一天
  9. 万字干货! 使用docker部署jenkins和gitlab
  10. Java学习笔记 :2021年12月31日 上午