JSP小知识
-
什么是JSP
JSP是专门为了解决动态生成HTML文档的技术
-
JSP运行原理
JSP的本质其实是一个servlet程序
我们创建了一个a.jsp文件,发现每个jsp都被翻译成Java文件,而这个类继承于HttpJspBase,HttpJspBase类又继承HttpServlet类
JSP语法
-
page指令介绍(一般不做修改,默认即可)
- language属性:值只能是Java,表示翻译得到的是Java语言
- contentType属性:设置响应头contentType的内容
- pageEncoding属性:设置当前jsp页面的编码
- import属性:给当前jsp页面导入需要使用的类包
- autoFlush属性:设置是否自动刷新out缓冲区,默认为true
- buffer属性:设置out的缓冲区大小,默认为8kb
- errorPage属性:设置当前jsp页面发生错误后,需要跳转的页面
- isErrorPage属性:设置当前jsp页面是否是错误页面,是的话就可以使用exception异常对象
- session属性:设置当前jsp页面是否获取session对象,默认是true
- extend属性:给服务器厂商预留的jsp默认翻译的servlet继承于什么类
<!-- 这是jsp文件头部声明 --> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
jsp三种脚本介绍
-
声明脚本
<%--1.可以定义全局变量。--%> <%! public Integer a = 123; private String name = "Tom"; private static HashMap<String,String> map; %> <%--2.定义 static 静态代码块--%> <%! static { map = new HashMap<String,String>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); } %> <%--3.定义方法--%> <%! public void test(){ System.out.println("这是定义的方法"); } %> <%--4.定义内部类--%> <%! class A{ public int a = 12; } %>
-
表达式脚本
- 表达式脚本用于向页面输出内容
- 表达式脚本翻译到servlet程序的service方法中,以out.print()打印输出
- out是jsp的一个内置对象,用于生成html的源代码
<%=12%> <%=12.12%> <%="我爱中国"%> <%=map%>
-
代码脚本
- 代码脚本里可以写任意的Java语句
- 代码脚本中的内容会被翻译到service方法中
<% int a = 12; if(a==12){ System.out.println("是的"); }else { System.out.println("不是的"); } %> <!--可以通过嵌套的方法在页面输出--> <% for (int i = 0; i < 10; i++) { %> <%=i%><br> <% } %>
-
JSP中的九大内置对象
-
request:请求对象
-
response:响应对象
-
pageContext:当前页面上下文对象
-
session:会话对象
-
exception:异常对象,只有将当前页面的isErrorPage属性设置成true才会存在
-
application:ServletContext对象实例,可以获取整个工程的一些信息
-
config:ServletConfig对象实例,可以回去Servlet的配置信息
-
out:输出流对象
-
page:表示当前Servlet对象实例
四大域对象
九大内置对象中,有四大域对象,域对象可以像map一样存储键值对,以下四个域对象,效果相同,差别只是在于存储数据的范围不同。四个域对象我们使用的优先级应该从小到大,避免占用内存。
- pageContext:保存的数据可以在同一个jsp页面中使用
- request:保存的数据可以在同一个请求中使用
- session:保存的数据可以在同一个会话中使用(会话:从浏览器打开开始,一直到浏览器关闭结束)
- application:存储数据的范围在同一次部署中
out输出与response输出的区别
response.getWriter().write()和out.write()都可以在浏览器页面上进行输出。
out输出会先将输出的内容保存在out缓冲区中,response输出会将输出的内容保存在response缓冲区中,当所有代码执行完毕,会调用out.flush()方法,将out缓冲区中的内容更新到response缓冲区最下面,最后会执行response刷新操作,把response缓存区的数据传到浏览器中
那么我们在输出的时候,通常使用out输出,因为底层代码使用的是out输出,如果使用response输出可能会导致数据混乱
out.write()与out.print()的区别
out.write()和out.print()都可以在浏览器上输出内容。输出字符串时,两者输出都是正常的,当输出整型时write()方法会出现错误,这是为什么呢?
看一下write()的底层实现代码,注意一下一段语句,是将int类型强转成char类型,我们知道这虽然不会报错,但无法得到我们想要的数据,而print()的底层实现代码,无论传参是什么类型的数据,都先转换成string型,在调用out.write()进行输出。
所以我们在使用out进行输出时,请使用out.print()
public void write(int c) throws IOException {
synchronized (lock) {
if (writeBuffer == null){
writeBuffer = new char[WRITE_BUFFER_SIZE];
}
writeBuffer[0] = (char) c; //注意这一段
write(writeBuffer, 0, 1);
}
}
JSP中的常用标签
-
静态包含(常用)
先举个例子,讲述一下什么叫做包含:一个网站中,底部信息几乎都是一样的,如果我们一个一个页面写过去,后期维护会非常麻烦,所以引入包含的技术,将底部信息维护到一个页面中,在需要的地方调用即可。
特点
- 包含页面不会生成.java文件
- 包含文件内容是以out.write()输出的
<%--主体页面--%> <body> 头部信息<br> 主题内容<br> <%--底部信息(静态包含)--%> <%@include file="/include/footer.jsp"%> </body> <%--包含页面--%> <body> 这里是底部信息 </body>
-
动态包含
特点
- 包含页面也会生成对应的.Java文件
- 包含文件的内容是主体页面调用JspRuntimeLibrary.include 方法
- 可以传参,并在包含页面获取参数
<jsp:include page="/include/footer.jsp" > </jsp:include>
-
页面转发(常用)
我们之前使用的请求转发都是调用request.getRequestDispatcher("/xxxx.jsp").forward(request, response),在JSP中可以使用如下方法代替其功能。
<jsp:forward page=""></jsp:forward>
Listener监听器
-
什么是Listener监听器
Listener监听器是Javaweb三大组件之一,三大组件分别是Servlet程序、Filter过滤器、Listener监听器。
-
作用
Listener监听器可以监听某些事物的变化,然后通过回调函数,反馈给程序做一些相对应的处理
-
如何使用?
- 创建一个类实现ServletContextListener接口
- 重写里面的方法
- 在web.xml文件中配置Listener
public class MyListener implements ServletContextListener { @Override //此方法是监听servlet程序启动时 public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("web程序启动"); } @Override //此方法时监听servlet程序停止时 public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("web程序销毁"); } }
配置web.xml
<listener> <!--listener-class是配置文件路径--> <listener-class>com.yellowstar.listener.MyListener</listener-class> </listener>