百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

《JSP》第08节:JSP三大指令之Page指令(二)

yuyutoo 2024-11-06 21:00 3 浏览 0 评论

JSP指令是指:用于设置JSP页面相关属性的一个语法命令,例如:设置页面编码字符集、导入其他包等等。JSP中提供了三个指令,分别是:page指令、include指令、taglib指令。其中page指令用于设置JSP页面属性,include指令用于引入其他的JSP文件,taglib指令用于引入标签库。这一小节内容介绍page指令的使用。

1.1、基础语法

JSP中page指令的语法规则如下所示:

<%@ page 属性名称="属性值" %>

注意:一个page指令中,可以有多个【属性名称=属性值】,也可以多次使用page指令

1.2、指令属性

page指令中,提供了很多个属性,常见的属性有这几个:contentType、pageEncoding、errorPage、isErrorPage、import、language、session、isELIgnored,下面我们就介绍每一个属性的作用。

这一小节介绍errorPage、isErrorPage、session、isELIgnored四个属性的作用。

(1)session

session属性作用:设置当前JSP页面中是否可以使用session对象,取值:true、false。默认是true,设置成false,那么当前JSP页面里面就不能使用session对象。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>

<html>
<head>
    <title>JSP指令之Page</title>
</head>
<body>
    <h3>JSP指令之Page</h3>
    <%
        // 使用session对象
        Object username = session.getAttribute("username");
        System.out.println(username);
    %>
</body>
</html>

如果设置session="fasle",那么在JSP页面中使用session,编译会报错,如下所示:

这是因为,当我们设置session="false"的时候,JSP编译之后,对应的java源代码中,都不会定义session变量,来看下session设置成true和false两种情况下,对应的源代码如下图所示:

(2)isELIgnored

isELIgnored属性作用:这个属性的作用是设置当前JSP页面是否忽略EL表达式,取值:true、false,默认值是true。

  1. false表示当前页面不忽略EL表达式,那么也就是说,当前JSP页面支持EL表达式;
  2. 设置成true之后,那么当前JSP页面中如果使用了EL表达式的内容,此时会被当作普通字符输出。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="true" %>

<html>
<head>
    <title>JSP指令之Page</title>
</head>
<body>
    <h3>JSP指令之Page</h3>
    使用EL表达式获取参数: ${"输出EL表达式内容"}
</body>
</html>

运行结果如下所示:

当我们设置成isELIgnored="false"的时候,再次访问jsp页面,此时结果如下所示:

(3)isErrorPage

isErrorPage属性作用:指定当前JSP页面是否作为错误处理界面,取值:true、false,默认值是false。设置成true之后,那么当其他的JSP页面发生报错的时候,通过errorPage属性,就会转发到这个错误页面。

注意:isErrorPage属性一般是和errorPage属性结合使用的

(4)errorPage

errorPage属性作用:指定当前JSP页面的错误页面地址,一般是和isErrorPage属性结合使用。errorPage设置的相对路径,源代码上就是转发到对应的错误页面。

  • 首先创建一个error.jsp页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 指定当前页面是错误页面 --%>
<%@ page isErrorPage="true" %>
<html>
<head>
    <title>JSP错误显示页面</title>
</head>
<body>
  <h3>
    Sorry,你访问的页面报错啦!!!
  </h3>
</body>
</html>
  • 接着再创建一个page.jsp页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 指定错误页面的路径地址 --%>
<%@ page errorPage="error.jsp" %>
<html>
<head>
    <title>errorPage属性</title>
</head>
<body>
    <%-- 模拟报错 --%>
    <%
        int i = 10 / 0;
    %>
</body>
</html>

启动Tomcat容器,浏览器访问http://localhost:8080/servlet/page.jsp,结果如下所示:

查看page.jsp编译之后对应的源代码,可以看到有一个handlePageException()方法,这个方法就是处理JSP页面异常的。

点进去查看源代码,如下所示:

private void doHandlePageException(Throwable t) throws IOException, ServletException {
    if (this.errorPageURL != null && !this.errorPageURL.equals("")) {
        this.request.setAttribute("javax.servlet.jsp.jspException", t);
        this.request.setAttribute("javax.servlet.error.status_code", 500);
        this.request.setAttribute("javax.servlet.error.request_uri", ((HttpServletRequest)this.request).getRequestURI());
        this.request.setAttribute("javax.servlet.error.servlet_name", this.config.getServletName());

        try {
            this.forward(this.errorPageURL);
        } catch (IllegalStateException var3) {
            this.include(this.errorPageURL);
        }

        Object newException = this.request.getAttribute("javax.servlet.error.exception");
        if (newException != null && newException == t) {
            this.request.removeAttribute("javax.servlet.error.exception");
        }

        this.request.removeAttribute("javax.servlet.error.status_code");
        this.request.removeAttribute("javax.servlet.error.request_uri");
        this.request.removeAttribute("javax.servlet.error.servlet_name");
        this.request.removeAttribute("javax.servlet.jsp.jspException");
    } else if (t instanceof IOException) {
        throw (IOException)t;
    } else if (t instanceof ServletException) {
        throw (ServletException)t;
    } else if (t instanceof RuntimeException) {
        throw (RuntimeException)t;
    } else {
        Throwable rootCause = null;
        if (t instanceof JspException || t instanceof ELException || t instanceof javax.servlet.jsp.el.ELException) {
            rootCause = t.getCause();
        }

        if (rootCause != null) {
            throw new ServletException(t.getClass().getName() + ": " + t.getMessage(), rootCause);
        } else {
            throw new ServletException(t);
        }
    }
}

从上面源代码就可以看到,有一个this.forward()方法,这个方法就是转发的作用。到此,page指令的常用属性都介绍完啦。

今天就到这里,未完待续~~

相关推荐

【Socket】解决UDP丢包问题

一、介绍UDP是一种不可靠的、无连接的、基于数据报的传输层协议。相比于TCP就比较简单,像写信一样,直接打包丢过去,就不用管了,而不用TCP这样的反复确认。所以UDP的优势就是速度快,开销小。但是随之...

深入学习IO多路复用select/poll/epoll实现原理

Linux服务器处理网络请求有三种机制,select、poll、epoll,本文打算深入学习下其实现原理。0.结论...

25-1-Python网络编程-基础概念

1-网络编程基础概念1-1-基本概念1-2-OSI七层网络模型OSI(开放系统互联)七层网络模型是国际标准化组织(ISO)提出的网络通信分层架构,用于描述计算机网络中数据传输的过程。...

Java NIO多路复用机制

NIO多路复用机制JavaNIO(Non-blockingI/O或NewI/O)是Java提供的用于执行非阻塞I/O操作的API,它极大地增强了Java在处理网络通信和文件系统访问方面的能力。N...

Python 网络编程完全指南:从零开始掌握 Socket 和网络工具

Python网络编程完全指南:从零开始掌握Socket和网络工具在现代应用开发中,网络编程是不可或缺的技能。Python提供了一系列高效的工具和库来处理网络通信、数据传输和协议操作。本指南将从...

Rust中的UDP编程:高效网络通信的实践指南

在实时性要求高、允许少量数据丢失的场景中,UDP(用户数据报协议)凭借其无连接、低延迟的特性成为理想选择。Rust语言凭借内存安全和高性能的特点,为UDP网络编程提供了强大的工具支持。本文将深入探讨如...

Python 网络编程的基础复习:理解Socket的作用

计算机网络的组成部分在逻辑上可以划分为这样的结构五层网络体系应用层:应用层是网络协议的最高层,解决的是具体应用问题...

25-2-Python网络编程-TCP 编程示例

2-TCP编程示例应用程序通常通过“套接字”(socket)向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。Python语言提供了两种访问网络服务的功能。...

linux下C++ socket网络编程——即时通信系统(含源码)

一:项目内容本项目使用C++实现一个具备服务器端和客户端即时通信且具有私聊功能的聊天室。目的是学习C++网络开发的基本概念,同时也可以熟悉下Linux下的C++程序编译和简单MakeFile编写二:需...

Python快速入门教程7:循环语句

一、循环语句简介循环语句用于重复执行一段代码块,直到满足特定条件为止。Python支持两种主要的循环结构:for循环和while循环。...

10分钟学会Socket通讯,学不会你打我

Socket通讯是软硬件直接常用的一种通讯方式,分为TCP和UDP通讯。在我的职业生涯中,有且仅用过一次UDP通讯。而TCP通讯系统却经常写,正好今天写了一个TCP通讯的软件。总结一下内容软件使用C#...

Python 高级编程之网络编程 Socket(六)

一、概述Python网络编程是指使用Python语言编写的网络应用程序。这种编程涉及到网络通信、套接字编程、协议解析等多种方面的知识。...

linux网络编程Socket之RST详解

产生RST的三个条件:1.目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;2.TCP想取消一个已有的连接;3.TCP接收到一个根本不存在的连接上的分节;现在模拟上面的三种情况:cl...

ABB机器人编程实用技巧,多项案例

...

Python中实现Socket通讯(附详细代码)

套接字(socket)是一种在计算机网络中进行进程间通信的方法,它允许不同主机上的程序通过网络相互通信。套接字是网络编程的基础,几乎所有的网络应用程序都使用某种形式的套接字来实现网络功能。套接字可以用...

取消回复欢迎 发表评论: