一种动态网页开发技术
JSP
JSP(Java Server Pages),是一种动态网页开发技术。 它使用JSP标签在HTML网页中插入Java代码。JSP=HTML+Java+JSP标签(指令)。
原理
Tomcat的work目录存放.jsp文件翻译之后的.java文件和编译之后的.class文件。Intellij Idea中查看JSP运行时的临时文件1:

JSP是Servlet。生成的Java文件中,其继承自HttpJspBase(在Tomcat的lib目录下的jasper.jar包中),而HttpJspBase继承自HttpServlet。
public final class demo_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports
public abstract class HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage 
生命周期(执行过程),类似Servlet2:
- 编译阶段,第一次访问,Servlet容器翻译成.java源文件,编译成.class字节码文件
- 初始化阶段,第一次访问,加载与JSP对应的Servlet类,创建其实例,并调用它的init初始化方法
- 执行阶段,调用与JSP对应的Servlet实例的service服务方法
- 销毁阶段,调用与JSP对应的Servlet实例的destroy销毁方法
语法
- 
    JSP模版 JSP页面中的HTML代码 
- 
    JSP声明标签 用法<%! 变量或方法 %>,翻译成成员变量、成员方法和静态代码块 <%--JSP声明标签--%> <%! // 声明变量 String name = "lideyu"; // 声明方法 public String getName() { return name; } // 静态代码块 static { System.out.println("这是静态代码块"); } // 不能重复定义已经翻译好的方法,如_jspInit、_jspDestroy、_jspService等方法 /*public void _jspInit() { }*/ %>
- 
    JSP脚本标签 用法<% Java代码 %>,将Java脚本拷贝到_jspService执行,多个<%…%>之间变量可以相互访问,但有先后顺序 <%--JSP脚本标签--%> <% // java代码 // 获取当前时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String curDate = sdf.format(new Date()); // 输出内容到浏览器 response.getWriter().write("当前时间为:" + curDate + "<br>"); // 脚本中不能声明方法 /*public String getName(){ return name; }*/ %> <% // out是JSP内置对象,用来向客户端输出,idea中使用out内置对象的write方法需要添加jsp-api的jar包,否则会报红,浏览器依然可以正常访问 out.write("当前时间为:" + curDate + "<br>"); %>
- 
    JSP表达式标签 用法<%=变量或表达式%>,将_jspService方法中通过out.print方法输出该变量或表达式,变量或表达式后面不能有分号 <%--JSP表达式标签--%> <%=curDate%> <%=(5 + 5)%>
- 
    JSP注释 <%--JSP注释,在翻译成.java文件时会被忽略--%> <!--HTML注释,在翻译成.java 文件时不会被忽略,并且会被发送到客户端浏览器,F12源码可见-->
三大指令
- 
    page指令3 定义JSP页面的各种属性,比如脚本语言(language)、编码(pageEncoding和contentType)、导入要使用的Java类(import)、error页面(errorPage和isErrorPage,也可以在web.xml中配置全局错误页面)、缓存(autoFlush和buffer)等等,在web.xml页面中配置jsp-config也能完成page指定的功能。 <%@ page import="java.text.SimpleDateFormat,java.util.Date" contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
- 
    include指令 包含其他文件,并翻译成一个Servlet,通常称为静态导入4 
- 
    taglib指令 JSP页面中导入标签库,例如JSP标准标签库(JSTL)、自定义标签 
九大内置对象
- 
    out(JspWriter):JspWriter类,相当于带缓存的PrintWriter类,用来向客户端发送文本数据;5 
- 
    config(ServletConfig):即ServletConfig类的对象; 
- 
    page:当前JSP页面,等同this即当前对象; 
- 
    pageContext(PageContext) JSP页面上下文对象,域对象,只能在JSP页面中使用 - 
        域对象功能 包含setAttribute(String name, Object value)、Object getAttrbiute(String name, Object value)、removeAttribute(String name, Object value)等方法。 
- 
        代理其他域对象功能 包含setAttribute(String name, Object value, int scope)、getAttribute(String name, int scope)、removeAttribute(String name, int scope)、findAttribute(String name)等方法,scope为常量PageContext.PAGE_SCOPE、PageContext.REQUEST_SCOPE、PageContext.SESSION_SCOPE、PageContext.APPLICATION_SCOPE。 findAttribute方法依次在page、request、session、application范围查找名称为name的数据,如果找到就停止查找。在这个范围内有相同名称的数据,那么page范围的优先级最高。 
- 
        获取其他内置对象 通过getXXX()方法获取其他内置对象。 
 
- 
        
- 
    exception(Throwable):只有在错误页面中可以使用这个对象,如<%@ page isErrorPage=”true” %>; 
- 
    request(HttpServletRequest):即HttpServletRequest类的对象; 
- 
    response(HttpServletResponse):即HttpServletResponse类的对象; 
- 
    application(ServletContext):即ServletContext类的对象; 
- 
    session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session。 
EL表达式
代替JSP表达式标签6
- 输出域对象数据
- 执行运算(搭配jstl标签使用)
- 获取Web开发常用对象(定义了11个隐含对象)
- 调用Java方法(使用jstl的fn函数库或者自定义EL函数库)
JSP标签
- 
    内置标签(动作标签): 不需要在jsp页面导入标签7 - jsp:include,运行级别的包含,当前JSP和被包含JSP分别生成Servlet,执行时通过RequestDispatcher的include()方法包含,称为动态导入4
- jsp:forward,与RequestDispatcher的forward()方法作用相同,最后客户端只能看到转发后的JSP页面,无法看到当前的JSP页面输出
- jsp:param, 设置的参数可以在被包含、转发的页面中通过request.getParamter()获取
 
- 
    jstl标签: 需要在jsp页面中导入标签 包括核心标签库(c标签库),国际化标签(fmt标签库),EL函数库(fn函数库),xml标签库(x标签库,一般不用),sql标签库(sql标签库,一般不用)。 
- 
    自定义标签 : 开发者自行定义,需要在jsp页面导入标签 继承SimpleTagSupport类,重写doTag方法;在WEB-INF目录下编写xxx.tld标签库声明文件(参考核心标签库的tld文件);引用并使用自定义标签8。 
