在路上--JSP

虽然jsp在如今被淘汰,但是仍有小部分公司在使用jsp,所以我们在学web时仍然要学习jsp这一知识。

任务:

理解 JSP JSP 原理
能在 JSP 中使用 EL 表达式 JSTL 标签
理解 MVC 模式 三层架构
能完成品牌数据的增删改查功能
JSP 概述
JSP (全称: Java Server Pages ): Java 服务端页面。
是一种动态的网页技术,其中既可以定义 HTML JS CSS 等静态内 容,还可以定义 Java 代码的动态内容,也就是 JSP = HTML + Java 。如下就是 jsp 代码
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>JSP,Hello World</h1>
<%
System.out.println("hello,jsp~");
%>
</body>
</html>
上面代码 h1 标签内容是展示在页面上,而 Java 的输出语句是输出在 idea 的控制台。
那么, JSP 能做什么呢?现在我们只用 servlet 实现功能,看存在什么问题。如下图所示,当我们登陆成功后,需要在页面
上展示用户名
上图的用户名是动态展示,也就是谁登陆就展示谁的

 

上图的用户名是动态展示,也就是谁登陆就展示谁的用户名。只用 servlet 如何实现呢?今天准备好了一个LoginServlet ,该 servlet 就是实现这个功能的,现将资料中的 LoginServlet.java 拷贝request- demo 项目中 来演示。接下来启动服务器并访问登陆页面

 输入了 zhangsan 用户的登陆信息后点击 登陆 按钮,就能看到如下图效果

当然如果是 lisi 登陆的,在该页面展示的就是 lisi, 欢迎您 ,动态的展示效果就实现了。那么 LoginServlet 到底是如何 实现的,我们看看它里面的内容
上面的代码有大量使用到 writer 对象向页面写标签内容,这样我们的代码就显得很麻烦;将来如果展示的效果出现了问 题,排错也显得有点力不从心。而 JSP 是如何解决这个问题的呢?今天也提供了一个 login.jsp 页面,该页面也能实 现该功能,现将该页面拷贝到项目的 webapp 下,需要修改 login.html 中表单数据提交的路径为下图

 

重新启动服务器并进行测试,发现也可以实现同样的功能。那么 login.jsp 又是如何实现的呢?那我们来看看 login.jsp 的代码
上面代码可以看到里面基本都是 HTML 标签,而动态数据使用 Java 代码进行展示;这样操作看起来要比用 servlet 实现要 舒服很多。
JSP 作用:简化开发,避免了在Servlet中直接输出HTML标签。

 

JSP 快速入门
接下来我们做一个简单的快速入门代码。
搭建环境
创建一个 maven web 项目,项目结构如下:

 pom.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>jsp-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
导入 JSP 依赖
dependencies 标签中导入 JSP 的依赖,如下
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
该依赖的 scope 必须设置为 provided ,因为 tomcat 中有这个 jar 包了,所以在打包时我们是不希望将该依赖打进到我们 工程的war 包中。
创建 jsp 页面
在项目的 webapp 下创建 jsp 页面

 通过上面方式创建一个名为 hello.jsp 的页面。

编写代码
hello.jsp 页面中书写 HTML 标签和 Java 代码,如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>hello jsp</h1>
<%
System.out.println("hello,jsp~");
%>
</body>
</html>
测试
启动服务器并在浏览器地址栏输入 http://localhost:8080/jsp - demo/hello.jsp ,我们可以在页面上看到如下内容

 同时也可以看到在 idea 的控制台看到输出的 hello,jsp~ 内容。

JSP 原理
我们之前说 JSP 就是一个页面,那么在 JSP 中写 html 标签,我们能理解,但是为什么还可以写 Java 代码呢?
因为 JSP 本质上就是一个 Servlet 接下来我们聊聊访问 jsp 时的流程

 

1. 浏览器第一次访问 hello.jsp 页面
2. tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlet
3. tomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.class  
4. tomcat 会执行该字节码文件,向外提供服务
我们可以到项目所在磁盘目录下找 target\tomcat\work\Tomcat\localhost\jsp - demo\org\apache\jsp 目录,而这个 目录下就能看到转换后的 servlet

 打开 hello_jsp.java 文件,来查看里面的代码

由上面的类的继承关系可以看到继承了名为 HttpJspBase 这个类,那我们在看该类的继承关系。到tomcat中的找如下目录:
tomcat\tomcat 源码 \apache - tomcat - 8.5.68 - src\java\org\apache\jasper\runtime ,该目录下就有 HttpJspBase 类,查 看该类的继承关系

 

 

可以看到该类继承了 HttpServlet ;那么 hello_jsp 这个类就间接的继承了 HttpServlet ,也就说明 hello_jsp 是一 个 servlet
继续阅读 hello_jsp 类的代码,可以看到有一个名为 _jspService() 的方法,该方法就是每次访问 jsp 时自动执行的方 法,和 servlet 中的 service 方法一样 。 而在 _jspService() 方法中可以看到往浏览器写标签的代码:
     

 以前我们自己写 servlet 时,这部分代码是由我们自己来写,现在有了 jsp 后,由tomcat完成这部分功能。

 

JSP 脚本
JSP 脚本用于在 JSP 页面内定义 Java 代码。在之前的入门案例中我们就在 JSP 页面定义的 Java 代码就是 JSP 脚本。
JSP 脚本分类
JSP 脚本有如下三个分类:
<%...%> :内容会直接放到 _jspService() 方法之中
<%=…%> :内容会放到 out.print() 中,作为 out.print() 的参数
<%!…%> :内容会放到 _jspService() 方法之外,被类直接包含
代码演示:
hello.jsp 中书写
<%
System.out.println("hello,jsp~");
int i = 3;
%>
通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件, i 变量定义在了 _jspService() 方法中

 hello.jsp 中书写

<%="hello"%>
<%=i%>
通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,该脚本的内容被放在了 out.print() 中,作为参数
hello.jsp 中书写
<%!
void show(){}
String name = "zhangsan";
%>
通过浏览器访问 hello.jsp 后,查看转换的 hello_jsp.java 文件,该脚本的内容被放在了成员位置

 

JSP 缺点
我们可以看到 JSP 的很多缺点。
由于 JSP 页面内,既可以定义 HTML 标签,又可以定义 Java 代码,造成了以下问题:
书写麻烦:特别是复杂的页面 ,既要写 HTML 标签,还要写 Java 代码
阅读麻烦
上面案例的代码,相信你后期再看这段代码时还需要花费很长的时间去梳理
复杂度高:运行需要依赖于各种环境, JRE JSP 容器, JavaEE…
占内存和磁盘: JSP 会自动生成 .java .class 文件占磁盘,运行的是 .class 文件占内存
调试困难:出错后,需要找到自动生成的 .java 文件进行调试
不利于团队协作:前端人员不会 Java ,后端人员不精 HTML
如果页面布局发生变化,前端工程师对静态页面进行修改,然后再交给后端工程师,由后端工程师再将该页面改为 JSP 页面
由于上述的问题, JSP 已逐渐退出历史舞台, 以后开发更多的是使用 HTML + Ajax 来替代。 Ajax 是我们后续会重点讲述的技术。有个这个技术后,前端工程师负责前端页面开发,而后端工程师只负责前端代码开发。下来对技术的发展进行简单的 说明

 

1. 第一阶段:使用 servlet 即实现逻辑代码编写,也对页面进行拼接。这种模式我们之前也接触过
2. 第二阶段:随着技术的发展,出现了 JSP ,人们发现 JSP 使用起来比 Servlet 方便很多,但是还是要在 JSP 中嵌套 Java 代码,也不利于后期的维护
3. 第三阶段:使用 Servlet 进行逻辑代码开发,而使用 JSP 进行数据展示

 

4. 第四阶段:使用 servlet 进行后端逻辑代码开发,而使用 HTML 进行数据展示。而这里面就存在问题, HTML 是静态页 面,怎么进行动态数据展示呢?这就是 ajax 的作用了。
那既然 JSP 已经逐渐的退出历史舞台,那我们为什么还要学习 JSP 呢?原因有两点:
一些公司可能有些老项目还在用 JSP ,所以要求我们必须动 JSP
我们如果不经历这些复杂的过程,就不能体现后面阶段开发的简单
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值