文章目录
jsp指令
这篇文章非常详细:jsp指令
指令语法格式
<%@ 指令 属性名=“值” 属性名=“值”%> (多个属性可分开写,可写在一起)
JSP2.0规范中的三大指令:
- page
- include
- taglib
@page指令:
属性:
- import 导包
- errorPage 出错后跳转的页面,<%@ errorPage="/error/error.jsp"> 以"/"开头,相对于当前应用程序的根目录
- web.xml中使用标签对整个web应用设置错误处理界面
- isErrorPage 它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
@include
属性
- 属性只有一个file,<%@include file="/aaa/bbb/c.jsp" %>
- 静态包含,编译时将两个jsp编译成一个servlet
- 而RequestDispatcher的include()是一个方法,是两个servlet,只是响应的时候合并在了一起
- 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。
@taglib
- 属性:
- prefix:指定标签库在本页面中的前缀,由我们自己来起名字
- url:指定标签库的位置
- <%@taglib prefix=“x” url="/aaa/bbb"%> 前缀的用法:<s:text>
9大内置对象
这篇文章非常详细:jsp9大内置对象
jsp运行过程
JSP第一次运行时,会翻译成Servlet,所以第一次比较慢(第一次惩罚)。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
对应真身
真身中的代码:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this; // page即this
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true); // 获取pageContext
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
从这里开始,才是jsp页面内容
}...
类型和特点:
内置对象名 | 类型 | 作用 |
---|---|---|
pageContext | javax.servlet.jsp.PageContext | 页面上下文对象,一个顶8个 |
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | 可设置<%@ page session=“false”%>禁止当前jsp页面使用session |
application | javax.servlet.ServletContext | |
congfig | javax.servlet.ServletConfig | |
out | javax.servlet.jsp.JspWriter | 等同于response.getWrite(),向客户端发送文本数据 |
page | java.lang.Object | 即当前jsp页面的this |
exception | java.lang.Throwable | 只有在错误页面中会用到这个对象 |
几乎不用:
config
page
exception
不是每个jsp都能用:
exception
session
pageContext域对象
pageContext域对象,9大内置对象之一,一个顶9个,jsp专属域对象
4大域对象范围
Servlet有三大域对象,jsp有4个,
- pageContext
- jsp专有,范围最小,当前页面
- request
- 一次请求,即服务器跳转(转发)可以共享信息,客户端跳转(不是同一个请求了)不行
- session
- 一次会话,即一个用户共享信息,新开一个浏览器就不行了
- application
- 整个应用程序,即服务器属性,服务器关闭或重启就不行了
pageContext功能
域对象功能:老三样
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
代理其他域对象功能
- pageContext.setAttribute(“xxx”, “XXX”);
- pageContext.setAttribute(“xxx”, “XXX”, PageContext.REQUEST_SCOPE);
- pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
- pageContext.setAttribute(“xxx”, “XXX”, PageContext.APPLICATION_SCOPE);
以及:
- void setAttribute(String name, Object value, int scope):在指定范围中添加数据;
- Object getAttribute(String name, int scope):获取指定范围的数据;
- void removeAttribute(String name, int scope):移除指定范围的数据;
- Object findAttribute(String name):依次在page、request、session、application范围查找名称为name的数据,如果找到就停止查找。这说明在这个范围内有相同名称的数据,那么page范围的优先级最高!
获取其他内置对象:1个顶9个
- JspWriter
getOut()
:获取out内置对象;- ServletConfig
getServletConfig()
:获取config内置对象;- Object
getPage()
:获取page内置对象;- ServletRequest
getRequest()
:获取request内置对象;- ServletResponse
getResponse()
:获取response内置对象;- HttpSession
getSession()
:获取session内置对象;- ServletContext
getServletContext()
:获取application内置对象;- Exception
getException()
:获取exception内置对象;