JavaWeb (九) JSP:概述、九大内置对象、四大域对象、常用标签、listener监听器、ServleteContextListener

1、什么是JSP?

Jsp是Java Server Pages,就是java的服务器页面。

2、为什么要学习jsp技术?

Jsp可以很好的帮我们解决在Servlet程序响应给客户端内容是html页面的时候。可以把这个事件变得很简单。
换而言之。在Servlet程序中,返回html页面,就是一个非常麻烦的事件,而且也不方便维护,也不方便编写,也不方便调试。

Servlet程序中返回html页面。

public class PrintHtml extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		// 需要响应html页面内容
		PrintWriter writer = response.getWriter();
		writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
		writer.write("<html>\r\n");
		writer.write("	<head>\r\n");
		writer.write("		<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
		writer.write("		<title>Insert title here</title>\r\n");
		writer.write("	</head>\r\n");
		writer.write("	<body>\r\n");
		writer.write("		这是一个hello的html页面\r\n");
		writer.write("	</body>\r\n");
		writer.write("</html>");
	}

}

3、如何创建一个jsp动态页面

     

4、如何修改jsp页面的默认编码

         

访问jsp页面和访问html页面一样。
      如果在WebContent目录下有:
          hello.html        ----->>>>   http://ip:port/工程名/hello.html
          hello.jsp            ----->>>>      http://ip:port/工程名/hello.jsp

5、jsp的本质是什么

5.1 jsp本质上是一个servlet程序。

当我们第一次访问jsp页面的时候。Tomcat服务器会把jsp页面翻译成为java源文件。而这个java源文件继承了org.apache.jasper.runtime.HttpJspBase。

   

这个源文件存放在Tomcat的work目录下
而我们通过观察源代码,我们发现。org.apache.jasper.runtime.HttpJspBase它又继承了HttpServlet。

扫描二维码关注公众号,回复: 9077931 查看本文章

所以我们说,jsp本质上是一个Servlet程序。


通过继承观察jsp翻译出来的java源代码,我们发现。它在_jspService方法中,其实也是使用输出流。输出jsp页面中的html内容。
跟我们原来在Servlet程序中做的是一样的工作。只不过。现在不需要我们自己去编写这个输出了。

tomcat翻译jsp成为java的全名规则:

  1. 如果jsp的全名是:a.jsp        那么翻译出来之后的源文件全名是:a_jsp.java
  2. 如果jsp的全名是:hello.jsp    那么翻译出来之后的源文件全名是:hello_jsp.java

        规律是:    源文件名.jsp        翻译出来之后是:源文件名_jsp.java

6、jsp 的三种语法

6.1 jsp 头部的page指令

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
language属性	        表示当前jsp翻译之后的语言。值只能是java。
contentType属性	        表示访问jsp之后返回的数据内容类型。刚好是翻译出来的源码中response.setcontentType的值
pageEncoding属性		它可以设置当前jsp页面的编码
import属性		它可以导包。

autoFlush属性		设置out输出流,当缓冲区满了之后是否自动刷新缓冲区,默认是true
buffer属性		设置out输出流,缓冲区的大小。默认是8kb

      

errorPage属性			设置当jsp运行时报错。就自动跳转的页面。
 <%-- errorPage属性中的斜杠,表示到http://ip:port/工程名/ 映射到代码的WebContent目录
         errorPage="/error500.jsp"    表示当 a.jsp运行时报错。就会自动的转发到error500.jsp页面
 --%>d
isErrorPage属性        设置当前jsp页面,是否是一个错误页面。默认是false。它可以启用Exception异常对象

session 属性           设置访问jsp页面的时候。是否需要创建Session对象。默认是true
extends 属性           设置jsp翻译之后默认继承哪个类,一般这个属性是给服务器厂商预留

6.2 jsp中的三种脚本

(1)声明脚本(基本上不用)
声明脚本的格式:    <%!        声明代码   %>

1、声明脚本可以在jsp页面中定义变量,以及方法,以及其他代码(可以在类中定义的代码)。

  1. 我们可以定义全局变量。
  2. 定义static静态代码块
  3. 定义方法
  4. 定义内部类

声明脚本图解脚本和翻译之后的代码内容:

(2)表达式脚本(使用比较多
表达式脚本的格式是:<%=表达式 %>

  1. 表达式脚本可以在jsp页面中输出数据。
  2. 表达式脚本翻译之后都在_jspService方法中
  3. 表达式脚本翻译之后都是out.print进行输出
  4. 由于表达式脚本翻译在_jspService方法中。所以在_jspService方法中的所有对象都可以直接使用。
  5. 在表达式脚本中的表达式不能以分号结束
  • 输出整型
  • 输出浮点型
  • 输出字符串
  • 输出对象

图解表达式脚本翻译之后的对比

(3)代码脚本
代码脚本的格式是:<%    代码   %>    

  1. 代码脚本可以写所在函数体内可以写的代码。
  2. 代码脚本翻译之后都在_jspService方法中
  3. 在_jspService方法中可以写的代码,都可以在代码脚本中写。
  • 代码脚本----if 语句
  • 代码脚本----for 循环语句
  • 翻译后java文件中_jspService方法内的代码都可以写

图解代码脚本和翻译之后内容的比较:

6.3 jsp中的三种注释

i.html注释				<!-- 这是html注释 -->
		html注释在翻译之后会变成 out.write输出到客户端。

ii.java注释
			// 这是java注释
			/* 这是java注释 */
		在翻译的时候。会被翻译到Servlet程序的源代码中

iii.jsp注释	<%-- 这是jsp注释 --%>
   在翻译的时候。会被完全忽略掉。

7、jsp九大内置对象

8、jsp 四大域对象

pageContext 当前jsp页面   
request    一次请求
session 一次会话(当浏览器打开后访问服务器   直到    浏览器关闭)
application

整个web工程(web工程启动,到web工程停止)

从小到大的顺序 分别是:
     pageContext   <   request   <    session   <     application

四个域的使用顺序,从小到大。

9、jsp中的out输出和response。getWriter输出的区别

 输出的时候。统一使用out对象进行输出。

所print底层都是调用write进行输出。
两个方法输出字符串的时候。都不会错误。

out.print      可以用来输出任意数据
out.write      只适合于用来输出字符串

统一使用out.print进行输出。

10、jsp 的常用标签

10.1 jsp 静态包含

<!--     
        静态包含中的斜杠表示到http://ip:port/工程名/		映射到代码的Webcontent目录
		 -->
		<%@ include file="/include/footer.jsp" %>
  1. 静态包含,只会翻译主体的jsp页面。
  2. 静态包含,是把被包含的jsp页面的内容翻译到被包含的位置进行输出。

10.2 jsp 标签 - 动态包含

<jsp:include page="/include/footer.jsp"></jsp:include>
  1. 动态包含会把所的jsp页面。都翻译成为java源文件
  2. 动态包含转变成为JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);代码调用

10.3 jsp  标签 - 转发

<jsp:forward page="/context2.jsp"></jsp:forward>

功能跟 request.getRequestDispatcher("/context2.jsp").forward(request, response); 一样

11 、静态包含和动态包含的区别

  静态包含 动态包含
是否生成java文件 不会
service方法中的区别 是把被包含的jsp页面的内容原封不动地拷贝到被包含的位置执行

JspRuntimeLibrary.include(request, response,

"/include/footer.jsp", out, false);

是否可以传递参数 不可以传递参数 可以传递参数
编译次数 1 2
适用范围 静态包含适用于那些jsp页面里只有简单的输出html页面内容的jsp

动态包含适用于包含那些在jsp页面中有大量的脚本

(java代码)的页面

随着java的不断升级。jsp在整个JavaEE中的定位发生了变化 。现在jsp在javaEE只是做为输出html页面的技术。
jsp现在只是用来输出html页面的数据。

11. 1 jsp的练习题:

练习一:在jsp页面中输出5x5的表格

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
		<style type="text/css">
			table{
				width: 500px;
				border: 1px solid red;
				border-collapse: collapse;
			}
			th , td{
				border: 1px solid red;
			}
		</style>
	</head>
	<body>
<!-- 		练习一:在jsp页面中输出5x5的表格 -->
		<table>
			<% for(int i = 1; i <= 5; i++){ %>
				<tr>
					<td><%=i %>.1</td>
					<td><%=i %>.2</td>
					<td><%=i %>.3</td>
					<td><%=i %>.4</td>
					<td><%=i %>.5</td>
				</tr>				
			<% } %>
		</table>
	</body>
</html>

练习二:在jsp中输出九九乘法口诀表

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
		<style type="text/css">
			table{
				width: 700px;
				border: 0px solid red;
				border-collapse: collapse;
			}
			th , td{
				border: 0px solid red;
			}
		</style>
	</head>
	<body>
		<center>
			<h1>九九乘法口诀表</h1>
			<table>
			<% for (int i = 1; i < 10; i++) { %>
				<tr>
				<%  for (int j = 1; j <= i; j++) {  %>	
						<td><%=j + "x" + i + "=" + (i*j) %></td>
				<%  }  %>
				</tr>
			<% }  %>
			</table>
		</center>
	</body>
</html>

练习:jsp输出一个表格,里面有20个学生信息。

注:访问的时候。一定要先访问SearchStudent

SearchStudent程序代码

public class SearchStudent extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("1、获取请求的参数");
		System.out.println("2、到数据库查询");
		// 使用代码生成查询完之后的结果
		List<Student> stus = new ArrayList<Student>();
		for (int i = 0; i < 20; i++) {
			stus.add(new Student(i, "name"+i, i%2==0?"男":"女", "phone"+i));
		}
		request.setAttribute("stus", stus);
		// 转发
		request.getRequestDispatcher("/test/showStudent.jsp").forward(request, response);
	}

}

showStudent.jsp

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.atguigu.pojo.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
		<style type="text/css">
			table{
				width: 500px;
				border: 1px solid red;
				border-collapse: collapse;
			}
			th , td{
				border: 1px solid red;
			}
		</style>
	</head>
	<body>
		<%
			List<Student> stus = (List<Student>) request.getAttribute("stus");
		%>
		<table>
			<tr>
				<th>编号	</th>
				<th>姓名	</th>
				<th>性别	</th>
				<th>电话	</th>
				<th>操作	</th>
			</tr>
		<% for (int i = 0; i < stus.size(); i++) { %>
			<% Student stu = stus.get(i); %>
			<tr>
				<td><%=stu.getId() %></td>
				<td><%=stu.getName() %></td>
				<td><%=stu.getSex() %></td>
				<td><%=stu.getPhone() %></td>
				<td>删除、修改</td>
			</tr>
		<% } %>
		</table>
	</body>
</html>

表格样式

<style type="text/css">
	table{
		width: 500px;
		border: 1px solid red;
		border-collapse: collapse;
	}
	th , td{
		border: 1px solid red;
	}
</style>

12 、什么是 Listener 监听器

12.1 概述

监听器是Listener。它是javaWeb三大组件之一。Servlet程序Filter过滤器Listener监听器

监听器的作用:监听某个事物状态的变化,然后反馈给用户。

12.2 Listener 监听器的作用与实现:

ServletContextListener监听器,它主要是监听ServletContext对象的创建和销毁

    1、编写一个类去实现ServletContextListener接口
    2、实现接口的两个方法
    3、到web.xml中去配置才能生效

监听器的代码:

public class ServletContextListenerImpl implements ServletContextListener {
	/**
	 * 当ServletContext对象创建的时候调用
	 */
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("ServletContext对象被创建了………………");
	}

	/**
	 * 当ServletContext对象销毁的时候调用
	 */
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("ServletContext对象被销毁了………………");
	}

}

web.xml中的配置:

<!-- listener标签配置监听器 -->
	<listener>
		<!-- listener-class配置监听器的全类名 -->
		<listener-class>com.atguigu.listener.ServletContextListenerImpl</listener-class>
	</listener>
发布了222 篇原创文章 · 获赞 60 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42405670/article/details/103931100