jsp详情

以下内容均来着于网络,为供自己更好的复习以及各位学习,我把内容进行了排版总结。
欢迎转载
本内容配合尚硅谷javaweb开发P172-P190食用更佳。尚硅谷javaweb开发

一、JSP的介绍与创建

  1. JSP的全称是Java Server Pages,即Java的服务器页面
  2. JSP的主要作用是代替Servlet程序回传HTML页面的数据(因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。)
  3. web目录(或其他)右击 --> new --> JSP/JSPX --> 输入文件名 --> 选择JSP file创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LyjJFsmA-1657067827915)(C:\Users\17018\AppData\Roaming\Typora\typora-user-images\image-20220706002807679.png)]
4. jsp 如何访问:
jsp 页面和 html 页面一样,都是存放在 web 目录下。访问也跟访问 html 页面一样。
web 目录
a.html 页面:访问地址是 => http://ip:port/工程路径/a.html
b.jsp 页面:访问地址是 => http://ip:port/工程路径/b.jsp

二、JSP的本质

JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:

而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序
在这里插入图片描述
底层实现,通过输出流。把 html 页面数据回传 给客户端。

三、JSP的语法

1.JSP头部的page指令:

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

(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值。注意:默认值除非有特殊需要,否则不建议修改)

<%@ page contentType="text/html; charset=UTF-8"  language="java" %>
i. language 属性 
表示 jsp 翻译后是什么语言文件。暂时只支持 java。 
ii. contentType 属性 
表示 jsp 返回的数据类型是什么。也是源码中response.setContentType()参数值 
iii. pageEncoding 属性 
表示当前 jsp 页面文件本身的字符集。 
iv. import 属性 
跟 java 源代码中一样。用于导包,导类。 
============两个属性是给 out 输出流使用=================== 
v. autoFlush 属性 
设置当 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true。 
vi. buffer 属性 
设置 out 缓冲区的大小。默认是 8kb 
============两个属性是给 out 输出流使用===================== 
vii. errorPage 属性 设置当 jsp 页面运行时出错,自动跳转去的错误页面路径。
<!-- errorPage 表示错误后自动跳转去的路径 <br/> 这个路径一般都是以斜杠打头,它表示请求地址为 http://ip:port/工程路径/
映射到代码的 Web 目录 --> 
viii. isErrorPage 属性 
设置当前 jsp 页面是否是错误信息页面。默认是 false。如果是 true 可以 获取异常信息。 
ix. session 属性 
设置访问当前 jsp 页面,是否会创建 HttpSession 对象。默认是 true。
x. extends 属性 
设置 jsp 翻译出来的 java 类默认继承谁。

缓冲区溢出错误:
在这里插入图片描述

2.JSP中的常用脚本

1.声明脚本(不常用)

格式:<%! 声明Java代码 %>
作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等
特点:不会在浏览器的页面上显示出来,仅存在于翻译后的Java类中

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

<%@ 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");
        }
    %>
    <%--4、声明内部类--%> 
    <%! public static class A {
            private Integer id = 12; 
            private String abc = "abc"; 
        } 
    %>
</body>
</html>

对应的翻译后的java源文件
在这里插入图片描述
在这里插入图片描述

2.表达式脚本(常用)

格式:<%=表达式 %>
作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)
特点:
(1) 所有的表达式脚本都会被翻译到对应的Java类的_jspService()方法中,故表达式脚本可以直接使用_jspService()方法参数中的对象
(2) 表达式脚本都会被编译后的Java类中的out.print()方法输出到浏览器页面上
(3) 表达式脚本中的表达式不能以分号结束

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

在这里插入图片描述

注意:
1.write方法中的标签、转义字符自动识别为对应的功能,不在页面输出,执行各自代表的功能
2.out的两个方法也在_jspService方法中,也都是java语言
3.只有print、write方法、表达式脚本中的内容才可在浏览器中显示,其余Java代码的sout在控制台输出

3.代码脚本

格式:<% Java语句 %>

作用:在JSP页面中可以编写需要的Java代码
特点:
(1) 代码脚本翻译后都在_jspService方法中,故代码脚本可以直接使用此方法参数中的对象
(2) 可以由多个代码脚本块组合完成一个完整的Java语句
(3) 代码脚本还可以和表达式脚本一起组合使用,在JSP页面上输出数据

<%--1.if语句--%>
<%
    int i = 1;
    if (i == 1) {
        System.out.println("我爱祖国!");
    } else {
        System.out.println("我很爱祖国!");
    }
%> <br/>
<%--2.for循环语句--%>
<%
    for (int j = 0 ; j < 3; j++) {
        System.out.println("第" + j + "次循环");
    }
%> <br/>
<%--3.使用_jspService方法参数中的对象--%>
<%
    String username = request.getParameter("username");
    System.out.println("username对应的值为:" + username);
%>

在这里插入图片描述

JSP三种注释

HTML注释:<!--HTML注释-->
    html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。
Java注释:
<%
(1) //单行注释 
(2) /*多行注释*/
%>
    java 注释会被翻译到 java 源代码中。
JSP注释:<%- -这是JSP注释- -%>
    jsp 注释可以注掉,jsp 页面中所有代码。

HTML注释会被翻译到JSP文件对应的Java类的_jspService方法中,以out.write()输出到客户端,write方法会自动识别标签,执行标签对应的功能,不会在浏览器的页面上输出注释,Java注释要写在声明脚本和代码脚本中才被认为是Java注释,会被翻译到JSP文件对应的Java类的_jspService方法中,在对应的Java类中也是注释,JSP注释中的内容不会在JSP文件翻译后的Java类中出现,即注释中的内容没有任何功能。

四、JSP九大内置对象

JSP的内置对象指的是Tomcat服务器将JSP页面翻译为Java类之后内部提供的九大对象:
(将page指令的isErrorPage属性写成true可以出现exception对象)
在这里插入图片描述

request:请求对象
response:响应对象
pageContext:JSP的上下文对象
session:会话对象
application:ServletContext对象
config:ServletConfig对象
out:JSP输出流对象
page:指向当前JSP的对象
exception:异常对象

五、JSP四大域对象

四个域对象分别是:

pageContext (PageContextImpl 类)
当前 jsp 页面范围内有效 

request (HttpServletRequest 类)
一次请求内有效 

session (HttpSession 类)
一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器) 

application (ServletContext 类) 
整个 web 工程范围内都有效(只要 web 工程不停止,数据都在) 

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

从小到大的范围的优先顺序分别是:

pageContext ====>>> request ====>>> session ====>>> application

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope1</title>
</head>
<body>
    <h1>scope1.jsp页面</h1>
    <%
        //向四个域对象中分别保存数据
        pageContext.setAttribute("key", "pageContext");
        request.setAttribute("key", "request");
        session.setAttribute("key", "session");
        application.setAttribute("key", "application");
    %>
    <%-- <jsp:forward page=""></jsp:forward>是请求转发标签,
         page属性设置请求转发的路径 --%>
    <jsp:forward page="/scope2.jsp"></jsp:forward>
</body>

六、JSP的out输出和response.getWriter输出的异同

同:response 中表示响应,我们经常用于设置返回给客户端的内容(输出) ,out 也是给用户做输出使用的。

异:
在这里插入图片描述

注意:由于官方的代码中翻译后的Java代码底层都是使用out进行输出,故一般都使用out进行 输出,out又分为write方法和print方法:
(1) out.print():会将任何内容转换成字符串后调用write方法输出
(2) out.write():输出字符串没有问题,但输出int型时会将int转换成char输出,导致输出的并非是想要的数字而是数字对应的ASCII码
结论:JSP页面的代码脚本中任何要输出在浏览器的内容均使用out.print()方法

七、JSP的常用标签

1. 静态包含

使用方法:
<%@ include file="/include/footer.jsp"%>
其中file属性设置要包含的JSP页面,以/打头,代表http://ip:port/工程路径/,对应web目录
<body>
    头部信息 <br>
    主体信息 <br>
    <%@include file="/foot.jsp"%>
</body>
<body>
    页脚信息 <br>
</body>
    静态包含的特点:
①静态包含不会将被包含的JSP页面翻译成.java.class文件
②静态包含是把被包含的页面的代码拷贝到body.jsp对应的Java文件的对应位置执行输出

2.动态包含

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

在这里插入图片描述

3.jsp 标签转发

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

八、ServletContextListener监听器

Listener监听器的介绍

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

(2) Listener监听器是JavaEE的规范(接口)
(3) Listener监听器的作用是监听某件事物的变化,然后通过回调函数反馈给程序做一些处理

ServletContextListener监听器

ServletContextListener监听器可以监听ServletContext对象的创建和销毁(web工程启动时创建,停止时销毁),监听到创建和销毁之后都会调ServletContextListener监听器的方法进行反馈:

public interface ServletContextListener extends EventListener {
    //在ServletContext对象创建之后调用
    public void contextInitialized(ServletContextEvent sce);
    //在ServletContext对象销毁之后调用
    public void contextDestroyed(ServletContextEvent sce);
}

ServletContextListener监听器的使用步骤
(1) 编写一个类实现ServletContextListener接口
(2) 重写两个方法
(3) 在web.xml文件中配置监听器

创建一个类

public class ListenerTest 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>标签中写上述程序的全类名 -->
    <listener-class>com.qizegao.servlet.ListenerTest</listener-class>
</listener>

运行结果:
Tomcat服务器启动之后控制台输出ServletContext对象创建
Tomcat服务器停止之后控制台输出ServletContext对象销毁

注意:

查看翻译后的Java源文件的方法:启动Tomcat服务器访问到JSP页面之后在控制台输出的信息的前端找到Using CATALINA_BASE中的路径,在硬盘中打开此目录,点击work --> Catalina --> localhost,找到对应的工程文件夹寻找即可
访问JSP页面其实是在执行对应的翻译后的Java代码的_jspService方法:翻译后的Java类中没有service方法,而是重写了父类的_jspService方法,这个方法会被父类的service方法调用

九、jsp 的练习题

jsp 页面中输出九九乘法口诀表

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
<head> 
	<title>Title</title> 
	<style type="text/css"> 
		table{ 
			width: 650px; 
		} 
	</style> 
</head> 
<body> 
<%-- 练习一:在 jsp 页面中输出九九乘法口诀表 --%> 
<h1 align="center">九九乘法口诀表</h1> 
<table align="center"> 
<%-- 外层循环遍历行 --%> 
<% for (int i = 1; i <= 9; i++) { %> <tr> 
<%-- 内层循环遍历单元格 --%> 
	<% for (int j = 1; j <= i ; j++) { %> <td>
		<%=j + "x" + i + "=" + (i*j)%></td> 
	<% } %> </tr> 
<% } %> 
</table>

jsp 输出一个表格,里面有 10 个学生信息。

在这里插入图片描述

public class Student { 
	private Integer id; 
	private String name; 
	private Integer age; 
	private String phone;
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); 
	} 
}
<%@ page import="java.util.List" %> 
<%@ page import="com.atguigu.pojo.Student" %> 
<%@ page import="java.util.ArrayList" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
<head> 
	<title>Title</title> 
	<style> 
		table{ 
			border: 1px blue solid; 
			width: 600px; 
			border-collapse: collapse; 
		}td,th{ 
			border: 1px blue solid; 
		} 
	</style> 
</head>
<body> 
<%--练习二:jsp 输出一个表格,里面有 10 个学生信息。--%> 
<% 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>删除、修改</td>
		</tr> 
	<% } %>
	</table>
</body>
</html>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值