九大内置对象
无需在jsp中声明即可使用的9个对象
* out(JspWriter):等同与response.getWriter(),用来向客户端发送文本数据;
* config(ServletConfig):对应“真身”中的ServletConfig;* page(当前JSP的真身类型):当前JSP页面的“this”,即当前对象,引用为Object类型;
* exception(Throwable):只有在错误页面中可以使用这个对象;
* request(HttpServletRequest):即HttpServletRequest类的对象;
* response(HttpServletResponse):即HttpServletResponse类的对象;
* application(ServletContext):即ServletContext类的对象;
* session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,
如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session。
* pageContext(PageContext):页面上下文对象、域对象,一个顶九个;
.....................................................................................................................................
这些对象可以在JSP页面中调用,而不需要事先定义,这使得JSP编程更加的方便和快捷。其实这些内置对象都对应着某个Servlet类,在JSP被翻译成Servlet之后,这些内置对象会相应转换成对应的类实例。
JSP中使用到的内置对象主要有如下九个:
request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page
“exception” 对象则代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP文件中使用。
JSP中有四大域对象
> application:整个应用程序
> session:整个会话(一个会话中只有一个用户)
> request:一个请求链!
> pageContext:ageContext类型
* 域对象:只在当前jsp页面中有效的域,通常用来让jsp与当前jsp中标签之间共享数据
* 获取其他8个内置对象:可以获取其他8个内置对象
* 代理其他域对象:可以用pageContext来操作其他3个域。
(1)<%=request.getParameter(
"myname"
)%>
(2)
<%
String pg = request.getParameter(
"pg"
);
//获取传递参数pg
if
(
"1"
.equals(pg))
//如果pg等于1
response.sendRedirect(
"hello.jsp"
);
//则页面重定向为hello.jsp
else
if
(
"2"
.equals(pg))
//如果pg等于2
response.sendRedirect(
"goodbye.jsp"
);
//则页面重定向为goodbye.jsp
else
//否则不进行页面重定向,即还显示本页
out.println(
"没有进行页面重定向"
);
%>
(3)
<%
String username = request.getParameter(
"username"
);
//获得传递参数username
session.setAttribute(
"theusername"
,username);
//把用户名保存在session中,String可以当着对象
%>
(4)
<%
out.println(
"<h4>设置数值</h4>"
);
application.setAttribute(
"name"
,
"zzb"
);
//把字符串“zzb”对象保存在application中
application.setAttribute(
"counter"
,
"1"
);
//把字符串值“1”保存在application中
out.println(
"set name=zzb"
);
out.println(
"set counter=1"
);
%>
(5)
<%
for
(int i=0;i<135;i++)
//迭代输出
Out.println(“Hello world, “+i+” “);
%>
......................................................................................................
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
语法:${隐式对象名称} :获得对象的引用
隐含对象名称 | 描 述 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表session域中用于保存属性的Map对象 |
applicationScope | 代表application域中用于保存属性的Map对象 |
param | 表示一个保存了所有请求参数的Map对象 |
paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] |
header | 表示一个保存了所有http请求头字段的Map对象 |
headerValues | 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] |
cookie | 表示一个保存了所有cookie的Map对象 |
initParam | 表示一个保存了所有web应用初始化参数的map对象 |
例子
${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> 。也就是取出部署的应用程序名或者是当前的项目名称
比如我的项目名称是demo1在浏览器中输入为http://localhost:8080/demo1/a.jsp
${pageContext.request.contextPath}或<%=request.getContextPath()%>取出来的
就是/demo1,而"/"代表的含义就是http://localhost:8080
故有时候项目中这样写${pageContext.request.contextPath}/a.jsp
1.1 pageContext
<%
pageContext.setAttribute("name", "aaaa");
%>
${name} <!--取出pageContext里面的name属性-->
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
1.2 sessionScope
<%
session.setAttribute("user", "");
%>
<!--获取session里面的值,与pageContext有点区别-->
${sessionScope.user==null ?"您没有登录":"欢迎您," }${user }
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
1.3 requestScope
<%
request.setAttribute("age", "20");
%>
<!--获取reqeust里面的值,与pageContext有点区别-->
${requestScope.age}
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
1.4 param 和paramValues 取地址栏参数
http://127.0.0.1:8080/day10/04param.jsp?name=junjiex&age=10&age=20
<!--获取name-->
${param.name }
<!--获取age数组-->
${paramValues.age[0] }<!--得到10-->
${paramValues.age[1] }<!--得到20-->
...................................................................................................................
何为作用域
先让我们看看效果:
大概流程是这样的,我们访问index.jsp的时候,分别对pageContext, request, session,application四个作用域中的变量进行累加。(当然先判断这个变量是不是存在,如果变量不存在,则要把变量初始化成1)。计算完成后就从index.jsp执行forward跳转到test.jsp。在test.jsp里再进行一次累加,然后显示出这四个整数来。
从显示的结果来看,我们可以直观的得出结论:
page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了。
request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。
session和application里的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。
application里的变量一直在累加,除非你重启tomcat,否则它会一直变大。
作用域规定的是变量的有效期限
如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。
从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。
如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。
所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。
如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。
所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。
如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。
整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。
application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
与上述三个不同的是,application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的,page, request,session都是完全隔离的,无论如何修改都不会影响其他人的数据。
https://blog.csdn.net/zhangzeyuaaa/article/details/44560921
https://blog.csdn.net/u012068523/article/details/46794027
https://blog.csdn.net/kyi_zhu123/article/details/54381221