jsp 页面和 html 页面一样,都是存放在 web 目录下,访问也和访问 html 页面一样。
jsp 页面本质上是一个 Servlet 程序。
当第一次访问 jsp 页面的时候,Tomcat 服务器会把 jsp 页面翻译成为一个 java 源文件,并且将它编译成为 .class 字节码程序。
jsp 的 page 指令可以修改 jsp 页面中的一些重要的属性,或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>language 属性 :表示 jsp 翻译后是什么语言文件。暂时只支持 java。
contentType 属性 : 表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType()参数值
pageEncoding 属性 : 表示当前 jsp 页面文件本身的字符集。
import 属性 : 跟 java 源代码中一样。用于导包,导类。
autoFlush 属性 : 设置当 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true
buffer 属性 : 设置 out 缓冲区的大小。默认是 8kb
autoFlush 和 buffer 属性是给 out 输出流使用
errorPage 属性 : 设置当 jsp 页面运行时出错,自动跳转去的错误页面路径。errorPage 表示错误后自动跳转去的路径,这个路径一般都是以斜杠开头,它表示请求地址为 http://ip:port/工程路径/
isErrorPage 属性 : 设置当前 jsp 页面是否是错误信息页面。默认是 false。如果是 true 可以 获取异常信息。
session 属性 : 设置访问当前 jsp 页面,是否会创建 HttpSession 对象。默认是 true。
extends 属性 : 设置 jsp 翻译出来的 java 类默认继承谁。
声明脚本的格式是:<%! 声明 java 代码 %> 作用:可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块、内部类等。
代码示例:
<body> <%--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 abc = "abc"; } %> </body>java 注释会被翻译到 java 源代码中。
jsp 注释可以注释掉 jsp 页面中所有代码。
jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九个对象,叫内置对象。
scope.jsp 代码示例:
<%@ 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>scope2.jsp 代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>scope2.jsp页面</h1> pageContext 域是否有值:<%=pageContext.getAttribute("key")%><br> request 域是否有值: <%=request.getAttribute("key")%> <br> session 域是否有值:<%=session.getAttribute("key")%> <br> application 域是否有值: <%=application.getAttribute("key")%> <br> </body> </html>response 表示响应,经常被用于设置返回给客户端的内容(输出),out也是给用户做输出使用的。
由于 jsp 翻译之后,底层源码都是使用 out 来进行输出,所以一般情况下,我们在 jsp 页面中统一使用 out 来进行输出。避免打乱页面输出内容的顺序。
out.write() 输出字符串没有任何问题 out.print() 输出任意数据都没有问题(都转换成为字符串后调用 write 输出)在 jsp 页面中,可以统一使用 out.print() 来进行输出
代码示例:
<jsp:include page="/include/footer.jsp"> <jsp:param name="username" value="obj"/> <jsp:param name="password" value="root"/> </jsp:include>动态包含的底层原理:
ServletContextListener 可以监听 ServletContext 对象的创建和销毁。 ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。 监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
public interface ServletContextListener extends EventListener{ /** * 在 ServletContext 对 象 创 建 之 后 马 上 调 用 , 做 初 始 化 */ public void contextInitialized(ServletContextEvent sce); /** * 在 ServletContext对 象 销 毁 之 后 调 用 */ public void contextDestroyed(ServletContextEvent sce); }代码示例:
public class MyServletContextListenerImpl implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("ServletContext 对象被创建了"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("ServletContext 对象被销毁了"); } }web.xml 中的配置:
<!--配置监听器--> <listener> <listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class> </listener>