很多2020年的java人员都说jsp已经不香了,太老了,不过目前一些比较老的项目还在使用JSP。现在JSP已经慢慢的被常见的模板引擎替代了,比如freemarker,其实和JSP差不多,只是性能要比JSP好。
JSP的全名叫 java server pages. java服务器页面。 是一种文本程序,特点就是HTML和java代码共同存在。 一开始JSP这种神器出现是为了简化servlet的工作。 因为servlet输出HTML非常困难。而JSP就是为了替代Servlet输出HTML而存在的。
tomcat访问资源,其实都是在访问servlet,而JSP本身就是一种servlet。而servlet是用java语言编写的服务器端程序,主要功能是和浏览器交互,生成页面展示。
一开始的servlet:
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println("Hello World ");
out.println("");
out.println("");
out.println("Hello World!
");
out.println("");
out.println("");
}
}
改进后的servlet
public class List_book extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//声明一个ArrayList.用来存放Book类中的数据
ArrayList<Book> list = new ArrayList<Book>();
for(int i=0;i<10;i++){
Book book = new Book();
book.setName(res.getString("name"+i));
book.setAuthor(res.getString("author"+i));
list.add(book);
}
//将list数据发送到.jap文件中
request.getRequestDispatcher("ListBook.jsp").forward(request, response);
}
}
可以看到servlet没有一点htmldiamante,数据都交给jsp来处理。
jsp长这样:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="description" content="This is my page">
<script></script>
</head>
<body>
<% ArrayList list = (ArrayList) request.getAttribute("list"); %>
<h2 align = "center">图书列表</h2>
<table border = 1px align = "center">
<tr><th>图书名称</th><th>图书作者</th></tr>
<!-- 继续使用jsp语句 循环放入存放于list中的Book实体类中的数据 -->
<%
for(int i = 0;i<list.size();i++){
Book book =(Book)
list.get(i);%>
<tr><th><%=book.getName() %></th><th><%=book.getAuthor()%></th><tr>
}
%>
</table>
</body>
</html>
在html里面写java代码。我们可以这么理解,jsp就是servlet,只不过servlet把一些业务功能剥离开来交给了或者是形成了jsp.
jsp的缺点:
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。
事实上我们为了解决某一类复杂的技术问题,其实都可以通过一个中间件去解决。中间件实现了不同技术之间的共享资源,实现应用间的互联与操作。
不涉及到直接给客户提供业务价值的软件都是中间件,比如nginx,mysql其实都是中间件,而OA系统这种能够直接让用户使用,提供服务的才称得上不是中间件。
中间件又分为: 缓存中间件,数据库中间件,消息中间件,服务化中间件,交易中间件,调度中间件和集成中间件等。
现在有个流行的词叫技术中台,也是中间件的一种叫法。
中间件有多少? 以MQ为例: activeMQ, kafka, pulsar, rocketMQ, CMQ, TbueMQ, JMQ,QMQ,DDMQ, 还有一些不知名的MQ。 其实都是消息队列,只是各家公司基于其中一个开源产品做了二次研发起的名字,比如滴滴的DDMQ
这个很难解释,我们在tomcat这边做的是动静分离, 而这里的动静其实指的是动态请求和静态请求。
静态页面: 是一个页面对应一个内容,你打开网页前就能知道网页是什么样子。一般html,js,css央视的文件。
动态页面: 是一个一对多的访问,通过一个页面可以返回若干不同的数据,所以你在打开网站前上次打开和这次可能都会不一样。
而目前市面上的网站,几乎都是动态的。
比如知乎,豆瓣,你打开一次,就变化一次。
静态文件:图片,视频,音乐,JS,CSS,HTML
动态文件: .jsp .php(场景: 百度搜索结果,淘宝商品列表,订单首页)
JVM是java程序的运行环境,相当于java的虚拟机,Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 你可以理解为jvm,是java代码运行时候的虚拟机,但这个虚拟机这三个字只是我们的类比。
JVM定义了一套抽象的而非真实存在的机器,就像一台摸不见看不着的处理器一样存在。 如果把他转换成实体机器的话,它拥有自己的指令集,一组寄存器,一个堆栈,一个“垃圾堆”,和一个方法区。
这里不得不提一下: 人很难感知到自己感知不到的感知。
所以我们这里用的是类比,就相当于我们说内存,如果去掉内存卡这个实物, 一个没有实体但是真实存在的与内存功能相似的东西,我们就很难描述出来。
这个JVM也一样,我们可以类比成拥有自己的指令集,一组寄存器,一个堆栈,一个“垃圾堆”,和一个方法区的java虚拟机,但这个虚拟机实体并不真实存在。
或者换句话说,JVM是java程序的一个具有隐身功能的翻译官,java程序本身是不能被操作系统所识别的,而JVM就负责翻译给操作系统听。
JVM也有自己的生命周期,一般java程序开始执行的时候,jvm就运行,程序结束,JVM就跟着结束。 如果把java程序的运行比作一次外交会议的话,那这个JVM翻译官的角色是不是就容易理解了。
jvm的线程有两种: 一种是守护线程,一种是普通线程。与jvm相关的内容太多了,一个工作了三年的java人员都很多人搞不明白,何况运维只是学个tomcat。
8080: http连接器的端口,就是http协议去链接访问tomcat的端口
8004: tomcat需要跟其他服务器通讯会用到AJP协议,ajp是apache提供的与其他服务器通讯的一种协议,如果要做这个协议就需要开启8004
8008: 关闭tomcat的时候用的到, 关闭tomcat,其实就是向8008发送关闭请求而已。
就像下面这样
socketChannel.open(new InetSocketAddress("127.0.0.1", 8008))
.write(ByteBuffer.wrap("SHUTDOWN".getBytes()));
这些概念虽然与tomcat本身关系不大,但是作为一个在学习运维的新手来说,是必须要理解的。 而事实上我带过的学员里面,大多都理解不了这几个概念。这也是我今天写下这个总结的原因,后续会持续改进,直到一个新手看了就能明白为止。