我们前面做的所有东西都是后台进行信息的处理和传输,前台进行数据的显示,但是我们无法不进行页面的跳转而展示出动态的内容,这是因为我们之前所使用的html是静态网页,而动态网页的制作还需要功能更为强大的jsp
Jsp介绍及运行原理
Jsp简介
JSP(java server pages) Java服务器页面
静态网页:可以直接被浏览器渲染。但是不能做数据交互。
动态网页:不可以被浏览器直接渲染,需要第三方辅助,可以与Java进行数据交互操作。
JSP = html+java+jsp本身的标签
JSP是动态资源。但是在编写上和访问上更像静态资源。存储时也和静态资源放在一起
而本质上,jsp就是一个Servlet。
为什么这么说呢,我们来编写一个jsp文件。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>第一个jsp网页</h1>
</body>
</html>
我们在大体上看起来感觉这里就是一个html网页。除了上面多了一行标记代码。
在前面介绍tomcat的安装文件时,介绍了一个文件夹 work 作用是用来存储动态资源。其实就是用来存储jsp文件。
我们用服务器来运行这个jsp。
从这里看到,感觉更像是一个html文件了。
我们去work文件夹下查看:
(我对这个项目的命名为jsp,所以上面路径上的jsp都指的是这个项目名)
我的jsp文件名为first.jsp,我们可以观察看到,这里有两个和我文件名类似的文件,但是这是java文件,和编译后的class文件。我们打开java文件查看:
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.43
* Generated at: 2019-12-14 08:16:50 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class first_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\t<h1>第一个jsp网页</h1>\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
观察可以得知,里面有inti方法,destory方法,service方法。还可以看到,我们jsp网页上的html语句都是由打印流,打印上去的。
而这个文件继承的父类HttpJspBase其实就是继承自HttpServlet,是HttpServlet的一个子类。
所以我们可以得知,jsp是这样运行的:
一个jsp在第一次访问时,会被服务器中的jsp引擎(服务器中编译jsp的软件模块)
编译成一个Servlet jsp名字_jsp.java jsp名字_jsp.class并且放在 Tomcat的work目录下。
JSP和Servlet表现形式上不同
a.编写jsp文件就是编写文本文件一样。编写servlet编写的是java程序。
b.编写jsp以后,直接将jsp拷贝到容器的部署目录就可以了。
c.编写后的servlet要通过web.xml文件加以配置。jsp直接访问就行了。
d.jsp和静态资源放在一起就可以了。-----jsp在使用上更像静态资源。
简要来说就是:
Servlet:继承HttpServelt 作为控制层框架<连接前后台>,作用是接收页面的数据、调用业务方法、返回指定页面。
JSP:继承HttpJspBase 这个类是一个HttpServlet的子类。但是属于一个简化版的Servlet。作用是为了能够让Jsp页面实现动态交互。 作为展示层<展示信息>存在