JSP
一、Jsp简介
JSP(全称Java Server Pages)java服务器页面。 是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求,本质是简化版的Servlet。
jsp 的本质是Servlet; 主要用于数据的呈现.
二、 创建一个JSP页面
如下图所示:点击后 输入页面名字即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0Hl69dF-1651660782261)(img/image-20210627221130019.png)]
三、jsp的执行原理
第一次访问jsp的执行原理:
在第一次访问jsp页面时,会先将jsp翻译成jsp名_jsp.java 的源文件,然后再将其编译成字节码文件,在交给jvm来运行,然后输出其中静态内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YQjtfFd-1651660782262)(img/img1.png)]
注意: 将jsp翻译成java文件的过程是由服务器完成的,用户是没法干涉的。
第二次访问jsp运行原理
第二次执行会跳过翻译和编译两个过程,直接执行字节码文件,输出响应内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0T0oDZEs-1651660782263)(img/img2.png)]
jsp的本质是一个servlet的原因是在编译成java文件之后,生成的java文件和servlet类基本是一致的,其中静态内容是有servlet 中响应对象输出去的,可以在虚拟工作空间查看。
jsp和servlet之间的联系和区别
jsp生成的java文件的继承关系图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GLeh2nOY-1651660782263)(img/img3.png)]
联系:
jsp : jsp -> HttpJspBase -> HttpServlet
自定义servlet servlet -> HttpServlet
通过继承关系图可知,继承或者实现的接口都是一样的,只是具体的实现会有些不同。
区别:(记)
- jsp 主要数据的呈现而servlet ,主要数据的处理以对页面跳转的控制。
- jsp 是简化的servlet,是需要服务器来动态的生成java类的,servlet 本身就是一个java类。
- jsp是html作为模板的,其中包含前端静态的内容,而servlet 就是java是没办法包含前端静态内容的。
- jsp主要负责将前端内容利用servlet特性动态生成页面,而servlet负责servlet的所有功能,相对来说更全面。
- jsp中有九大内置对象,而servlet 中没有内置对象的概念。
四、jsp的组成
- 前端内容,包含html、css、javaScript
- java代码
- jsp中指令
- 动态标签
- 注释 <%-- 注释内容 – %>
五、java代码
jsp是以java作为脚本语言的,因此jsp 中是可以编写java代码的,在jsp中就java代码有三种存在形式。分别是java声明、java脚本、java表达式。
1. java声明
java的声明是在jsp 的方法外,类中创建的成员变量或者是方法。
语法: <%! java 声明 %>
2.jsp中的java脚本:
jsp 中的java脚本本质就是jsp中编写的java代码片段,java脚本的位置对应jsp生成的java代码中的service方法中。
语法: <% java脚本; %>
3.jsp中java表达式:
jsp 中的java表达式用于输出内容到页面,表达式的位置在service方法,和print()方法中的参数是一个位置。
语法: <%=表达式 %>
注意: 变量或者表达式的后面不需要加分号。
实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello world!!!
<%-- 对于jsp中的java声明,相当于在 类中成员变量的位置写代码, 主要用于声明全局变量 , 创建方法 --%>
<%!
public int num = 10; // 全局变量
// 声明一个方法
public void method(){
System.out.println(num);
}
%>
<%!
int sum = 10 + 20;
%>
<%-- jsp 中的java脚本, 相当在service 方法中写代码 --%>
<%
response.getWriter().print(sum);
method();
%>
<%
int a = 10;
int b = 20;
%>
<%
int su = a + b;
System.out.println("两个数的和是: a + b : " + su);
%>
<%-- jsp中java表达式相当于在service方法中调用 response.getWriter().print(sum); 方法是print 方法中的参数--%>
<%=su%>
<%="我是java表达式"%>
</body>
</html>
jsp 中源码:
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/9.0.53
* Generated at: 2021-09-16 08:27:06 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 {
public int num = 10; // 全局变量
// 声明一个方法
public void method(){
System.out.println(num);
}
int sum = 10 + 20;
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 {
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
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