一、JSP开口汤
1.1、为什么学习JSP
暂且总结如下3点原因:
- 公司里可能有陈年的老项目,其中不乏使用JSP开发的,如果公司安排让你维护,敢不干否?
- JSP与Servlet是雌雄同体,一体两面,而不少的Web框架又是构建在Servlet和JSP之上的,要想了解各中原理,敢不学否?
- 初学阶段大多是单体应用,此时没有前后端分离,自己又当前端又当后端,写写Demo玩玩,敢不玩否?
1.2、为什么使用JSP?(WHY)
让我们先看看不用JSP,直接使用Servlet来获取一个HTML页面是多么的酸爽
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello JSP!</h1>
</body>
</html>
如果是通过请求Servlet的方式来获得以上HTML页面↓
如下:
package cn.report.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloJSPServlet
*/
@WebServlet("/HelloJSPServlet")
public class HelloJSPServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("<!DOCTYPE html>\r\n");
writer.write("<html>\r\n");
writer.write("<head>\r\n");
writer.write("<meta charset=\"UTF-8\">\r\n");
writer.write("<title>Insert title here</title>\r\n");
writer.write("</head>\r\n");
writer.write("<body>\r\n");
writer.write("<h1>Hello JSP!</h1>\r\n");
writer.write("</body>\r\n");
writer.write("</html>\r\n");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
怎么样,酸爽吧,仅仅是这么一丢丢代码,就需要如此繁复的编码才能实现,委实不值当呐。所以要不看下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>Hello JSP!</h1>
</body>
</html>
看看,高下立判!!!
1.3、如何使用JSP?
eclipse中步骤如下:
-
创建动态的web工程。
-
在WebContent目录下创建一个index.jsp页面。
注意:不要错误地创建在WEB-INF目录下,该目录下的资源对客户端是不可见的
-
通过http://localhost:8080/project01/index.jsp即可访问创建的JSP页面
二、JSP细节
2.1、JSP概述
JSP本质上是一个Servlet。JSP页面在JSP容器中运行,一个Servlet容器通常也是一个JSP容器。例如,Tomcat就是一个Servlet/JSP容器。
2.1、JSP自带的API包含4个包:
- javax.servlet.jsp。
包含用于Servlet/JSP容器将JSP页面翻译为Servlet的核心类和接口,其中的两个重要成员是JspPage和HttpJspPage接口。所有的JSP页面实现类必须实现JspPage或HttpJspPage接口。在Http环境下,实现HttpJspPage接口是显而易见的选择。
- javax.servlet.jsp.tagext。
包括用于开发自定义标签的类型。
- javax.el。
提供了统一表达式的API。
- javax.servlet.jsp.el。
提供了一组必须由Servlet/Jsp容器支持,以便在JSP页面中使用表达式语言的类
2.3、当一个JSP页面被请求时,Servlet/JSP容器做了啥?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rwQFuWl2-1608118404977)(C:\Users\Hello World\AppData\Roaming\Typora\typora-user-images\image-20201216192324099.png)]
-
JSP页面—>转换为JSP页面实现类。
-
JSP页面实现类是javax.servlet.jsp.JspPage或其子接口javax.servlet.jsp.HttpJspPage的实现类。
-
而javax.servlet.jsp.JspPage是javax.servlet.Servlet的子接口。
-
所以JSP页面最终会被转化为一个Servlet。
注意
① 以上都是由Servlet/JSP容器来完成的,并且转化成功之后,Servlet/JSP容器随后会编译该类,并装载和实例化该类,像其他的正常的Servlet一样,执行生命周期操作。
②对于同一个JSP页面的后续请求,Servlet/JSP容器会先检查JSP页面是否被修改过。如果是,则该JSP页面会被重新翻译、编译并执行。如果不是,则执行已经在内存中的JSP Servlet,这样一来,一个JSP页面的第一次调用的实际花费总比后来的花费多,因为它涉及翻译和编译。