前言:

本文内容:JSP原理剖析、JSP基础语法和指令

推荐免费JavaWeb入门到实战视频:【狂神说Java】JavaWeb入门到实战_哔哩哔哩_bilibili

JSP原理剖析

JSP

JSP(JavaServerPages):Java服务器端页面,也和Servlet一样,用于动态Web技术。

特点:

  • 写JSP就像在写Html
  • Html之提供静态数据
  • JSP可以嵌入Java代码,为用户提供动态数据

JSP原理

JSP是如何执行的

  • 服务器内部工作

    Tomcat中有一个work目录

  • IDEA中使用Tomcat会在它的Tomcat生成一个work目录

    1
    C:\Users\Joker大雄\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_javaweb-cookie-session\work\Catalina\localhost\jc1\org\apache\jsp
  • 发现页面转变为Java程序

    124

    浏览器向服务器发送请求,访问资源都是在访问Servlet

    JSP最终也会被转为Java类,其本质还是Servlet

    1
    2
    3
    4
    5
    6
    7
    8
    // 初始化 
    public void _jspInit() {
    }
    // 销毁
    public void _jspDestroy() {
    }
    // JSPService
    public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

    1、判断请求

    2、内置一些对象

    1
    2
    3
    4
    5
    6
    7
    8
    final javax.servlet.jsp.PageContext pageContext; // 页面上下文
    javax.servlet.http.HttpSession session = null; // session
    final javax.servlet.ServletContext application; // applicationContext
    final javax.servlet.ServletConfig config; // config
    javax.servlet.jsp.JspWriter out = null; // out
    final java.lang.Object page = this; //page
    HttpServletRequest request; // request 请求
    HttpServletResponse response; //response 响应

    3、输出页面前增加代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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;

    4、以上哪些对象我们可以在JSP页面直接使用

    原理图

    123

    在JSP页面中,只要是Java代码就原封不动的输出,如果是Html代码,就会被转换为out.write(<html>\r\n);

JSP基础语法和指令

JSP语法

JSP支持Java所有语法,还有JSP一些扩展语法;
JSP表达式:

1
2
3
4
5
6
<%--    JSP基本语法--%>
<%--JSP表达式
作用:用来将程序输出,输出到客户端
<%= 变量表达式%>
--%>
<%= new java.util.Date()%>

JSP脚本片段:

1
2
3
4
5
6
7
8
<%--JSP脚本片段--%>
<%
int sum=0;
for(int i = 1;i<=100;i++){
sum+=i;
}
out.print("<h1>Sum="+sum+"</h1>");
%>

脚本片段实现

1
2
3
4
5
6
7
8
<%--在代码中嵌入HTML元素--%>
<%
for(int i=0;i<5;i++) {
%>
<h1>Hello World <%=i%></h1>
<%
}
%>

JSP声明

1
2
3
4
5
6
7
8
9
10
<%--定义全局变量 JSP声明--%>
<%!
static {
System.out.println("Loading Servlet");
}
private int globalVar =0;
public void inner(){
System.out.println("进入inner方法");
}
%>

JSP声明:会被编译到JSP生成Java类中,其他会生成到_jspService方法中

EL表达式

1
${表达式内容}

小结

1
2
3
4
5
<%%>
<%=%>
<%!%>
<!--Html注释-->
<%--JSP注释--%>

Html注释可以在网页源代码显示,JSP注释则不显示

JSP指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%--解决乱码--%>
%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导包--%>
<%@ page import="java.util.Date" %>
<%--定制错误页面--%>
<%@ page errorPage="error/error.jsp" %>
<%--显示错误页面--%>
<%@ page isErrorPage="true" %>

<html>
<head>
<title>JSP指令</title>
</head>
<body>
<%
int i =1/0;
new Date();
%>
</body>
</html>

web.xml配置错误页面

1
2
3
4
5
6
7
8
9
<!--    定义404和500错误-->
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/error.jsp</location>
</error-page>

页面导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--jsp指令实现--%>
<%--指令实现会将两个页面合二为一--%>
<%@ include file="header.jsp"%>
<h1>网页主体</h1>
<%@ include file="footer.jsp"%>
<hr>
<%--jsp标签实现--%>
<%--标签实现是拼接页面 推荐使用标签实现--%>
<jsp:include page="header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="header.jsp"/>
</body>
</html>