JavaWeb笔记(4)-JSP简述

JSP

概述

JSP,全称为Java Server Pages,即Java服务端页面。这是一种动态网页技术,在里面我们既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容。可以认为JSP = HTML + Java。我们可以认为JSP使得我们可以在代码中定义可以执行的Java代码。

使用JSP,首先需要导入相关的依赖:

1
2
3
4
5
6
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>

然后在新建的Web项目中,webapp下新建后缀名为.jsp的文件,在其中写入以下代码,其中HTML部分即为正常的HTML代码,而Java部分的代码使用标签<% %>进行包裹。在访问对应链接后,页面上会出现对应内容,在控制台上也会输出对应内容。

1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>JSP,Hello World</h1>
<%
System.out.println("hello,jsp~");
%>
</body>
</html>

原理

在JSP出现之前,我们可以通过Servlet中的response对象获取到输出流对应,然后利用write方法向其中写入html代码,同时结合Java代码处理的逻辑进行数据处理,最后返回相应的结合了数据与页面的html内容。这种方式的缺点非常明显,就是十分不方便。我们需要手动进行html字符串的拼接,书写繁多的write语句,整体的可读性和便利性都不高。

而JSP技术在此基础上进行改进,JSP本质上还是一个Servlet。浏览器第一次访问jsp页面的时候,Tomcat会将对应的.jsp文件转化为一个Servlet,然后再将这个Servlet编译成对应的字节码文件,执行该字节码文件,向外提供服务。

这个生成的Servlet类继承了HttpJspBase,间接继承了HttpServlet。生成的Servlet类中,一个重要方法为_jspService(),它就是每次访问jsp的时候自动执行的方式。而在这个方法中,会将我们之前在JSP中书写的html代码都使用out.write()进行写入,而Java代码则原封不动放入。也就是说,JSP自动帮助我们完成了字符串拼接工作,一定程度上提高了便利性。

JSP脚本

JSP脚本就是我们在JSP页面中定义的Java代码,这些代码需要利用对应的标签进行包裹。之前我们使用的是最普通的标签,<% %>,实际上JSP一共提供了三类脚本标签。

<% ... %>:被该标签包裹的Java代码,会直接原封不动的放入_jspService()方法中。

1
2
3
4
<%
System.out.println("jsp...");
int a = 1;
%>

<%= ... %>:被该标签包裹的内容,会被放入out.print()方法中,作为参数传入,一般可以用来进行数据的展示。例如下面的代码,假设局部变量str的值为"Hello",则最终会在页面中展示一个被<h1>包裹的Hello。

1
<h1><%=str%></h1>

<%! ... %>:被该标签包裹的内容,会被放在_jspService()方法之外,被类直接包含,作为类的成员变量或者是成员方法。

缺点

JSP虽然一定程度上解决了直接使用Servlet返回html代码的复杂性问题,但是它自己也有不少的缺点:

  1. 书写起来虽然不用大量的write,但是Java代码与HTML结合的方式书写起来也比较复杂
  2. JSP中的Java代码需要使用标签进行包裹,并且一个代码块还可以继续进行拆分,可读性也并不是很高
  3. 复杂度较高:JSP的运行需要依赖于各种环境,包括JRE、JSP容器、JavaEE等等
  4. 对内存和磁盘的占用率高,JSP会自动生成.java.class文件,对内存和磁盘进行占用

由于JSP的种种缺点,它已经渐渐地退出了历史舞台,后续的开发使用的更多是前后端分离的方式,使用HTML+Ajax来进行替代。JSP更多的是技术发展过程中出现的产物。

首先第一阶段,我们直接使用Servlet进行代码编写,既编写Java业务逻辑代码,又使用write进行html代码拼接。

到了第二阶段,随着技术的发展出现了JSP,JSP帮助我们简化了html代码的拼接,但是由于需要在JSP中嵌套Java代码,可读性和可维护性等还是有所欠缺。

第三阶段,则是结合使用Servlet和JSP,两者各有分工,Servlet只用来进行逻辑处理和数据封装,而JSP用来获取数据和进行数据展示,而为了提高可维护性,不直接在JSP中写Java代码,使用EL表达式或者JSTL标签来进行简化。这一阶段,我们的做法是在Servlet中将请求转发到JSP中进行显示后,将页面返回。

到了第四阶段,则已经放弃了JSP,使用Servlet来进行后端逻辑代码开发,使用HTML进行数据展示。这种模式下,需要我们能够进行动态数据展示,则需要ajax技术的参与。这部分的内容会在后续进行说明。

EL表达式与JSTL标签:

EL表达式,全称为Expression Language,可以用来简化JSP页面内的Java代码。它的主要作用是获取数据,从域对象中获取数据,然后将数据展示在页面上,语法即为${expression},获取域中存储的对应内容。

JSTL标签,全称为Jsp Standarded Tag Libray,也可以用来简化JSP页面中的Java代码,具体来说是使用标签进行取代。常见的标签有<c:if><c:forEach>


JavaWeb笔记(4)-JSP简述
http://example.com/2022/10/07/JavaWeb笔记-4-JSP简述/
作者
EverNorif
发布于
2022年10月7日
许可协议