【学习笔记】jsp

一、jsp

1.1 概念

jsp 全称 java server pages 。java的服务器页面

1.2 作用

主要代替Servlet 回传 html 页面数据。
因为 Servlet 回传 html 页面非常繁琐,开发和维护成本高。

Servlet回传页面数据

public class Servlet1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        resp.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("<!DOCTYPE html>\r\n");
        writer.write(" <html lang=\"en\">\r\n");
        writer.write(" <head>\r\n");
        writer.write(" <meta charset=\"UTF-8\">\r\n");
        writer.write(" <title>Title</title>\r\n");
        writer.write(" </head>\r\n");
        writer.write(" <body>\r\n");
        writer.write(" 这是 html 页面数据 \r\n");
        writer.write(" </body>\r\n");
        writer.write("</html>\r\n");
        writer.write("\r\n");
    }
}

jsp回传页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    回传数据
</body>
</html>

访问 jsp 页面和访问 html 页面一样,jsp 页面也放在Web目录下。

1.3 jsp 本质

jsp 页面的本质是 Servlet 程序

当我们第一次访问 jsp 页面的时候。 Tomcat 服务器会帮我们把 jsp 页面翻译成为一个 java 源文件。 并且对它进行编译成为.class 字节码程序。
在这里插入图片描述

加上路径: \work\Catalina\localhost\servletStudy\org\apache\jsp

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我们跟踪原代码发现, HttpJspBase 类。 它直接地继承了 HttpServlet 类。 也就是说。 jsp 翻译出来的 java 类, 它间接了继承了 HttpServlet 类。 也就是说, 翻译出来的是一个 Servlet 程序。

其底层实现, 也是通过输出流。 把 html 页面数据回传给客户端。

二、jsp 的三种语法

2.1 头部的 page 指令

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

在这里插入图片描述
import 属性
在这里插入图片描述

缓冲区自动刷新设为 false,若内容超过设置的 buffer 缓冲值时,就会报错。
在这里插入图片描述
在这里插入图片描述

errorPage 表示错误后自动跳转去的路径这个路径一般都是以斜杠打头, 它表示请求地址为 http://ip:port/工程路径/映射到代码的 Web 目录

在这里插入图片描述

2.2 常用脚本

2.2.1 声明脚本

声明脚本的格式

<%! 声明 java 代码 %>

作用: 可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块、内部类等。

jsp 声明

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

翻译servlet程序
在这里插入图片描述

2.2.2 表达式脚本

格式

<%=表达式%>

作用: jsp 页面上输出数据。

特点:

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

jsp代码

    <%--
      整型 
      浮点型
      字符串
      获取对象
    --%>
    <%=12%>
    <%=12.12%>
    <%="我是字符串"%>
    <%=request.getParameter("username")%>

翻译为Servlet程序
在这里插入图片描述

2.2.3 代码脚本

格式

<% java语句 %>

作用

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

特点

  1. 代码脚本翻译之后都在_jspService 方法中
  2. 代码脚本由于翻译到_jspService()方法中, 所以在_jspService()方法中的现有对象都可以直接使用。
  3. 还可以由多个代码脚本块组合完成一个完整的 java 语句。
  4. 代码脚本还可以和表达式脚本一起组合使用, 在 jsp 页面上输出数据

jsp代码

  <%
      int i=3;
      if(i==3){
    
    
          for(int t=0;t<2;t++){
    
    
    %>
            <%="这是"+t+"个"%><br/>
    <%
          }
    %>
    <h1>标题</h1>
    <%
      }
    %>

运行结果

在这里插入图片描述

2.3 三种注释

2.3.1 html 注释

<!-- 这是 html 注释 -->

html 注释会被翻译到 java 源代码中。 在_jspService 方法里, 以 out.writer 输出到客户端。

2.3.2 java注释

<%
// 单行 java 注释
/* 多行 java 注释 */
%>

java 注释会被翻译到 java 源代码中。

2.3.3 jsp 注释

<%-- 这是 jsp 注释 --%>

jsp 注释可以注掉, jsp 页面中所有代码。

三、jsp 中九大内置对象

jsp 中的内置对象, 是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后, 内部提供的九大对象, 叫内置对象。可以在jsp 代码中直接使用

在这里插入图片描述

四、四大域对象

在这里插入图片描述
域对象是可以像 Map 一样存取数据的对象。 四个域对象功能一样。 不同的是它们对数据的存取范围。

虽然四个域对象都可以存取数据。 在使用上它们是有优先顺序的。
四个域在使用的时候, 优先顺序分别是, 他们从小到大的范围的顺序。
pageContext ====>>> request ====>>> session ====>>> application

    <%
        pageContext.setAttribute("key","value");
    %>
    <%=pageContext.getAttribute("key")%>

五、jsp的 out 输出 和 response.getWriter() 输出区别

response 中表示响应, 我们经常用于设置返回给客户端的内容(输出)

out 也是给用户做输出使用的
在这里插入图片描述

由于 jsp 翻译之后, 底层源代码都是使用 out 来进行输出, 所以一般情况下。 我们在 jsp 页面中统一使用 out 来进行输出。 避免打乱页面输出内容的顺序。

  • out.write() 输出字符串没有问题
  • out.print() 输出任意数据都没有问题(都转换成为字符串后调用的 write 输出)
    所以 可以全部使用 out.print 输出。

六、常用标签

6.1 静态包含

在一个jsp页面中,引入另一个 jsp 页面(该页面可负责一个模块),方便模块化管理。


代码演示
主页面

    <body>
         主页面显示内容<br/>
        <%@include file="a.jsp"%>
  </body>

被引入页面

<body>
    被引入的页面(加广告)
</body>

显示效果
在这里插入图片描述


<%@ include file=""%> 就是静态包含

file 属性指定你要包含的 jsp 页面的路径
地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的 web 目录

在这里插入图片描述
静态包含的特点:
1、 静态包含不会翻译被包含的 jsp 页面。(也就是a.jsp不被翻译成java程序)
2、 静态包含其实是把被包含的 jsp 页面的代码拷贝到包含的位置执行输出。(如图)

6.2 动态包含

代码

    <body>
         主页面显示内容<br/>
        <jsp:include page="a.jsp"></jsp:include>
	</body>

特点

  1. 动态包含会把包含的 jsp 页面也翻译成为 java 代码
  2. 动态包含底层代码使用如下代码去调用被包含的 jsp 页面执行输出。
    JspRuntimeLibrary.include(request, response, “/include/footer.jsp”, out, false);
  3. 动态包含,可以传递参数

底层实现
在这里插入图片描述
在这里插入图片描述

传参数

    <body>
         主页面显示内容<br/>
        <jsp:include page="a.jsp">
            <jsp:param name="username" value="root"></jsp:param> <%--该参数可以被 被包含的jsp页面 获取--%>
            <jsp:param name="password" value="123"></jsp:param> 
        </jsp:include>
    </body>

6.3 jsp 标签-转发

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

七、Listener 监听器

1、 Listener 监听器它是 JavaWeb 的三大组件之一。 JavaWeb 的三大组件分别是: Servlet 程序、 Filter 过滤器、 Listener 监听器。

2、 Listener 它是 JavaEE 的规范, 就是接口

3、 监听器的作用是, 监听某种事物的变化。 然后通过回调函数, 反馈给客户(程序) 去做一些相应的处理。

7.1 ServletContextListener 监听器

ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。

ServletContext 对象在 web 工程启动的时候创建, 在 web 工程停止的时候销毁。

监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。

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

使用步骤

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

实现接口


public class MyListener implements ServletContextListener {
    
    
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
    
    
        System.out.println("servletContext 对象被创建了(web工程开始)");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    
    
        System.out.println("servletContext 对象被销毁了(web工程结束)");
    }
}

配置监听器

    <listener>
        <listener-class>com.study.service.MyListener</listener-class>
    </listener>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/DREAM_yao/article/details/114129309