JavaWeb(六)jsp

基本概念

什么是jsp,它有什么作用

  1. jsp的全称是Java server pages。Java的服务器页面
  2. jsp的主要作用是代替Servlet程序回传html页面的数据
  3. 因为Servlet程序回传html页面是一件非常繁琐的事情。开发成本和维护成本都极高

如何创建jsp的页面

选中web_app,new-jsp文件

如何访问

jsp 页面和html 页面一样,都是存放在web 目录下。访问也跟访问html 页面一样。
比如:
在web 目录下有如下的文件:
web 目录
a.html 页面访问地址是:>>>>>> http://ip:port/工程路径/a.html
b.jsp 页面访问地址是:>>>>>> http://ip:port/工程路径/b.jsp

jsp的本质

  1. jsp页面本质上是一个Servlet程序
  2. 当我们第一次访问jsp页面的时候。Tomcat服务器会帮我们把jspp页面翻译成为一个Java源文件。并且对它进行编译成.class字节码程序。
  3. 我们跟踪原代码发现,HttpJspBase 类。它直接地继承了HttpServlet 类。也就是说。jsp 翻译出来的java 类,它间接了继承了HttpServlet 类。也就是说,翻译出来的是一个Servlet 程序

jsp的三种语法

jsp头部的page指令

jsp 的page 指令可以修改jsp 页面中一些重要的属性,或者行为。

<%--
  Created by IntelliJ IDEA.
  User: ningqian
  Date: 2021/5/10
  Time: 16:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<%@ page errorPage="/error500.jsp"
         language="java" %>
<%--errorPage表示错误后自动跳转的路径,这个路径一般以斜杠打头,它表示请求地址为:http://ip:port/工程路径/  <br/>
映射到代码的web目录--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    这是html数据
</body>
</html>

i. language 属性表示jsp 翻译后是什么语言文件。暂时只支持java。
ii. contentType 属性表示jsp 返回的数据类型是什么。也是源码中response.setContentType()参数值
iii. pageEncoding 属性表示当前jsp 页面文件本身的字符集。
iv. import 属性跟java 源代码中一样。用于导包,导类。
两个属性是给out 输出流使用=====
v. autoFlush 属性设置当out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true。
vi. buffer 属性设置out 缓冲区的大小。默认是8kb
vii. errorPage 属性设置当jsp 页面运行时出错,自动跳转去的错误页面路径。
viii. isErrorPage 属性设置当前jsp 页面是否是错误信息页面。默认是false。如果是true 可以
获取异常信息。
ix. session 属性设置访问当前jsp 页面,是否会创建HttpSession 对象。默认是true。
x. extends 属性设置jsp 翻译出来的java 类默认继承谁。

jsp的常用脚本

声明脚本(极少使用)

格式

<%! 声明的内容 %>

作用
  1. 声明类属性
  2. 声明静态代码块
  3. 声明类的方法
  4. 声明内部类
示例
<%--1.声明类属性--%>
<%!
    private Integer id;
    private String name;
    private static Map<String,Object> map;
%>
<%--2.静态代码块--%>
<%!
    static{
        map = new HashMap<String,Object>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");
    }
%>
<%--3. 声明类的方法--%>
<%!
    public int sum(){
        return 1+1;
    }
%>
<%--4. 声明内部类--%>
<%!
    public static class A{
        private int num;
        private String nickname;
    }
%>

表达式脚本(经常使用)

格式

<%=表达式%>

作用

在jsp页面上输出数据

示例
<%--1. 输出整形--%>
<%=12%> <br/>
<%--2. 输出浮点型--%>
<%=13.14%><br/>
<%--3. 输出字符串--%>
<%="字符串"%><br/>
<%--4. 输出对象--%>
<%=map%><br/>
特点

1、所有的表达式脚本都会被翻译到_jspService() 方法中
2、表达式脚本都会被翻译成为out.print()输出到页面上
3、由于表达式脚本翻译的内容都在_jspService() 方法中,所以_jspService()方法中的对象都可以直接使用。
4、表达式脚本中的表达式不能以分号结束。

代码脚本

格式

<%
java语句
%>

作用

可以在jsp页面中,编写我们自己需要的功能(Java语句)

特点
  1. 可以由多个代码脚本块组合完成一个完整的java 语句。
  2. 代码脚本还可以和表达式脚本一起组合使用,在jsp 页面上输出数据
示例
<%
    for(int i=0;i<3;i++){

   %>
        <%="你还好吗"%><br/>
<%
        System.out.println("宁好难受");
    }
%>

jsp的九大内置对象

** jsp中的内置对象,是指Tomcat在翻译jsp页面成为Servlet源代码后,内部提供的九大对象,叫内置对象**

  1. request 请求对象
  2. response 响应对象
  3. pageContext jsp的上下文对象
  4. session 会话对象
  5. application ServletContext对象
  6. config ServletConfig对象
  7. out jsp输出流对象
  8. page 指向当前jsp的对象
  9. exception 异常对象

jsp的四大域对象

域对象是可以像Map一样存取数据的对象,四个域对象功能一样,不同的是他们对数据的存取范围不同
pageContext、request、application、session

pageContext

  1. 所属类:PageContextImpl类
  2. 存取范围:当前jsp页面

request

  1. 所属类:HttpServletRequest
  2. 存取范围:一次请求有效

session

  1. 所属类:HttpSession类
  2. 存取范围:一次会话有效(打开浏览器访问服务器,直到关闭浏览器)

application

  1. 所属类:ServletContext类
  2. 存取范围:整个web工程(只要web工程不停止,数据都在)

示例

  1. 创建一个jsp页面,命名为scope.jsp
<%--
  Created by IntelliJ IDEA.
  User: ningqian
  Date: 2021/5/10
  Time: 21:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp的九大内置对象</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
    /*往四个域中分别保存了数据*/
    /*如果pageContext对象没有setAttribute方法,需要到tomcat的安装目录下的lib文件夹下找到jsp-api.jar导入到项目中*/
    pageContext.setAttribute("key","pageContext");
    request.setAttribute("key","request");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
%>
pageContext域是否有值:<%=pageContext.getAttribute("key")%><br/>
request域是否有值:<%=request.getAttribute("key")%><br/>
session域是否有值:<%=session.getAttribute("key")%><br/>
application域是否有值:<%=application.getAttribute("key")%><br/>
<%
    request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
</body>
</html>

  1. 创建第二个jsp页面,命名为scope2.jsp
<%--
  Created by IntelliJ IDEA.
  User: ningqian
  Date: 2021/5/10
  Time: 21:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp的九大内置对象</title>
</head>
<body>
<h1>scope2.jsp页面</h1>
pageContext域是否有值:<%=pageContext.getAttribute("key")%><br/>
request域是否有值:<%=request.getAttribute("key")%><br/>
session域是否有值:<%=session.getAttribute("key")%><br/>
application域是否有值:<%=application.getAttribute("key")%><br/>

</body>
</html>

  1. 测试
    (1) 启动服务器,打开浏览器,输入http://localhost:8080/jsp/scope.jsp,查看四个域对象存的属性值
    (2)在地址栏输入http://localhost:8080/jsp/scope2.jsp,查看四个域对象存的属性值
    (3)关闭浏览器,重新输入http://localhost:8080/jsp/scope2.jsp
    (4)重新配置服务器,刷新浏览器,查看四个域对象存的属性值

四大域对象的使用顺序

按照有效范围由小到大使用
pageContext->request->session->application

jsp中的out输出和response.getWriter输出的区别

在这里插入图片描述
由于jsp 翻译之后,底层源代码都是使用out 来进行输出,所以一般情况下。我们在jsp 页面中统一使用out 来进行输出。避
免打乱页面输出内容的顺序。
out.write() 输出字符串没有问题
out.print() 输出任意数据都没有问题(都转换成为字符串后调用的write 输出)

jsp常用的标签

静态包含

<%–
<%@ include file=""%> 就是静态包含
file 属性指定你要包含的jsp 页面的路径
地址中第一个斜杠/ 表示为http://ip:port/工程路径/ 映射到代码的web 目录
静态包含的特点:
1、静态包含不会翻译被包含的jsp 页面。
2、静态包含其实是把被包含的jsp 页面的代码拷贝到包含的位置执行输出。
–%>
<%@ include file="/include/footer.jsp"%>

动态包含

示例说明:
<%–
<jsp:include page=""></jsp:include> 这是动态包含
page 属性是指定你要包含的jsp 页面的路径
动态包含也可以像静态包含一样。把被包含的内容执行输出到包含位置
动态包含的特点:
1、动态包含会把包含的jsp 页面也翻译成为java 代码
2、动态包含底层代码使用如下代码去调用被包含的jsp 页面执行输出。
JspRuntimeLibrary.include(request, response, “/include/footer.jsp”, out, false);
3、动态包含,还可以传递参数

jsp标签转发

<%--
<jsp:forward page=""></jsp:forward> 是请求转发标签,它的功能就是请求转发
page 属性设置请求转发的路径
--%>
<jsp:forward page="/scope2.jsp"></jsp:forward>

Listener监听器

1、Listener 监听器它是JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监
听器。
2、Listener 它是JavaEE 的规范,就是接口
3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

ServletContextListener 监听器

ServletContextListener 它可以监听ServletContext 对象的创建和销毁。
ServletContext 对象在web 工程启动的时候创建,在web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用ServletContextListener 监听器的方法反馈。
两个方法分别是:

public interface ServletContextListener extends EventListener {
/**
* 在ServletContext 对象创建之后马上调用,做初始化
*/
public void contextInitialized(ServletContextEvent sce);
/**
* 在ServletContext 对象销毁之后调用
*/
public void contextDestroyed(ServletContextEvent sce);
}

使用ServletContextListener 监听器监听ServletContext 对象

1、编写一个类去实现ServletContextListener
2、实现其两个回调方法
3、到web.xml 中去配置监听器
监听器实现类:

public class MyServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 对象被销毁了");
}
}

web.xml 中的配置:

<!--配置监听器-->
<listener>
<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值