文章目录
1 JSP的内置对象
1.1 JSP中的9个内置对象
JSP中的内置对象,指的是Tomcat在翻译JSP页面成为Servlet程序后,内部可供使用的9个对象,称为内置对象
回看一个JSP页面被翻译成Servelt程序的核心方法_jspService代码:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
final javax.servlet.jsp.PageContext pageContext;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
JSP的内置对象包含:
request 请求对象
response 响应对象
pageContext jsp的上下文对象
session 会话对象
application ServletContext对象
config ServletConfig对象
out jsp输出流对象
page 指向当前jsp的对象
exception 异常对象(需要在页面的page指令中开启 isError="true" 才能使用该对象)
在JSP页面中的表达式脚本和代码脚本都可以直接使用上述的对象
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>About_JSP</title>
</head>
<body>
<%=
request.getParameter("")
%>
<%=
out.print("xxx")
%>
<%
for(int index = 0; index < 10; index++) {
out.print(request.getParameter(""));
}
%>
</body>
</html>
1.2 JSP的4个域对象及其存取范围
域对象就是可以像Map一样存取数据,如ServletContext对象和request对象一样,JSP的9个内置对象中有4个具有域对象的功能,它们都可以用来存取数据,但是它们对数据的存取范围却不同
pageContext(PageContextImpl类)
其存取范围 当前jsp页面范围内有效
request(HttpServletRequest类)
其存取范围 一次请求有效
session(HttpSession类)
其存取范围 一个会话范围内有效(打开浏览器访问服务器 直到关闭浏览器)
application(ServletContext类)
其存取范围 整个web工程范围内都有效(只要web工程不停止 数据都在)
虽然4个域对象都可以存取数据,但是使用上却有优先顺序,在使用时优先级的选择从小到大
pageContext -> request -> session -> application
1.3 JSP中的out和response输出的区别
使用关于JSP的API,需要导入相关的依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
JSP页面通常通过out对象和response对象来向客户端返回内容
out对象
直接给用户的页面输出内容
response对象
设置返回给客户端的内容
使用out和response向页面中写数据:

上述JSP页面中先进行out.write(),再进行response.getWriter.write(),但是结果却是response.getWriter.write()的内容先出现,这是因为
out和response对象都具有自己的缓冲区,会先将数据存储到各自的缓冲区内,当JSP页面中所有代码执行完毕后,会
1,执行out.flush()操作,将out缓冲区中的数据写入到response缓冲区末尾
2,将response缓冲区内的数据全部写入到页面中
在JSP页面中,使用out.print()向页面输出数据最合适
2 JSP常用标签
2.1 包含
考虑如下的应用场景,一个网站由许多网页组成,每个网页的底部都有页脚的部分,用来显示版权,联系方式,友情链接等内容,如果现在需要增加一个友情链接,那么该网站中的所有组成网页中的页脚内容都需要修改
这样重复的修改是繁杂且无意义的,可以将页脚的内容抽出来,单独做成一个网页,让其余的网页引用这个页脚网页即可,这样只用修改页脚页面,就可以完成对所有网页页脚内容的维护,JSP可以通过静态包含/动态包含来完成

2.1.1 静态包含
<%@include file="xxx.jsp"%>
(如果出现响应码为500的情况,将包含页面和被包含页面的page指令统一即可)
静态包含的特点:
1,静态包含不会将被包含的页面翻译为Servlet程序
2,静态包含的本质是把被包含页面中的代码拷贝到
被包含页面中的预定位置直接输出
2.1.2 动态包含
<jsp:include page="xxx.jsp"></jsp:include>
动态包含和静态包含的效果相同,但实现原理不同
动态包含的特点:
1,动态包含会将被包含的页面翻译为Servlet程序
2,动态包含底层代码通过
JspRuntimeLibrary.include(request, response, "/include/xxx.jsp", out, false);实现
本质是包含页面将自己的9个内置对象传递到被包含页面中
被包含页面使用包含页面中的内置对象完成输出
3,动态包含还可以传递参数
<jsp:include page="/pageUp.jsp">
<jsp:param name="userName" value="coisini"/>
</jsp:include>
<%=request.getParameter("userName")%>
2.2 请求转发
<jsp:forward page="xxx.jsp"></jsp:forward>
其功能与request.getRequestDispatcher(“xxx”).forward(request, response); 相同
JSP中请求转发的使用:

863

被折叠的 条评论
为什么被折叠?



