JSP全称Java Server Pages,是一种动态网页开发技术,本质就是一个Servlet。它会在客户端首次访问时解析出Java代码(翻译),并进行编译,通过IO流将动态内容传递到客户端浏览器。因为其实就是一个Servlet,所以具有Servlet的一切特征,如生命周期、内置对象等,并由服务器生成对象并启动。

JSP产生的Java类,其类名为org.apache.jsp.Name_jap,其中Name为.jsp文件的文件名;它继承了HttpJspBase,而HttpJspBase又继承了HttpServlet;它也具有初始化、执行和销毁时调用的方法,包括_jspInit、_jspService(request, response)和_jspDestroy,这些方法都间接调用了Servlet中的方法。JSP页面中的HTTP部分由IO流对象out直接写出,其余部分进行编译后再写出。

元素

JSP能够执行Java代码的部分包括指令元素(directive element)、动作元素(action element)和脚本元素(script element)。

  • 指令元素能够指导JSP页面的相关信息和设置相关属性,如网页的编译语言、编码、是否采用Session、异常处理、导包、引入标签库等。

    1. <%@page language="java" contentType="text/html; charset=utf-8"
    2. pageEncoding="utf-8"%>
    3. <%@page errorPage="./error.jsp" isErrorPage="false" %>
    4. <%@page import="java.util.List" session="true" %>
    5. <%@page import="java.util.UUID" %>
    6. <%@include file="./ErrorPage.jsp" %> <%-- 静态导入(直接把其他JSP页面复制一份到当前页面中) --%>
  • 动作元素能够指导客户端请求JSP页面时调用相应的组件,如服务器跳转、动态包含、对象包装等。

    1. 页面跳转:
    2. <jsp:forward page="target.jsp"></jsp:forward>
    3. 跳转的同时还可以传参数:
    4. <jsp:forward page="target.jsp?name=tom">
    5. </jsp:forward>
    6. 或者专门用来传参数:
    7. <jsp:forward page="target.jsp">
    8. <jsp:param value="tom" name="name"/>
    9. </jsp:forward>
    10. 动态包含:
    11. <jsp:include page="foot.jsp">
    12. <jsp:param value="lisi" name="name"/>
    13. </jsp:include>
  • 脚本元素能够将代码翻译为类中不同地方的Java代码进行执行。有三种脚本元素:

    • 脚本<% %>:解释为_jspService方法中的代码。可以在此进行流程处理。
    • 表达式<%= %>:解释为类中的代码。可以在此打印HTTP语句。以上两种需要注意顺序。
    • 声明<%! %>:解释为_jspService方法中的out.print()中的参数,不受顺序影响。可以在此定义方法和全局变量。 ```java <%! private String name; public String go(){ System.out.println(“hello world “+name); return “this is go()”; } %>

<% Student s = new Student(); String name = “tom”; String username = s.getName(); List list = new ArrayList(); list.add(“hello”); %>

<%= “hello” %> <%= student.getName() %> 代码会被解释成: out.print(“hello”); out.write(“\r\n”); out.write(“\r\n”); out.print(student.getName()); ```

  • JSP除了可以在HTML部分使用HTML注释和在脚本中使用Java注释以外,也具有特有的注释:<%-- --%>

    内置对象

    可以在JSP的脚本元素中使用内置对象,这些内置对象有一些是JSP特有的,有一些是Servlet中也有的。这些内置对象包括(左边是对象类型,右边是对象名,带*能够传递数据):

  • HttpServletRequest request*:请求对象。

  • HttpServletResponse response:响应对象。
  • HttpSession session*:Session对象。
  • ServletContext application*:Application对象。
  • PageContext pageContext*:上下文对象,作用范围为整个页面。
  • ServletConfig config:Servlet配置对象。
  • JspWriter out:IO流对象。
  • Object page:页面对象,表示当前的JSP类的对象本身(即this)。
  • Throwable exception:异常对象。