JSP

什么是jsp

jsp是服务器页面,主要是代替Servlet程序回传html页面的数据

jsp的本质

jsp本质上是一个Servlet程序

当我们第一次访问jsp页面的时候,Tomcat服务器会把jsp页面翻译成为一个java源文件,并且将它编译成一个.class字节码程序。
在这里插入图片描述
HttpJspBase 类。它直接地继承了 HttpServlet 类。也就是说。jsp 翻译出来的 java 类,它间接了继
承了 HttpServlet 类。也就是说,翻译出来的是一个 Servlet 程序,大部分代码由输出流完成

jsp的三种语法

jsp头部的page命令

	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
属性作用
language 属性表示 jsp 翻译后是什么语言文件。暂时只支持 java。
contentType 属性表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType()参数值
pageEncoding 属性表示当前 jsp 页面文件本身的字符集。
import 属性跟 java 源代码中一样。用于导包,导类。
autoFlush 属性设置当 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true。
buffer 属性设置 out 缓冲区的大小。默认是 8kb
errorPage 属性表示错误后自动跳转的路径
isErrorPage属性设置当前jsp页面是否是错误信息页面,默认是false,如果是true,可以获取异常信息。
session 属性设置访问当前jsp对象,是否会创建HttpSession对象,默认是true
extends属性设置jsp翻译出来的java类默认继承谁

jsp中的常用脚本

声明脚本(极少使用)

	<%!  声明 java 代码 %>

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

表达式脚本(常用)

	<%= 代码 %>

作用:在jsp页面上输出数据
特点:

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

代码脚本

	<% java语句 %>

代码脚本的作用是:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)。
特点:

  • 代码脚本也会翻译到_jspService()方法中
  • 代码脚本由于翻译到_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
  • 还可以由多个代码脚本块组合完成一个完整的java语句
  • 代码脚本可以和表达式脚本一起组合使用

jsp中的三种注释

html注释

	<!-- html注释 -->

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

java注释

	//单行注释
	/* 多行注释*/

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

jsp注释

	<%-- jsp注释 --%>

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

jsp九大内置对象

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

在这里插入图片描述

jsp四大域对象

对象类型作用范围
pageContext(PageContextImpl类)当前jsp页面范围内有效
request(HttpServlet类)一个请求内有效
session(HttpSession类)一个会话范围有效(打开浏览器访问服务器,直到关闭)
application(ServletContext类)整个web工程范围内都有效(只要web工程不停止,数据都在)

域对象是可以像Map一样存取数据的对象,四个域对象功能一样,不同的是它们对数据的存取范围

从小到大的优先顺序:
pageContext===>>>request===>>>session===>>>application

jsp中的out输出和response.getWritter()输出的区别

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

jsp中的常用标签

jsp静态包含

	<%--
		<%@ include file=""%> 就是静态包含
		file 属性指定你要包含的 jsp 页面的路径
		地址中第一个斜杠 / 表示为 http://ip:port/工程路径/映射到代码的 web 目录
	--%>
	<%@ include file = "/include/footer.jsp">

静态包含的特点:
1 、静态包含不会翻译被包含的 jsp 页面。
2 、静态包含其实是把被包含的 jsp 页面的代码拷贝到包含的位置执行输出。

jsp动态包含

动态包含原理:
在这里插入图片描述

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

    <jsp:include page="footer.jsp">
        <jsp:param name="password" value="123456"/>
    </jsp:include>

jsp标签-转发

    <%--请求转发标签--%>
    <jsp:forward page="footer.jsp"></jsp:forward>
请求转发练习

在这里插入图片描述
SearchStudentServlet.java

package com.indi.servet;

import com.indi.pojo.Student;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SearchStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数
        //发sql语句查询学生信息
        //使用for循环生成查询生成到的数据做模拟
        List<Student> studentList = new ArrayList<Student>();
        for (int i = 0; i < 10; i++) {
            int t = i + 1;
            studentList.add(new Student(t, "name" + t, 18 + t, "phone" + t));
        }
        //保存查询到的结果到request域中
        req.setAttribute("stuList",studentList);
        //请求转发到showStudent.jsp页面
        req.getRequestDispatcher("/test/showStudent.jsp").forward(req,resp);
    }
}

showStudent.jsp

<%@ page import="com.indi.pojo.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: New
  Date: 2020/3/27
  Time: 11:17
  To change this template use File | Settings | File Templates.
  展示10条学生数据
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<style>
    table{
        border: 1px solid black;
        width: 600px;
        border-collapse: collapse;
    }

    td{
        border: 1px solid black;
    }
</style>
<body>
<%
    List<Student> studentList = (List<Student>) request.getAttribute("stuList");
%>
<table>
    <tr>
        <td>编号</td>
        <td>姓名</td>
        <td>年龄</td>
        <td>电话</td>
        <td>操作</td>
    </tr>

    <% for (Student student : studentList) { %>

    <tr>
        <td><%= student.getId()%></td>
        <td><%= student.getName()%></td>
        <td><%= student.getAge()%></td>
        <td><%= student.getPhone()%></td>
        <td><button>删除</button> <button>修改</button></td>
    </tr>

    <% } %>

</table>
</body>
</html>

Student.java

package com.indi.pojo;

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String phone;

	//省略get、set等等
}

Listener监听器

Listener是JavaEE的规范,就是接口

主要作用是监听某种事物的变化,通过回调函数,反馈给客户(程序)做一些处理。

ServletContextListener

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

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

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

分别是以下两个方法

public interface ServletContextListener extends EventListener {
	/**
	 * 在ServletContext创建之后马上调用
	 */
    void contextInitialized(ServletContextEvent var1);

	/**
	 * 在ServletContext销毁之后马上调用
	 */
    void contextDestroyed(ServletContextEvent var1);
}

监听器实现类:

package com.indi.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

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

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象销毁了");
    }
}

web.xml 中的配置:

<listener>
	<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值