JSP九大内置对象解析、JSP指令(page、include)、静态联编概述

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w_linux/article/details/79791601

博客目录

1、JSP九大内置对象
2、JSP指令(page指令、include指令)
3、静态联编

一、JSP九大内置对象

这里写图片描述

1、JSP内置对象特点

  • 由JSP规范提供,不由编写者实例化
  • 通过Web容器实现和管理
  • 所以JSP页面均可使用
  • 只有在JSP表达式块和代码块中才可以使用<%= %>,<% %>

2、九大内置对象位置——编译后的Servlet文件中

这里写图片描述

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      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;

在编译页面后,类Servlet一般都会有如上所示的结构,其中内置对象request和response是_jspService()方法的形参,当Tomcat调用该方法是会初始化这两个对象。而page、pageContext、application、config、session、out都是方法_jspService()的局部变量,由该方法完成初始化


3、pageContext对象

pageContext代表JSP页面的上下文,功能是访问JSP之间的所有共享数据。使用pageContext对象可以访问page、request、session、application范围的变量,还可以获取其他内置对象如下

  • ServletRequest getRequest():获取request对象
  • ServletResponse getResponse():获取response对象
  • ServletConfig getServletConfig():获取config对象
  • ServletContext getServletContext():获取application对象
  • HttpSession getSession():获取session对象

一旦JSP和Servlet编程中获取了pageContext对象,就可以通过它提供的方法来获取其他内置对象


4、request对象

内置对象request是JSP中最重要对象之一,每个request对象封装了一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径

例(一个表单处理例子)

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form id="form1" method="post" action="request.jsp">
    用户名:<br>
    <input type="text" name="name"><hr>
    性别:<br>
    男:<input type="radio" name="gender" value="男">
    女:<input type="radio" name="gender" value="女">
    <br>
    喜欢的颜色:<br>
    红:<input type="checkbox" name="color" value="红">
    绿:<input type="checkbox" name="color" value="绿">
    蓝:<input type="checkbox" name="color" value="蓝">
    <br>
    来自的国家:<br>
    <select name="country">
        <option value="AA">AAA</option>
        <option value="BB">BBB</option>
        <option value="CC">CCC</option>
    </select>
    <hr>
    <input type="submit" value="提交">
    <input type="reset" value="重置">
    </form>
</body>
</html>

request.jsp

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        //获取所有请求头的名称
        Enumeration<String> headerNames=request.getHeaderNames();
        while(headerNames.hasMoreElements())
        {
            String headerName=headerNames.nextElement();
            //获取每个请求及其对应的值
            out.println(headerName+"-->"+request.getHeader(headerName)+"<br/>");
        }
        out.println("<hr>");
        //设置解码方式,简体中文使用gb2312解码
        request.setCharacterEncoding("utf-8");

        //下面依次获取表单域的值
        String name=request.getParameter("name");
        String gender=request.getParameter("gender");

        //如果某个请求参数有多个值,将使用该方法获取多个值
        String[] color=request.getParameterValues("color");
        String national=request.getParameter("country");

    %>
        <!-- 下面依次输出表单域的值 -->
        你的姓名:<%=name %><br>
        你的性别:<%=gender %><br>

        <!-- 输出复选框获取的数组值 -->
        你喜欢的颜色:
        <%
            for(String c:color){out.println(c+" ");}
        %>
        <hr>
        你来自的国家:<%=national %><hr>
</body>
</html>
用户请求方式及结果

这里写图片描述



这里写图片描述


5、session对象

JSP中的session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间,在JSP页面中,session的会话是HttpSession类的实例


6、application对象

因为application对象代表Web应用本身,所以使用application来操作Web应用的相关数据。application对象实现了用户间数据的共享,可以存放全局变量。application开始于服务器的启动,直到服务器关闭时结束,在这段时间内application对象一直存在。在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作,在任何地方对此对象属性的操作,都将影响到其他用户的访问。服务器的启动和关闭决定了application对象的生命。application对象是ServletContext类的实例


7、response对象

response对象把作为JSP页面处理结果返回给用户的响应存储在该对象中,并提供了设置响应内容,响应头以及重定向的方法,例如cookie、头信息等,在大多数情况下,程序无法使用response来响应客户端请求,因为使用out响应对象的方法更简单。但是out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容,如果需要在JSP页面动态生成一幅位图,或者输出一个pdf文档,使用out作为响应对象无法完成,此时必须使用response作为响应输出


8、config对象

在JSP页面中,对象config代表当前JSP配置信息,该对象在JSP页面中比较少用,常用在Servlet中


9、out对象

对象out代表一个页面输出流,功能是在页面上输出变量值及常量。通常使用在输出表达式的地方都可以使用out对象来达到同样的效果,输出对象out中常用的方法如下

  • print或println:输出数据
  • newLine:输出换行字符
  • flush:输出缓冲区数据
  • close:关闭输出流
  • clear:清除缓冲区中数据,但不输出到客户端
  • clearBuffer:清除缓冲区中数据,输出到客户端
  • getBufferSize:获得缓冲区大小
  • getRemaining:获得缓冲区中没有被占用的空间
  • isAutoFlush:是否为自动输出
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        int sum=5;
        out.println(5);
    %>
</body>
</html>
客户浏览器显示结果

这里写图片描述


10、exception对象

对象exception是Throwable的实例

功能:表示JSP脚本程序中产生的错误和异常。因为JSP脚本包含的所有可能出现的异常都可以叫诶处理页面处理,所以JSP程序员不要处理异常,即使该异常是checked异常

在JSP中,被调用的错误页面的结果,只有在错误页面中才可使用,也就是说在页面指令中设置
<%@ page isErrorPage="true"%>
异常处理

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    errorPage="error.jsp"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP异常机制</title>
</head>
<body>
    <%
        int a=9;
        int c=a/0;
    %>
</body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    isErrorPage="true"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>异常处理页面</title>
</head>
<body>
    异常类型:<%out.println(exception.getClass()); %>
    异常信息:<%out.println(exception.getMessage()); %>
</body>
</html>

浏览器异常结果

这里写图片描述


二、JSP指令(page指令、include指令)

1、JSP指令分类

  • page指令:页面指令
  • include指令:包含指令
  • taglib指令:标签库指令(之后的博客再对该指令解析)

2、JSP指令作用

  • 为当前页面做一些基本属性设置
  • 为当前页面的运行提供基本环境

3、语法格式

<%@ 指令名称 属性名=属性值 属性名=属性值....%>

4、page指令

常用的属性
<%@ page
 language="java"
 contentType="text/html; charset=UTF-8"
 errorPage="error.jsp"
 pageEncoding="UTF-8"
 import="java.util.*"
 session="true"
 buffer="none|8kb|size kb"
 autoFlush="true"
 isErrorPage="false" 
 %>
解析
  • language:声明当前JSP页面使用的脚本语言,因为是JSP页面,所以默认是Java,也只能是Java
  • contentType:用于设定生成的网页的文件格式和编码字符集,即MIME类型和页面字符集类型。默认的MIME是text/html,默认的字符集类型是ISO-8859-1
  • errorPage:设置错误处理页面,如果出现异常,跳转到指定错误页面
  • pageEncoding:设置生成网页的编码字符集
  • import:用于导入包,以下几个包默认自动导入,不用显示导入
    • java.lang.* \javax.Servlet.* \javax.Servlet.jsp.* \javax.Servlet.http.*
  • session:设置这些JSP页面是否需要HTTPSession
  • buffer:设置输出缓冲区的大小。输出缓冲区的JSP内置对象out用于缓存JSP页面对客户浏览器的输出,默认值是8kb,也可以设置为none,也可为其他值,单位是kb
  • autoFlush:当输出缓冲区即将溢出时,设置是否需要强制输出缓冲区的内容。如果设置为true则表示正常输出,如果设置为false,表示会在buffer溢出是产生一个异常
  • isErrorPage:设置本JSP页面是否错误处理程序

5、include指令 <%@ include file=”/xxx.jsp”%>

  • JSP中使用include指令后,可以将一个外部文件嵌入到当前的JSP文件中,同时解析这个页面的JSP语句
  • include指令是一个静态的include语句,能够把目标页面的其他编译指令也包含进来,两个文件的变量是通用的
  • include指定包含的文件可以是JSP,也可以是HTML

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    This is index.jsp<br>
    <%@include file="/other.jsp" %>
    <br>
    <%
        out.println(otherName);
    %>
</body>
</html>

other.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    this is other.jsp
    <%
        String otherName="other99999";
    %>
</body>
</html>

客户浏览器显示结果

这里写图片描述


三、静态联编

根据以上include指令后,查看Tomcat的work下的相关子目录,只生成了一个index_jsp.java的Servlet源文件,并没有生成other_jsp.java文件

因为JSP翻译引擎在翻译时,会将include指令所指定的文件内容直接翻译到当前JSP对应的Servlet中,形成一个.java文件。

这就说明一个问题,这个是包含操作,是在编译之前完成的,在编译之前由JSP翻译引擎完成的,不是在程序运行期完成的,这种包含是一种静态包含————静态联编

这里写图片描述

使用include指令的优点

因为有些网站的头部底部左侧,在很多页面都是相同的,使用include可以减少重复性工作,可以使用include指令,实现“一改全改”效果

展开阅读全文

没有更多推荐了,返回首页