一种动态网页开发技术
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。