JSP现在是不是已经被淘汰了?我们还有必要学习吗?
JSP现在算是已经被淘汰了,但我们还是有必要学习。
JSP算是一门老技术了,如今很多企业都极少用它了,可能在一些国企中还能见到吧,那么我们还有必要学习JSP吗?我的答案是肯定的,一是,毕竟以前JSP很火,很多企业都用了JSP,这就导致企业可能还有遗留或者还在使用JSP,我们懂JSP能够进一步提高竞争力;其次,学习旧技术不一定是为了去使用它,我们在学习过程中,能偶丰富我们的眼界,提高我们的学习能力,了解新技术相对旧技术有哪些改进、哪些相同点、不同点,从而更有利于我们对新技术的掌握和理解。
是什么导致JSP的没落?
主要原因还得是前后端分离,其次就是主流的spring框架不支持JSP。
在Web2.0时代,当时都是前后端一体化,一个程序员既要干后端又要干前端(简称全干工程师),而JSP能够将Java代码和HTML代码混着写,非常符合当时的趋势,所以就大火。然而现在,随着技术的发展、时代的进步,很多互联网公司都为追求高效率,开始盛行前后端分离,所以说前后端分离是JSP。
前后端分离主要有以下几个好处:
- 提高工作效率。前端和后端的逻辑思维、需求都有很大区别,专门的人干专门的事
- 减小服务器的压力。很多请求处理都交给了前端来做
- 降低维护成本。对前端代码和后端代码进行了解耦,调试前端代码无需后端人员的参与
- 提升用户体验。实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升
谁取代了JSP?
JSP的大部分功能都被thymeleaf 取代了。
JSP存在的意义就是解决网页能动态获取来自服务器的响应数据,而thymeleaf也能。同时在当今Java界叱咤风云的Springboot框架统治下,对于JSP更加更加学上加霜,首先Springboot不支持JSP,它很好地继承了thymeleaf模板引擎,让thymeleaf在使用了Springboot的Web项目下显得更加如鱼得水,其次就是Sun公司(已被Oracle公司收购)停止了对JSP的更新,连亲爹都放弃它了。
总的来说JSP的没落是技术的更新换代,是行业趋势所致,是时代的更迭。
什么是JSP?
JSP是一种动态网页技术,能够将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP主要作用是为了简化Servlet的工作而出现的替代品,,本质仍然是Servlet!因为Servlet输出HTML非常繁琐,JSP就是替代Servlet输出HTML的。
JSP(JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP的组成:静态标签
+ JSP脚本
+ 动态标签
静态标签主要是html标签
JSP脚本主要是Java代码
动态标签主要是JSTL标签
JSP的优缺点:
.java
和.class
文件占用磁盘大量内存.java
文件(Servlet),然后将.java
文件编译为.class
文件. 这样,出错信息实际上指向的是转换后的那个.java
文件(Servlet),而不是JSP本身(调试有难度)看着这一堆缺点,也难怪JSP会被淘汰,但不可否认它以前也是一代霸王
Step1:导入项目依赖
pom.xml:
<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.0modelVersion>
<groupId>com.hhxygroupId>
<artifactId>day9_jspartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<maven.compiler.source>16maven.compiler.source>
<maven.compiler.target>16maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
<scope>providedscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
<configuration>
<port>8080port>
configuration>
plugin>
plugins>
build>
project>
Step2:创建JSP文件
Step3:编写JSP代码
hello.jsp:
<%--
Created by IntelliJ IDEA.
User: ghp
Date: 2022/1/7
Time: 10:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
JSP初体验
<%--这是html代码--%>
Hello,JSP!
<%
/*这是Java代码*/
System.out.println("这是我的第一个JSP程序");
%>
Step4:启动Tomcat,同时将JSP项目部署到Tomcat上
备注:所需插件:Tomcat7+MavenHelper
Step5:测试
备注:
hello.jsp
页面tomcat
会将 hello.jsp
转换为名为 hello_jsp.java
的一个 Servlet
tomcat
再将转换的 servlet
编译成字节码文件 hello_jsp.class
tomcat
会执行该字节码文件,向外提供服务可以在E:\项目\Project_JavaWeb\day9_jsp\target\tomcat\work\Tomcat\localhost\day9_jsp\org\apache\jsp
目录下看到转换后的 servlet
:
可以通过查看
hello_jsp.java
,发现它是继承HttpJspBase
类的:而后我们可以去查看Tomcat的源码,发现
HttpJspBase
类是继承HttpServlet
类的,这也充分说明了JSP本质就是一个Servlet,在tomcat源码\apache-tomcat-8.5.68-src\java\org\apache\jasper\runtime\HtpJspBase.java
中查看(Tomcat源码可以去官网下载)
继续阅读
hello_jsp
类的代码,可以看到有一个名为_jspService()
的方法,该方法就是每次访问jsp
时自动执行的方法,和servlet
中的service
方法一样 。而在
_jspService()
方法中可以看到往浏览器写标签的代码:以前我们自己写
servlet
时,这部分代码是由我们自己来写,现在有了jsp
后,由tomcat完成这部分功能。
JSP脚本也叫Java脚本,其实就是Java代码片段,指用
<%%>
括起来的JSP页面中的Java脚本;所有能在java程序中执行的代码,都可以通过jsp脚本执行。
JSP脚本分为三种:<%...%>
、<%=…%>
、<%!...%>
<%...%>
:编写Java语句。内容会直接放到_jspService()
方法之中<%=…%>
:编写Java表达式。内容会放到out.print()
中,作为out.print()
的参数,然后会直接输出到页面上<%!…%>
:编写Java定义类成员。内容会放到_jspService()
方法之外,被类直接包含示例:
hello.jsp:
<%--
Created by IntelliJ IDEA.
User: ghp
Date: 2022/8/7
Time: 10:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
JSP初体验
<%--这是html代码--%>
Hello,JSP!
<%
/*这是Java代码*/
System.out.println("这是我的第一个JSP程序");
int i=1;
%>
<%=i%>
<%!
void show(){}
String name = "zhangsan";
%>
测试结果和执行流程:
备注:html标签中的内容和<%=>
一样,也是需要加载到Tomcat中,然后通过_jspService
成员方法中的out.print()
方法直接输出到网页上,加载后,也可以再hello_jsp.java
中查看:
EL(Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码,主要功能用于从域对象中获取数据。它的灵感来自XPath表达式语言。主要作用就是简化<%=expression%>代码
详细学习:JSP表达式语言|菜鸟教程
后面再详细学习吧,先了解一下,掌握EL表达式的常用方式
语法:
${expression};//获取域对象expression中的数据
相当于替换了原来JSP中的:<%=expression%>
eg:
<%
Person pperson = new Person();
person.setName("zhangsan");
person.setPhones(new String[]{"123","456","789"});//给Person对象中的数组进行赋值
//设置List集合
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
//设置map集合
Map<String,Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("p", person);//将Person对象传递进Page域对象中
%>
<%--EL表达式中对象名.属性名不找属性的值,而是找名字对应的getXxx方法,没有此方法会报错--%>
输出Person对象的值:${p} <%--需要重写p对象的toString方法,不然输出的是对象的 全类名+@哈希码--%>
输出Person的name属性:${p.name} <%--p对象中即使没有name属性也不会报错,但是必须有getName的方法,否则会报错--%>
输出Person的arr数组地址值:${p.phones}
输出Person的arr数组属性值:${p.phones[2]}
输出Person的list集合中的元素值:${p.cities}
输出Person的List集合中个别元素值:${p.cities[2]}
输出Person的Map集合: ${p.map}
输出Person的Map集合中某个key的值: ${p.map.key1}
※ JavaWeb中有四大域对象,分别是:
page
:当前页面有效request
:当前请求有效session
:当前会话有效application
:当前应用有效EL表达式会从这些域对象中依次由内到外进行查找,直到找到为止
一般EL表达式需要和JSTL标签结合使用
Servlet:
package com.hhxy.jsp;
import com.hhxy.pojo.Brand;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/JspDemo1")
public class JspDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost方法别调用了");
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet方法被调用了");
//1. 准备数据
List<Brand> brands = new ArrayList<>();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
//2. 存储到request域中
request.setAttribute("lists",brands);
//3. 请求转发到JSP中
request.getRequestDispatcher("/brand.jsp").forward(request,response);
}
}
JSP:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.hhxy.pojo.Brand" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
序号
品牌名称
企业名称
排序
品牌介绍
状态
操作
<%--========================核心代码============================--%>
<%--El表达式中对象的遍历需要搭配JSTL标签使用--%>
${brand.id}
${brand.brandName}
${brand.companyName}
${brand.ordered}
${brand.description}
${brand.status == 1 ? "启用":"禁用"}
修改 删除
<%--
使用不同for循环的方式进行遍历
${lists[i].id}
${lists[i].brandName}
${lists[i].companyName}
${lists[i].ordered}
${lists[i].description}
${lists[i].status == 1 ? "启用":"禁用"}
修改 删除
--%>
<%--==========================================================--%>
<%@ page import="com.hhxy.pojo.Brand" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
序号
品牌名称
企业名称
排序
品牌介绍
状态
操作
<%--========================核心代码============================--%>
<%
List lists = (List) request.getAttribute("lists");
for (int i = 0; i < lists.size(); i++) {
Brand brand = lists.get(i);
%>
<%=brand.getId()%>
<%=brand.getBrandName()%>
<%=brand.getCompanyName()%>
<%=brand.getOrdered()%>
<%=brand.getDescription()%>
<%=brand.getStatus() == 1 ? "启用":"禁用"%>
修改 删除
<%
}
%>
<%--=========================================================--%>
直接运行Servlet,效果是一样的
推荐阅读:
EL表达式
JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
JSTL所需依赖:
<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.0modelVersion>
<groupId>com.hhxygroupId>
<artifactId>day9_jspartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<maven.compiler.source>16maven.compiler.source>
<maven.compiler.target>16maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
<scope>providedscope>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
<configuration>
<port>8080port>
configuration>
plugin>
plugins>
build>
project>
在JSP页面中引入JSTL标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
:和Java中的if条件判断是一样的,test
属性中放判断表达式
:作用等价于Java中的foreach语句
:作用等价于Java中的普通for循环
相关示例代码请参看前面
心有所感:
看到这些标签让我想起了MyBatis的动态SQL熟悉的配方,知识真的是越学越有趣,越学越容易触类旁通,然而当懂的多了的时候,反而感觉有点迷茫了,可能这是在逐渐了解知识的海洋的深而远所产生恐惧感吧(●’◡’●)
学习的路途中要时常回顾,时常总结……
要学的东西真™多啊┭┮﹏┭┮
参考文章:
- 2020还有必要学JSP吗?
- 为什么要前后端分离?有什么优缺点?