1.什么是jsp,jsp的作用?
全称为java server pages,java的服务器页面。
主要作用:代替Servlet程序回传html页面的数据
原因:Servlet程序回传html页面是一件非常繁琐的事情,开发成本和维护成本极高。
2.jsp的本质是什么?
本质为一个Servlet程序(通过输出流来输出html页面数据)
3.jsp的三中语法
a)jsp头部的page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- language属性:jsp翻译后是什么语言文件
- contentType属性:表示jsp返回的数据类型是什么(一般为utf-8)
- pageEcoding属性:表示jsp页面本身的字符集(一般为utf-8)
- import属性:和Java源码一样,用于导包,导类
- autoFlush属性:设置当out输出流缓冲区满了后,是否自动刷新缓冲区,默认为true
- buffer属性:设置缓冲区大小(默认为8kb)
- errorPage属性:出错后自动跳转的页面,路径一般都是 / 开头
- isErrorPage属性:判断当前页面是否是错误页面,默认为false,为true可以获取异常信息
- session属性:设置访问当前jsp页面是否会创建HttpSession对象,默认是true
- extends属性:设置jsp翻译出来的java类默认继承类
b)jsp的常用脚本
1.声明脚本
格式:<%! 声明java代码 %>
作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类等
<body>
<%-- 1.声明类属性--%>
<%!
private Integer id;
private String name;
private static HashMap<String,String> map;
%>
<%-- 声明静态代码块--%>
<%!
static {
map = new HashMap<>();
map.put("key1","value1");
}
%>
<%-- 声明类方法--%>
<%!
public int abc(){
return 12;
}
%>
<%-- 声明内部类--%>
<%!
public class ABC{
private int a = 100;
}
%>
</body>
2.表达式脚本
格式: <%= 表达式>
作用:在jsp页面上输出数据。
特点:
- 表达式脚本都会被翻译到_jspService方法中
- 表达式脚本都会被翻译成为 out.print()输出到页面
- 因为表达式脚本都会被翻译到_jspService方法中,所以_jspService的对象中都可以使用
- 表达式脚本的表达式不能以分号结尾
<%-- 1.输出整型--%>
<%=12%><br>
<%-- 2.输出浮点型--%>
<%=12.12%><br>
<%-- 3.输出字符串--%>
<%="字符串"%><br>
<%-- 4.输出对象--%>
<%=map%>
3.代码脚本
格式:<% java语句 %>
作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
<%-- 1.if语句--%>
<%
int i = 12;
if(i == 12){
System.out.println("hahaha");
}else{
System.out.println("dididid");
}
%>
<%-- 2.for循环--%>
<%
for(int j=1;j<10;j++){
// System.out.println(j);
}
%>
<%-- 3.翻译后java文件中_jspService方法内的代码都可以写--%>
<%
String s = request.getParameter("username");
System.out.println(s);
%>
特点:
- 代码脚本翻译之后都在_jspService方法中
- 代码脚本由于翻译到_jspService()方法中,所以_jspService的对象中都可以使用
- 可以由多个代码脚本块组合完成一个完整的java代码
- 代码脚本可以和表达式代码一起组合使用,在jsp页面上输出数据
<table border="1" cellspacing="0">
<%
for (int k=1;k<10;k++){
%>
<tr>
<td>第<%=k%>列</td>
</tr>
<%
}
%>
</table>
c)jsp三种注释
1.html注释: <!-- html注释 -->
html注释会被翻译到java源代码中,在_jspServcie方法中,以out.writer输出到客户端。
2.java注释:<% //单行java注释, /**/多行java注释 %>
java注释会被翻译到java源代码中
3.jsp注释:<%-- jsp注释 --%>
jsp注释可以注掉jsp页面中的所有代码
4.jsp九大内置对象
jsp的内置对象,是指Tomcat翻译jsp页面后成为Servlet源代码后,内部提供的九大对象,叫内置对象。
- request 请求对象
- reponse 响应对象
- pageContext jsp的上下文对象
- session 会话对象
- application ServletContext对象
- config ServletConfig对象
- out 输出流对象
- page 指向当前jsp的对象
- exception 异常对象
5.jsp四大域对象
四个域对象分别是:
PageContext(PageContextIml类)当前jsp页面范围内有效
Request(HttpServletRequest类) 一次请求内有效
Session(HttpSession类) 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application(ServletContext类)整个Web工程都有效(只要Web工程不停止,数据都在)
域对象:可以向Map一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
四个域使用优先顺序:
pageContext ==> request ==> session ==> application
6.jsp 中的out输出和response.getWriter输出的区别
response中表示响应,常用于设置返回给客户端的内容(输出)
out也是给用户做输出使用的
<%
out.write("out输出1<br>"); //将out1写到out缓冲区
out.flush(); //将out1转出到response缓冲区
out.write("out输出2<br>"); //将out2写到out缓冲区
response.getWriter().write("response输出1<br>");
response.getWriter().write("response输出2<br>"); //将response1、2写到response缓冲区
//结束时 将out缓冲区的内容接到response区中
%>
一般使用out输出避免打乱输出顺序
out.writer()输出字符串没有问题
out.print()输出任意数据都没有问题
在jsp页面中可以统一使用out.print()输出
7.jsp常用标签
a)静态包含
<%@include file="/......"%> 就是静态包含 file属性指定要包含jsp页面的路径 第一个斜杠 / 表示为http://ip:port/工程路径 映射到代码的web目录 静态包含的特点: 1.静态包含不会翻译被包含的jsp页面 2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置输出
<body>
头部信息<br>
主题信息<br>
<%@include file="/include/foot.jsp"%>
<%--foot.jsp 页面:
<body>
尾部信息<br>
</body>
--%>
</body>
b)动态包含
<jsp:include page=""></jsp:include>就是动态包含 page属性指定要包含jsp页面的路径 第一个斜杠 / 表示为http://ip:port/工程路径 映射到代码的web目录 动态包含和静态包含一样就是把被包含的jsp页面的代码拷贝到包含的位置输出 动态包含的特点: 1.动态包含会把包含的jsp页面也翻译成java代码 2.动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出 3.动态包含还可以传递参数
动态包含的底层原理
<jsp:include page="/include/foot.jsp">
<jsp:param name="username" value="li"/>
<jsp:param name="password" value="123"/>
</jsp:include>
<body>
尾部信息<br>
<%=request.getParameter("username")%>
</body>
c)请求转发![](https://i-blog.csdnimg.cn/blog_migrate/8b8b100f5c0394d3e02f5dcabe67aec4.png)
<jsp:forword page="/..."></jsp:forword>
8.Listener监听器
1.Listener监听器是javaweb的三大组件之一,其他两个为Servlet程序,Filter过滤器
2.Listener是javaEE的规范,就是接口
3.作用是监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些对应处理
8.1、ServletContextListener 监听器
可以监听ServletContext对象的创建和销毁。
ServletContext对象在web工程启动时创建,在web工程停止时销毁。
监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈。
两个方法:
public interface ServletContextListener extends EventListener {
default void contextInitialized(ServletContextEvent sce) {
}
default void contextDestroyed(ServletContextEvent sce) {
}
}
如何使用ServletContextListener监听器监听ServletContext对象
使用步骤:
- 编写一个类实现ServletContextListener
- 实现两个回调方法
- 到web.xml中去配置监听器
public class MyServletListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Servletcontext对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了");
}
}
<listener>
<listener-class>com.Listener.MyServletListenerImpl</listener-class>
</listener>