JavaWeb学习笔记——jsp、Listener监听器

jsp 介绍

  • jsp:java server pages,用于替代 html 页面的动态页面。
  • jsp 页面本质上是一个 Servlet 程序,当第一次访问 jsp 页面时,Tomcat 服务器会自动将 jsp 页面转换成一个 java 源文件,并进一步编译成 .class 字节码文件。jsp 转换成的 java 类,间接继承了 HttpServlet 类,因此,每个 jsp 页面都是一个 Servlet 程序。

语法

jsp 的 page 指令可以修改 jsp 页面中的一些属性或行为

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  • language 属性:表示 jsp 页面被 tomcat 服务器转换为何种语言的文件,暂时只支持 java。
  • contentType 属性:表示 jsp 返回给客户端的数据类型,即源码中 response.setContentType()的参数值。
  • pageEncoding 属性:表示当前 jsp 页面本身的字符集。
  • import 属性:用于导包、导类。
  • autoFlush 属性:设置当 out 输出流缓冲区满了之后,是否自动刷新缓冲区,默认值为 true。
  • buffer 属性:设置 out 缓冲区的大小,默认为 8kb。
  • errorPage 属性:设置当 jsp 页面运行出错时,自动跳转到的错误页面的路径。
    注意:errorPage 表示错误后自动跳转的路径,该路径一般以斜杠开始,表示请求地址为 http://ip:port/工程路径/ 映射到代码的 Web 目录
  • isErrorPage 属性:设置当前 jsp 页面是否是错误信息页面,默认为 false,如果为 true 可以获取异常信息。
  • session 属性:设置访问当前 jsp 页面,是否会创建 HttpSession 对象,默认为 true。
  • extends 属性:设置 jsp 转换成的 java 类默认继承哪个父类。

jsp 脚本

声明脚本(极少使用)

声明脚本的格式为: <%! 声明 java 代码 %>

作用:可以给 jsp 转换的 java 类定义属性、方法、静态代码块、内部类等。

<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jsp脚本</title>
</head>
<body>
	<%-- 声明脚本:可以给jsp解析出来的java类定义属性、方法、静态代码块、内部类等。 --%>
	<%-- 声明属性 --%>
	<%!
		private String name;
		private int age;
		private static Map<Integer, String> map;
	%>
	<%-- 声明方法 --%>
	<%!
		public int add(int a, int b){
			return a+b;
		}
	%>
	<%-- 声明静态代码块 --%>
	<%!
		static {
			map.put(1, "val1");
			map.put(2, "val2");
			map.put(3, "val3");
		}
	%>
	<%-- 声明内部类 --%>
	<%!
		public class A{
			private int id;
			private double salary;
		}
	%>
</body>
</html>

表达式脚本

表达式脚本的格式为:<%= 表达式 %>

表达式脚本的作用是:在 jsp 页面上输出数据。

表达式脚本的特点:

  1. 所有的表达式脚本都会被翻译到_jspService() 方法中。
  2. 表达式脚本都会被写入 out.print() 中输出到页面上。
  3. 由于表达式脚本翻译的内容都在_jspService() 方法中,所以_jspService()方法中的对象都可以直接使用。
  4. 表达式脚本中的表达式不能以分号结束。
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jsp脚本</title>
</head>
<body>
	<%-- 表达式脚本:在jsp页面上输出数据 --%>
	<%-- 输出常规数据 --%>
	<%= 123 %>
	<%= 3.14 %>
	<%= "string" %>
	<%-- 输出对象 --%>
	<%= map %>
	<%-- 获取请求参数 --%>
	<%= request.getParameter("username") %>
</body>
</html>

代码脚本

代码脚本的格式为:
<%
       java 语句;
%>

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

代码脚本的特点:

  1. 代码脚本翻译之后都在_jspService 方法中。
  2. 代码脚本由于翻译到_jspService()方法中,所以在_jspService()方法中的现有对象都可以直接使用。
  3. 可以由多个代码脚本组合完成一个完整的 java 语句。
  4. 可以和表达式脚本一起组合使用,在 jsp 页面上输出数据。
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jsp脚本</title>
</head>
<body>
	<%-- 代码脚本:可以在jsp页面中,编写java语句 --%>
	<%
		for(int i=1; i<3; i++){
			System.out.println(i);
		}
	%>
	<%
		String username = request.getParameter("username");
		System.out.println(username);
	%>
</body>
</html>

脚本练习

练习1:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>table</title>
</head>
<body>
	<!-- 根据用户输入的行数,输出对应行数的列表 -->
	<table border="1">
		<%-- 列表的函数动态生成,封装到jsp代码中 --%>
		<%	
			String rowStr = request.getParameter("row");
			for(int i=0; i<Integer.parseInt(rowStr); i++) {
		%>
			<tr>
				<td><%= i %></td>
			</tr>
		<%
			}
		%>
	</table>
</body>
</html>

练习2:打印九九乘法表

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<style type="text/css">
		table {
			width: 650px;

		}
	</style>
</head>
<body>
	<%-- 输出乘法口诀表,行数由输入的参数决定 --%>
	<%			
		String row = request.getParameter("row");
	 %>
	<h2 align="center">乘法口诀表(<%= row+"x"+row %></h2>
	<table align="center">
		<%	
			for(int i=0; i<Integer.parseInt(row); i++){
		%>
			<tr>
				<%
					for(int j=0; j<i+1; j++){
						int sum = (i+1)*(j+1);
				%>	
						<td><%= (j+1)+"x"+(i+1)+"="+sum %></td>
				<% 
						sum = 0;
					}
				%>
			</tr>
		<%
			}
		%>
	</table>
</body>
</html>

jsp 注释

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

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

  3. jsp 注释
    <%-- 这是 jsp 注释 --%>
    jsp 注释可以注掉,jsp 页面中所有代码。

jsp 九大内置对象

对象意义
request请求对象
response响应对象
pageContextjsp 上下文对象
session会话对象
applicationServletContext 对象
configServletConfig 对象
outjsp 输出流对象
page当前 jsp 页面对象
exception异常对象

jsp 四大域对象

对象所属类有效范围
pageContextPageContextImpl 类当前 jsp 页面内有效
requestHttpServletRequest 类一次请求内有效
sessionHttpSession 类一个会话内有效(打开浏览器访问服务器,直到关闭浏览器)
applicationServletContext 类整个 web 工程内有效(只要 web 工程不停止,数据都共享)

四个域对象从小到大的范围为:pageContext < request < session < application

存数据页面:

<body>
<%
//向四个域中保存数据
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>

out 输出流

在 jsp 页面中,可以统一使用 out.print() 进行输出

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%-- 
		 两个输出流:
			out
			response.getWriter()/getOutputStream() 
		两个流在输出基本数据类型(如int)时:
			(1)out.write(int i)与response.getWriter().write(int i)不能正常输出,会将i转换为对应的ASCII码
			(2)out.print(int i)与response.getWriter().print(int i)可以正常输出
			因此使用print()输出较好
			
		特点:
			out与response.getWriter()都有属于之自己的缓冲区,out写出的数据先存放在out缓冲区中,
			当页面执行结束后,自动调用flush()方法,将out缓冲区中的数据追加到response缓冲区末尾,
			因此,即使先写out输出语句,后写response输出语句,也是先输出response内容(手动flush除外)
	 --%>
	 <%
	 	out.print(12);
	 	out.write(13);
	 %>
</body>
</html>

jsp 标签

静态包含

<%@ include file="/地址" %>
file 属性表示被包含的页面所在的地址,一般以斜杠开始,表示工程的web目录

静态包含.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>这是标题</h1>
	<div>这是内容</div>
	<!-- 接下来的页尾由通用内容组成,多个页面共享该内容,当需要维护时,只需要修改资源页面代码即可 -->
	<%-- / 斜杠表示路径为 http://localhost:8080/工程路径/	对应工程的WebContent目录 --%>
	<%@ include file="/jsp/staticInclude/staticIncludePage.jsp" %>
</body>
</html>

被包含的页面 staticIncludePage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>静态包含页面</div>
</body>
</html>

动态包含

<jsp:include page="/地址"></jsp:include>
page 属性表示被包含的页面所在的地址,一般以斜杠开始,表示工程的web目录
动态包含可以通过 <jsp:param name="" value=""/> 传递数据给被包含的页面,被包含的页面可以通过 request.getParameter() 获取这些数据

动态包含.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>这是标题</h1>
	<div>这是内容</div>
	<!-- 
		下面演示动态包含,动态包含可以传数据给被包含的页面,被包含的页面可以通过request.getParameter()获取这些数据
	-->
	<jsp:include page="/jsp/dynamicInclude/dynamicIncludePage.jsp">
		<jsp:param name="username" value="admin"/>
	</jsp:include>
</body>
</html>

被包含的页面 dynamicIncludePage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>动态包含页面</div>
	<%=request.getParameter("username") %>
</body>
</html>

请求转发

<jsp:forward page=""></jsp:forward>
page 属性表示被包含的页面所在的地址,一般以斜杠开始,表示工程的web目录

初始页面 initPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%--
		Servlet中的请求转发语句
		request.getRequestDispatcher(String path).forward(Request req, Response resp);
		在jsp中可以用下面的请求转发标签实现,且效果相同
	--%>
	<%
		out.print("初始页面");
	%>
	<jsp:forward page="/requestTransmit/transmitPage.jsp"></jsp:forward>
</body>
</html>

要转发到的页面 transmitPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		out.print("转发页面");
	%>
</body>
</html>

Listener 监听器

介绍

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

ServletContextListener 监听器

  • ServletContextListener 用于监听 ServletContext 对象的创建和销毁。
  • 由于一个项目只有一个 ServletContext 对象,因此该监听器只有在项目开启和关闭时才会被触发。
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 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSPJavaServer Pages)是一种服务器端的动态网页开发技术,它可以将 Java 代码嵌入 HTML 页面中,从而实现动态网页的生成。 JSP 的基本原理是将 JSP 页面翻译成 Servlet,在服务器端执行 Servlet 代码,再将执行结果返回给客户端。因此,我们在使用 JSP 开发网页时,需要先了解 Servlet 的相关知识。 JSP 的语法基本上就是 HTML 标签加上 Java 代码。以下是一些基本的 JSP 标签: 1. <% ... %>:嵌入 Java 代码,可以用于定义变量、写循环、判断语句等。 2. <%= ... %>:输出 Java 代码的执行结果。 3. <%-- ... --%>:注释,不会被翻译成 Servlet。 4. <jsp:include ... />:包含其他 JSP 页面或 HTML 页面。 5. <jsp:forward ... />:将请求转发到其他资源(JSP 页面、Servlet 或 HTML 页面)。 6. <jsp:useBean ... />:创建 JavaBean 对象。 7. <jsp:setProperty ... />:为 JavaBean 对象设置属性。 8. <jsp:getProperty ... />:取得 JavaBean 对象的属性值。 在 JSP 页面中,我们还可以使用 EL 表达式和 JSTL 标签库来简化代码编写,提高开发效率。 EL(Expression Language)表达式是一种简化的表达式语言,可以用于取值、赋值、计算等操作。例如,${name} 表示取得名为 name 的变量的值。 JSTL(JavaServer Pages Standard Tag Library)是一套标签库,提供了循环、条件判断、格式化、国际化等常用功能的标签。例如,<c:forEach> 标签可以用于循环遍历集合,<c:if> 标签可以用于条件判断。 除了以上标签库,JSP 还支持自定义标签库。我们可以通过编写标签处理器来扩展 JSP 的功能。 JSP 的优点是可以将 Java 代码嵌入 HTML 页面中,使得网页的开发更加灵活和方便。但是,由于 JSP 页面需要翻译成 Servlet,因此会增加服务器的负担和响应时间。此外,JSP 页面中夹杂着 Java 代码,也不利于代码的维护和调试。因此,在开发大型网站时,建议使用 MVC 设计模式,将业务逻辑和视图分离,使得代码更加清晰和易于维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值