1.jsp定义及作用
定义
jsp全称是java server pages,Java的服务器页面。
作用
主要作用是代替Servlet程序回传html页面的数据,因为使用Servlet程序回传html页面数据开发和维护成本都比较高。
示例
servlet程序回传html页面数据:
public class PrintHtml extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
//通过响应的回传流回传html页面数据
PrintWriter writer = resp.getWriter();
writer.write("<!DOCTYPE html>\r\n");
writer.write(" <html lang=\"en\">\r\n");
writer.write(" <head>\r\n");
writer.write(" <meta charset=\"UTF-8\">\r\n");
writer.write(" <title>Title</title>\r\n");
writer.write(" </head>\r\n");
writer.write(" <body>\r\n");
writer.write(" 这是html页面数据\r\n");
writer.write(" </body>\r\n");
writer.write("</html>\r\n");
writer.write("\r\n");
}
}
jsp回传html页面数据:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
a.jsp页面
</body>
</html>
2.jsp的本质
jsp页面本质上是一个Servlet程序,当我们第一次访问jsp页面时,Tomcat服务器会帮我们把jsp页面翻译成为一个Java源文件,并对它进行编译称为**.class字节码程序**。
3.jsp的三种语法
jsp头部的page指令
jsp的page指令可以修改jsp页面中的一些重要的属性或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
属性 | 作用 |
---|---|
language属性 | 表示jsp翻译后的语言文件 |
contextType属性 | 表示jsp返回的数据类型,即源码中的response.setContextType()参数值 |
pageEncoding属性 | 表示当前jsp页面文件本身的字符集 |
import属性 | 用于导包、导类 |
autoFlush属性 | 设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true |
buffer属性 | 设置out输出流缓冲区的大小,默认是8kb |
errorPage属性 | 设置当jsp页面运行时出错,自动跳转去的错误页面路径(用于提示用户页面出错) |
isErrorPage属性 | 设置当前jsp页面是否是错误信息页面,默认是false,如果是true可以获取异常信息 |
session属性 | 设置访问当前jsp页面,是否会创建HttpSession对象,默认是true |
extends属性 | 设置jsp翻译出来的java类默认继承谁 |
jsp中常用脚本
1.声明脚本
- 格式:
<%! 声明脚本 %>
- 作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块、内部类等。
例:
<%--1、声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
<%--2、声明 static 静态代码块--%>
<%!
static{
map = new HashMap<String,Object>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
}
%>
<%--3、声明类方法--%>
<%!
public int abc(){
return 12;
}
%>
<%--4、声明内部类--%>
<%!
public static class A{
private integer id = 12;
private String name = "abc";
}
%>
2.表达式脚本
- 格式:
<%=表达式%>
-
作用:在jsp页面上输出数据。
-
特点:
- 所有的表达式脚本都会被翻译到__jspService()方法中;
- 表达式脚本都会被翻译成out.print()输出到页面上;
- 由于表达式脚本翻译的内容都在__jspService()方法中,所以jspService()方法中的对象都可以直接调用;
- 表达式脚本中的表达式不能以分号结束。
- 练习:
<%--输出整型--%>
<%=12%><br>
<%--输出浮点型--%>
<%=12.12%><br>
<%--输出字符串--%>
<%="字符串"%><br>
<%--输出对象--%>
<%=map%><br>
<%=request.getParameter("username")%><br>
3.代码脚本
- 格式:
<%
java语句
%>
-
作用:可以在jsp页面中编写需要的功能。
-
特点:
- 代码脚本翻译之后都在__jspService()方法中;
- 代码脚本由于翻译到__jspService()方法中,所以在jspService()方法中现有的对象都可以直接使用;
- 多个代码脚本块可以组合成一个完整的Java语句;
- 代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据。
jsp中的三种注释
- html注释——
- html注释会被翻译到Java源代码中。在__jspService()方法中以out.writer输出到客户端。
- Java注释——/**/和//
- Java注释会被翻译到Java源代码中。
- jsp注释——<%–jsp注释–%>
- jsp注释可以注释掉jsp页面中所有代码。
4.jsp的九大内置对象
jsp中的内置对象,是指Tomcat服务器在翻译jsp页面成为Servlet源代码后,内部提供的九大对象。
对象名 | 说明 |
---|---|
request | 请求对象 |
response | 响应对象 |
pageContext | jsp的上下文对象 |
session | 会话对象 |
application | ServletContext对象 |
config | ServletConfig对象 |
out | jsp输出流对象 |
page | 指向当前jsp的对象 |
exception | 异常对象 |
5.jsp的四大域对象
对象名 | 所属类 | 说明 |
---|---|---|
pageContext | PageContextImpl类 | 当前jsp页面范围内有效 |
request | HttpServletRequest类 | 一次请求内有效 |
session | HttpSession类 | 一次会话范围内有效(浏览器打开到浏览器关闭) |
application | ServletContext类 | 整个web工程范围内都有效 |
- 域对象是可以像Map一样存取数据的对象,功能相同,不同的是它们对数据的存取范围。
- 四个域在使用时,优先顺序(范围从小到大)是:
- pageContext < request < session < application
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
//往四个域对象中存储数据
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>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--取四个域对象中的数据--%>
pageContext是否有值:<%=pageContext.getAttribute("key")%><br>
request是否有值:<%=request.getAttribute("key")%><br>
session是否有值:<%=session.getAttribute("key")%><br>
application是否有值:<%=application.getAttribute("key")%><br>
%>
</body>
</html>
6.out输出和writer输出的区别
-
writer中表示响应,经常用于设置返回给客户端的内容。
-
out也用来做输出操作。
-
由于jsp翻译之后,底层源代码都使用out来进行输出,所以一般情况下,在jsp页面中统一使用out进行输出,避免打乱页面输出内容的顺序。
-
out.write()——输出字符串。
-
out.print()——输出任意数据(转换成字符串后调用write输出)。
7.jsp的常用标签
jsp静态包含
- 格式:
<%@include file="/include/a.jsp"%>
- 说明:
- file属性是指定要包含的jsp页面路径。
- 特点:
- 不会翻译被包含的jsp页面;
- 本质是将被包含的jsp页面的代码拷贝到合适的位置执行输出。
jsp动态包含
- 格式:
<jsp:include page="/include/a.jsp">
<jsp:param name="username" value="a"/>
<jsp:param name="password" value="123"/>
</jsp:include>
- 说明:
- page属性指定要包含的jsp页面的路径。
- 特点:
- 将被包含的jsp页面翻译成Java代码;
- 动态包含可以传递参数。
jsp转发标签
- 格式:
<jsp:forward page="/a.jsp"></jsp:forward>
- 说明:
- page属性设置请求转发的路径。
8.jsp练习题
在jsp页面中输出九九乘法表
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--在 jsp 页面中输出九九乘法口诀表--%>
<h1 align="center">九九乘法口诀表<h1/>
<table align="center">
<%
for(int i = 1; i <= 9; i++) { %>
<tr>
<%
for(int j = 1; j <= 9; j++) { %>
<td><%=j + "*" + i + "=" + (i*j)%></td>
<%}%>
</tr>
<%}%>
</table>
</body>
</html>
jsp输出一个表格(存在10个学生信息)
- Student类:
public class Student {
private Integer id;
private String name;
private Integer age;
private String phone;
}
- SearchStudentServlet程序:
public class SearchStudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ArrayList<Student> studentList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
int t = i + 1;
studentList.add(new Student(t,"name"+t, 18+t,"phone"+t));
}
req.setAttribute("stuList", studentList);
req.getRequestDispatcher("/test/test2.jsp").forward(req, resp);
}
}
- showStudent.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
table{
border: 1px black solid;
width: 600px;
border-collapse: collapse;
}
td,th{
border: 1px black solid;
}
</style>
</head>
<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>删除、修改</td>
</tr>
<%}%>
</table>
</body>
</html>
9.Listener监听器
定义
- Java三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
- Listener监听器是JavaEE的规范(接口)。
作用
- 监听某种事物的变化,然后通过回调函数反馈给程序去做一些响应的处理。
ServletContextListener监听器
- 可以监听ServletContext对象的创建和销毁。
- ServletContext对象在web工程启动时被创建,在web工程停止的时候被销毁,监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈。
- 方法一:
//在ServletContext对象创建后马上调用,做初始化操作
public interface ServletContextListener extends EventListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("被创建");
}
}
- 方法二:
//在ServletContext对象销毁后调用
public interface ServletContextListener extends EventListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("被销毁");
}
}
- ServletContextListener监听器使用步骤:
- 编写一个类去实现ServletContextListener,实现其两个回调方法
public class MyServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("被创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("被销毁");
}
}
- 配置web.xml文件
<listener>
<listener-class>listener.MyServletContextListenerImpl</listener-class>
</listener>