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 之间的联系,及其语法的更多相关文章

  1. 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例

    初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...

  2. jsp与servlet之间的参数传递【转】

    JSP与 servlet之间的传值有两种情况:JSP -> servlet, servlet -> JSP. 通过对象 request和 session (不考虑 application) ...

  3. Jsp与servlet之间页面跳转及参数传递实例(转)

    原网址:http://blog.csdn.net/ssy_shandong/article/details/9328985 11. jsp与servlet之间页面跳转及参数传递实例 分类: Java ...

  4. JSP与Servlet之间传值

    Jsp与Servlet之间的传值有两种,一种是Jsp传值给Sevlet,另一种是Servlet传值给Jsp:使用request.response对象完成传值,具体实现如下: 1.JSP传值给Servl ...

  5. JSP与Servlet之间传值的一般方法,适合新手做练习

    #JSP与Servlet之间传值 Jsp与Servlet之间的传值有两种,一种是Jsp传值给Sevlet,另一种是Servlet传值给Jsp:使用request.response对象完成传值,具体实现 ...

  6. js、JSP、servlet之间的传递小结

    @ JS 与 JSP :JSP无法直接获取JS的值,只能通过隐藏表单或者dom节点设置. JSP中设置隐藏表单input,或者设置任意一个隐藏或者不隐藏的节点比如div, 而JS就通过document ...

  7. JSP与Servlet之间的关系事例说明

    Servlet Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器.Servlet 运行在 Servlet 容器中, ...

  8. jsp和servlet之间传数据

    一.jsp与java文件传递数据可以使用Servlet类来传递,jsp将数据存入到request对象中,Servlet类获取这个request对象,并将数据取出. 示例代码如下: JSP代码: < ...

  9. java web基础 js、JSP、servlet之间的传递

    @ JS 与 JSP :JSP无法直接获取JS的值,只能通过隐藏表单或者dom节点设置. JSP中设置隐藏表单input,或者设置任意一个隐藏或者不隐藏的节点比如div, 而JS就通过document ...

  10. JSP与Servlet之间的交互,传值

    一.Servlet 首先要明白一点,servlet需要容器的支持才能够运行,如Tomcat.jetty 达到servlet的请求,需要ServletRequest对象和ServletResponse对 ...

随机推荐

  1. layui table 表头抖动

    原本table超出页面宽度(即table有横向滚动条)的情况下,缩放页面然后再设置定时器定时更新表单,会发现数据不变的时候table头部会左右抖动 而且th td比设置的minWidth 或者cell ...

  2. 彻底理解Python中的闭包和装饰器(下)

    上篇讲了Python中的闭包,本篇要讲的装饰器就是闭包的一个重要应用. 如果你还不知道什么是闭包,猛戳这里阅读:彻底理解Python中的闭包和装饰器(上) 什么是装饰器 装饰器的作用是在不修改函数定义 ...

  3. 使用JavaScript制作一个页面的电子时钟

    题目:做一个电子时钟,显示当前的年月日,时分秒,要求自动变化. 案例分析: 1.使用一个div盒子来展示时钟的内容: 2.将盒子在JavaScrip里面获取div盒子: 3.我们需要一个定时器setI ...

  4. 基于.NetCore开发博客项目 StarBlog - (22) 开发博客文章相关接口

    前言 本文介绍博客文章相关接口的开发,作为接口开发介绍的第一篇,会写得比较详细,以抛砖引玉,后面的其他接口就粗略带过了,着重于WebApi开发的周边设施. 涉及到的接口:文章CRUD.置顶文章.推荐文 ...

  5. pickle兼容问题

    1 import pickle 2 3 with open('a.pkl',mode='wb') as f: 4 # 一:在python3中执行的序列化操作如何兼容python2 5 # python ...

  6. UVA 673 Paretheses Balance

    原题Vjudge 题目大意 怼给你一堆括号,判断是否合法 有三条规则 (1)空串合法 (2)如果\(A和B\)都合法,则\(AB\)合法(例如:\(()和[]\)都合法,则\(()[]\)合法) (3 ...

  7. 2022年7月10 第四组 周鹏 CSS的基本认识

    CSS 层叠样式表 网页美观 html相当于原材料,css用来加工好看 如何嵌入? 样式如何显示html元素? 样式通常存储在样式表中 把样式表添加到html元素里 定义CSS方式 1,行内样式,可以 ...

  8. 完整数据分析流程:Python中的Pandas如何解决业务问题

    开篇 作为万金油式的胶水语言,Python几乎无所不能,在数据科学领域的作用更是不可取代.数据分析硬实力中,Python是一个非常值得投入学习的工具. 这其中,数据分析师用得最多的模块非Pandas莫 ...

  9. 通过Docker启动Solace,并在Spring Boot通过JMS整合Solace

    1 简介 Solace是一个强大的实时性的事件驱动消息队列.本文将介绍如何在Spring中使用,虽然代码使用的是Spring Boot,但并没有使用相关starter,跟Spring的整合一样,可通用 ...

  10. 请务必注意精度不一样,就不相等(float 与double)

    即使两个小数显示的值是一样的,但是类型不一要样,精度不一样实际上是不一样的 就比如下面这段代码: #include <iostream> #include <cstring> ...