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。
所以我们说,jsp本质上是一个Servlet程序。
通过继承观察jsp翻译出来的java源代码,我们发现。它在_jspService方法中,其实也是使用输出流。输出jsp页面中的html内容。
跟我们原来在Servlet程序中做的是一样的工作。只不过。现在不需要我们自己去编写这个输出了。
tomcat翻译jsp成为java的全名规则:
- 如果jsp的全名是:a.jsp 那么翻译出来之后的源文件全名是:a_jsp.java
- 如果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页面中定义变量,以及方法,以及其他代码(可以在类中定义的代码)。
- 我们可以定义全局变量。
- 定义static静态代码块
- 定义方法
- 定义内部类
声明脚本图解脚本和翻译之后的代码内容:
(2)表达式脚本(使用比较多
表达式脚本的格式是:<%=表达式 %>
- 表达式脚本可以在jsp页面中输出数据。
- 表达式脚本翻译之后都在_jspService方法中
- 表达式脚本翻译之后都是out.print进行输出
- 由于表达式脚本翻译在_jspService方法中。所以在_jspService方法中的所有对象都可以直接使用。
- 在表达式脚本中的表达式不能以分号结束
- 输出整型
- 输出浮点型
- 输出字符串
- 输出对象
图解表达式脚本翻译之后的对比
(3)代码脚本
代码脚本的格式是:<% 代码 %>
- 代码脚本可以写所在函数体内可以写的代码。
- 代码脚本翻译之后都在_jspService方法中
- 在_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" %>
- 静态包含,只会翻译主体的jsp页面。
- 静态包含,是把被包含的jsp页面的内容翻译到被包含的位置进行输出。
10.2 jsp 标签 - 动态包含
<jsp:include page="/include/footer.jsp"></jsp:include>
- 动态包含会把所的jsp页面。都翻译成为java源文件
- 动态包含转变成为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>