一文学懂JSP(下)

简介: 一文学懂JSP

第4章 JSP基本语法

JSP头部的page指令:


JSP头部的page指令可以修改JSP页面中的一些重要属性或行为

(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值):

(1) contentType属性:表示JSP返回的数据类型是什么,即response.setContentType()的参数值

(2) language属性:表示JSP翻译之后是什么语言文件(目前只支持Java)

(3) pageEncoding属性:表示当前JSP文件本身的字符集(可在IDEA右下角看到)

(4) import属性:表示导包(导类),与Java一致

(5) autoFlush属性:设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true

(6) buffer属性:设置out缓冲区的大小,默认是8kb

注意:out缓冲区满了之后不能自动刷新的话会报错

(7) errorPage属性:设置当JSP页面运行出错时自动跳转到的页面(错误信息页面)的路径,这个 路径一般都是以斜杠打头,表示请求的地址是http://ip:port/工程路径/,对应代码web目录

(8) isErrorPage属性:设置当前JSP页面是否是错误信息页面,默认是false,如果是true可以 获取错误信息

(9) session属性:设置访问当前JSP页面时是否会创建HttpSession对象,默认值是true

(10) extends属性:设置JSP页面翻译出来的Java类默认继承谁


注意:以上默认值除非有特殊需要,否则不建议修改

4.1指令

  • 语法格式:<%@ %>
  • 实例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"

三大指令:

<%@ page %> ,<%@ include %> ,| <%@ taglib %>

4.2模板元素

  • html&css& js &jQuery 等…

4.3代码脚本片段(重点)

  • 格式 :<%%>
  • 作用:在_jspService()方法中,书写java代码。
  • 实例
<% int i = 0;%>

4.4表达式(重点)

  • 格式:<%=表达式 %>
  • 作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)
  • 特点:
  • (1) 所有的表达式脚本都会被翻译到对应的Java类的 _ jspService()方法中,故表达式脚本可以 直接使用 _jspService() 方法参数中的对象

(2) 表达式脚本都会被编译后的Java类中的 out.print() 方法输出到浏览器页面上

(3) 表达式脚本中的表达式不能以分号结束

代码演示:表达式脚本的使用(此JSP文件在web目录下,名为First.jsp)


<%=22 %> <br/>
<%="可以输出字符串" %> <br/>
<%=map %> <br/>
<%--使用_jspService方法中的对象--%>
<%=request.getParameter("username") %>

4.5声明(了解)

  • 格式:<%! 声明Java代码 %>
  • 作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等
  • 特点:不会在浏览器的页面上显示出来,仅存在于翻
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--1.声明类属性--%>
    <%!
        private String name;
        private static Map<String, Object> map;
    %>
    <%--2.声明类方法--%>
    <%!
        public int sum() {
            return 12;
        }
    %>
    <%--3.声明静态代码块--%>
    <%!
        static {
            map = new HashMap<String, Object>();
            map.put("key1", "value1");
        }
    %>
</body>
</html>

4.6注释:Jsp支持三种注释

  • java:单行注释://,多行注释:/**/
  • html:
  • jsp:<%-- --%>
  • jsp中三种注释的比较,如下所示:
JSP注释 Java注释 HTML注释
JSP页面 可见 可见 可见
Java代码 不可见 可见 可见
浏览器 不可见 不可见 可见

第5章 JSP常用指令

5.1 语法格式

<%@ 指令名 属性=属性值 属性2=属性值2 … %>

5.2 Jsp常用指令

5.2.1 page指令

  • 语法
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

属性


language:语言,值为 java 且仅 java。

contentType:与response.setContentType()作用一致,设置浏览器字符集。

pageEncoding:设置Jsp页面的编码字符集。

import:导包

isErrorPage:设置当前页面是否为错误页面,默认值"false"。

true:设置当前页面为错误页面,可以使用exception内置对象,捕获异常 。

false:设置当前页面不是错误页面,不可以使用exception内置对象,捕获异常 。

errorPage:设置当前页面错误时的跳转目标页面。错误需要在_jspService()中才可以捕获。


5.2.2 include指令:静态包含

  • 语法
<%@include file="被包含文件的路径" %>


  • 作用:将目标文件包含到当前文件中。
  • 特点:被包含的文件不会被翻译&编译。(先包含,再翻译)

5.2.3 静态包含和动态包含

静态包含

(1)使用场景:

(2)使用方法:

<%@include file=“”%>

其中file属性设置要包含的JSP页面,以/打头,代表http://ip:port/工程路径/,对应web目录

代码演示1:在web目录下创建body.jsp


<body>
    头部信息 <br>
    主体信息 <br>
    <%@include file="/foot.jsp"%>
</body>

代码演示2:在web目录下创建foot.jsp

<body>
    页脚信息 <br>
</body>

(3)静态包含的特点:


① 静态包含不会将被包含的JSP页面翻译成.java.class文件

② 静态包含是把被包含的页面的代码拷贝到body.jsp对应的Java文件的对应位置执行输出


动态包含

(1)使用方法:


<jsp:include page=””></jsp:include>

其中page属性设置要包含的JSP页面,与静态包含一致


(2)动态包含的特点:

①动态包含将被包含的JSP页面翻译成.java.class文件

②动态包含还可以传递参数

③动态包含底层使用如下代码调用被包含的JSP页面执行输出:

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, “/foot.jsp”, out, false);


代码演示1:在web目录下创建body.jsp


<body>
    头部信息 <br>
    主体信息 <br>
    <jsp:include page="/foot.jsp">
        <jsp:param name="username" value="Jaychou"/>
        <jsp:param name="password" value="root"/>
    </jsp:include>
</body>

注意:


设置参数的标签要写在动态包含之中

出现Expecting “jsp:param” standard action with “name” and “value” attributes异常,两个原因:

①动态包含中未设置参数但没有把<jsp:include page=””></jsp:include>放在一行上

②动态包含中加了注释


代码演示2:在web目录下创建 foot.jsp

<body>
    页脚信息 <br>
    <%=request.getParameter("username")%>
</body>

运行结果:

(3)动态包含的底层原理:

5.2.4 taglib指令(略)

  • 语法
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

属性


prefix用来指定前缀名,我们通过该名来使用JSTL。

uri相当于库的唯一标识,因为JSTL由多个不同的库组成,使用该属性指定要导入哪个库。

作用:引入标签库。

第六章 Jsp常用动作标签

6.1 概述

  • JSP动作标签与HTML标签不同,HTML标签由浏览器来解析,而JSP动作标签需要服务器(Tomcat)来运行。

6.2.1 转发动作标签

  • 语法:<jsp:forward></jsp:forward>
  • 作用:在页面中用于转发操作
  • 实例
<jsp:forward page="target.jsp"></jsp:forward>

6.2 常用的JSP动作标签

转发子标签

  • 语法:<jsp:param value=“paramValue” name=“paramName”/>
  • 作用:在转发时设置请求参数,通过request.getParameter()在目标页面获取请求参数。
  • 实例
<jsp:forward page="target.jsp">
  <jsp:param value="paramValue" name="paramName"/>
</jsp:forward>
  • 注意:如果转发动作标签不需要设置请求参数,该标签开始与结束标签内部,不允许书写任何内容,(包括空格)

6.2.2 动态包含动作标签

  • 语法:<jsp:include page=“target.jsp”>
  • 作用:动态包含,将其他页面包含到当前页面中。
  • 实例
<jsp:include page="target.jsp"></jsp:include>


特点:被包含的文件同时会被翻译&编译。(先翻译,再包含)


本质原理:当使用动态包含时,Tomcat会在生成的Servlet中加入如下代码:


org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "target.jsp", out, false);

6.3 动态包含与静态包含的区别

@include指令 jsp:include标签
特点 静态包含 动态包含
语法的基本形式 <%@ include file=”…”%> <jsp:include page=”…”/>
包含动作发生的时机 翻译期间 请求期间
是否生成java文件 不生成 生成
合并方式 代码复制 合并运行结果
包含的内容 文件实际内容 页面输出结果
代码冲突 有可能 不可能
编译次数 1 包含的文件 + 1
适用范围 适用包含纯静态内容(CSS,HTML,JS),或没有非常耗时操作。或少量java代码的jsp 包含需要传递参数。含有大量java代码,运算,耗时很长的操作。

第6章 JSP常用动作标签

6.1 概述

  • JSP动作标签与HTML标签不同,HTML标签由浏览器来解析,而JSP动作标签需要服务器(Tomcat)来运行。

6.2 常用的JSP动作标签

6.2.1 转发动作标签


  • 语法:<jsp:forward></jsp:forward>
  • 作用:在页面中用于转发操作
  • 实例
<jsp:forward page="target.jsp"></jsp:forward>


转发子标签

  • 语法:<jsp:param value=“paramValue” name=“paramName”/>
  • 作用:在转发时设置请求参数,通过request.getParameter()在目标页面获取请求参数。
  • 实例
<jsp:forward page="target.jsp">
  <jsp:param value="paramValue" name="paramName"/>
</jsp:forward>
  • 注意:如果转发动作标签不需要设置请求参数,该标签开始与结束标签内部,不允许书写任何内容,(包括空格)

6.2.2 动态包含动作标签

  • 语法:<jsp:include page=“target.jsp”>
  • 作用:动态包含,将其他页面包含到当前页面中。

实例

<jsp:include page="target.jsp"></jsp:include>

特点:被包含的文件同时会被翻译&编译。(先翻译,再包含)


本质原理:当使用动态包含时,Tomcat会在生成的Servlet中加入如下代码

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "target.jsp", out, false);


6.3 动态包含与静态包含的区别

@include指令 jsp:include标签
特点 静态包含 动态包含
语法的基本形式 <%@ include file=”…”%> <jsp:include page=”…”/>


包含动作发生的时机 翻译期间 请求期间
是否生成java文件 不生成 生成
合并方式 代码复制 合并运行结果


包含的内容 文件实际内容 页面输出结果
代码冲突 有可能 不可能
编译次数 1 包含的文件 + 1
适用范围 适用包含纯静态内容(CSS,HTML,JS),或没有非常耗时操作。或少量java代码的jsp 包含需要传递参数。含有大量java代码,运算,耗时很长的操作。


第7章 JSP九大隐式对象

7.1 概述

Jsp共有九大隐式对象,也叫隐含对象或内置对象。JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。

7.2 对象详情

7.2.1 pageContext

  • 类型:PageContext
  • 定义:代表页面域对象,用来代表整个JSP页面。
  • 作用:
  1. 页面域对象,具体详见:下方四大域对象。
  2. 九大隐式对象的“大哥”,可以直接调用其他八大隐式对象。
  • 在Servlet中获取方式:无。

7.2.2 request

  • 类型:HttpServletRequest
  • 定义:代表浏览器向服务器发送的请求报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
  • 作用(详见Servlet中request对象)
  1. 获取请求参数
  2. 获取url地址参数
  3. 请求转发
  4. 向请求域中保存数据(获取数据&移除数据)
  5. 获取请求头信息
  • 在Servlet中获取方式:doGet()或doPost()中直接使用

7.2.3 session

  • 类型:HttpSession
  • 定义:代表浏览器与服务器之间的会话。
  • 作用
  • 会话域对象,具体详见:下方四大域对象。

session对象用来跟踪在各个客户端请求间的会话。

  • 在Servlet中获取方式 :request.getSession();

7.2.4 application

  • 类型:ServletContext
  • 定义:Servlet上下文,代表当前web应用。

Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。

  • 作用


获取项目的上下文路径(带/的项目名):getContextPath()


获取虚拟路径所映射的本地真实路径:getRealPath(String path)


获取WEB应用程序的全局初始化参数(基本不用)


设置Web应用初始化参数的方式是在web.xml的根标签下加入如下代码


<web-app>
  <!-- Web应用初始化参数 -->
  <context-param>
    <param-name>ParamName</param-name>
    <param-value>ParamValue</param-value>
  </context-param>
</web-app>

获取Web应用初始化参数

@Override
public void init(ServletConfig config) throws ServletException {
  //1.获取ServletContext对象
  ServletContext application = config.getServletContext();
  //2.获取Web应用初始化参数
  String paramValue = application.getInitParameter("ParamName");
  System.out.println("全局初始化参数paramValue="+paramValue);
}
  1. 作为域对象共享数据:具体详见:下方四大域对象。
  • 在Servlet中获取方式:使用this.getServletContext()方法获取。

7.2.5 page

  • 类型:Object
  • 作用:this,当前类对象。

7.2.6 response

类型:HttpServletResponse

定义:代表服务器向浏览器发送的响应报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。

作用:

向页面(响应体)中响应数据,数据包括文本、Html等。

重定向

设置响应头信息

在Servlet中获取方式:doGet()或doPost()中直接使用

7.2.7 config

类型:ServletConfig

定义:代表当前Servlet的配置信息,每一个Servlet都有一个唯一对应的ServletConfig对象。

作用:

获取Servlet名称:getServletName()

获取全局上下文ServletContext对象:getServletContext()

获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。

在Servlet中获取方式:this.getServletConfig()

7.2.8 out

类型:JspWriter

定义:代表当前页面的输出流。

作用:与Servlet中的PrintWriter功能类似,将数据响应到页面,响应的数据可以是页面、页面片段、字符串等。

在Servlet中获取方式:无

7.2.9 exception

类型:Throwable

定义:代表当前页面的异常对象。

作用:代表当前页面的异常对象。

在Servlet中获取方式:new Throwable()

九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对象。


request:请求对象

response:响应对象

pageContext:JSP的上下文对象

session:会话对象

application:ServletContext对象

config:ServletConfig对象

out:JSP输出流对象

page:指向当前JSP的对象

exception:异常对象


第8章 JSP四大域对象

8.1 域对象概述

生活中使用“域对象”比较经典的行业,是快递行业。现如今快递行业大体分为,全球快递,全国快递,同城快递和同区快递。需求不同,使用不同“域对象”。


如:外卖一般使用同区快递,给北京朝阳区的朋友邮寄贺卡,一般使用同城快递。在某宝某东上购买外地商品,一般使用全国快递或全球快递。


8.2 程序中的域对象

8.2.1 域对象概述

程序中的域对象,主要负责在不同web资源之间进行数据交换,(如:servlet和jsp之间的数据交换)。由于不同的web资源之间需要共享数据,所以就有了域对象。


在Jsp中一共有四个域对象,分别是pageContext 、request、session、application。主要作用是能够在一定范围内共享数据。


8.2.2 域对象分析

每个域对象内部都维护了一个Map<String , Object>,域对象的共同方法。


设置属性到域中:void setAttribute(String key , Object value);

从域中获取指定的属性:Object getAttribute(String key);

移除域中指定属性:void removeAttribute(String key);

8.2.3 域对象有效性

pageContext: 当前页面中共享数据有效,离开当前页面失效。

每个页面都有自己唯一的一个pageContext对象。

注意servlet中没有该对象。

request: 当前请求中共享数据有效。

当前请求:转发、直接访问一个页面为当前请求。

不在当前请求:重定向、 打开页面再点击页面中的超链接不在当前请求 。

session: 一次会话范围中共享数据有效。

当前会话:当前浏览器不关闭&不更换浏览器即为当前会话。

只关心浏览器是否关闭,不关心服务器关闭重启。

不同浏览器不共享会话。

application: 在服务器运行的一次过程中共享数据有效。

服务器关闭销毁

小结:

域对象 作用范围 起始时间 结束时间
pageContext 当前JSP页面 页面加载 离开页面
request 同一个请求 收到请求 响应
session 同一个会话 开始会话 结束会话
application 当前Web应用 Web应用加载 Web应用卸载

8.2.4 四个作用域的测试代码:

  • 新建两个jsp页面。分别取名叫:context1.jsp,context2.jsp
  • context1.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>
  这是context1页面<br/>
  <%
    //设置page域的数据
    pageContext.setAttribute("key", "pageContext-value");
    //设置request域的数据
    request.setAttribute("key", "request-value");
    //设置session域的数据
    session.setAttribute("key", "session-value");
    //设置application域的数据
    application.setAttribute("key", "application-value");
  %>
  <%-- 测试当前页面作用域 --%>
  <%=pageContext.getAttribute("key") %><br/>
  <%=request.getAttribute("key") %><br/>
  <%=session.getAttribute("key") %><br/>
  <%=application.getAttribute("key") %><br/>
  <%  
    // 测试request作用域
//    request.getRequestDispatcher("/context2.jsp").forward(request, response);
  %>
</body>
</html>

context2.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>
  这是context2页面 <br/>
  <%=pageContext.getAttribute("key") %><br/>
  <%=request.getAttribute("key") %><br/>
  <%=session.getAttribute("key") %><br/>
  <%=application.getAttribute("key") %><br/>
</body>
</html>

测试操作:

测试pageContext作用域步骤:
直接访问context1.jsp文件
测试request作用域步骤:
1.在context1.jsp文件中添加转发到context2.jsp(有数据)
2.直接访问context2.jsp文件 (没有数据)
测试session作用域步骤:
1.访问完context1.jsp文件
2.关闭浏览器。但是要保持服务器一直开着
3.打开浏览器,直接访问context2.jsp文件
测试application作用域步骤:
1.访问完context1.jsp文件,然后关闭浏览器
2.停止服务器。再启动服务器。
3.打开浏览器访问context2.jsp文件


目录
相关文章
|
存储 前端开发 Java
|
Java
2022年欢迎来到Jsp编程第二课:JSP核心九大内置对象
2022年欢迎来到Jsp编程第二课:JSP核心九大内置对象
91 0
|
Java 应用服务中间件
JavaWeb 速通JSP
JavaWeb——服务器渲染技术 JSP 内容分享。
40 0
|
SQL XML 前端开发
JavaWeb开发 JSP技术详解(一)
JavaWeb开发 JSP技术详解(一)
|
Java 应用服务中间件 Apache
JSP详细基础教学
前言 JSP(JavaServer Pages)是一种用于开发动态网页的Java技术。它允许将Java代码嵌入HTML页面中,以便在服务器端生成动态内容。在本次教程中,我将向您介绍如何开始使用JSP。 环境设置 首先,确保您已经安装了Java开发工具包(JDK)和一个支持JSP的Web服务器,如Apache Tomcat。确保将JDK的路径添加到系统环境变量中。 创建JSP文件 创建一个新的文本文件,并将其保存为以".jsp"为扩展名的文件,例如"index.jsp"。 编写基本的JSP代码 打开您创建的JSP文件,并使用以下代码作为模板来编写基本的JSP代码:
84 0
|
SQL 存储 搜索推荐
基于jsp的塞北村镇旅游网站的设计与实现--【毕业论文】
基于jsp的塞北村镇旅游网站的设计与实现--【毕业论文】
|
小程序 Java 应用服务中间件
一文学懂JSP(上)
一文学懂JSP
93 0
|
存储 前端开发 Java
【JavaWeb】快速通关JSP(三)
【JavaWeb】快速通关JSP(三)
|
前端开发 Java 应用服务中间件
【JavaWeb】快速通关JSP(二)
【JavaWeb】快速通关JSP(二)
|
前端开发 JavaScript Java
【JavaWeb】快速通关JSP(一)
【JavaWeb】快速通关JSP(一)