ServletContext:ServletContext代表当前web应用
Web容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext对象,代表当前web应用。
由于一个Web应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。
ServletContext对象通常也被称之为context域对象,在本Web应用中共用ServletContext对象。
ServletContext做为域对象可以在整个web应用范围内共享数据
ServletContext是一个全局的储存信息的空间,表示 Servlet 上下文对象;
一个 web 工程,只有一个 ServletContext 对象实例;
生命周期:当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁;
ServletContext的主要方法
void | setAttribute(String str,Object obj); |
Object | getAttribute(String str); |
void | removeAttribute(String str) ; |
作用域对象
作用域:变量能够起作用的区域
PageContext(当前页面)
只能当前页面定义数据,当前页面使用
request(请求间)
后端程序和页面之间有请求关系,则数据可以共享
常用方法
方法 | 概述 |
setAttribute( String name,Object obj ) | 设置属性以及属性值 |
getAttribute(String name) | 返回name的属性值,若不存在指定的属性,就返回null |
getParameter(String name) | 获取客户端用户传到服务端的参数值 |
removeAttribute(String name ) | 删除指定的属性 |
setCharacterEncoding(编码) | 指定getParameter接收的编码 |
session(当前会话)
是当前会话有效(同一个人使用同一个浏览器在任何页面都可以数据共享)
方法 | 概述 |
setAttribute( String name,Object obj ) | 设置属性以及属性值 |
getAttribute(String name) | 返回name的属性值,若不存在指定的属性,就返回null |
removeAttribute(String name ) | 删除指定的属性 |
application(应用程序)
是整个服务器有效,所有用户的请求都可以数据共享
方法 | 概述 |
setAttribute( String name,Object obj ) | 设置属性以及属性值 |
getAttribute(String name) | 返回name的属性值,若不存在指定的属性,就返回null |
removeAttribute(String name ) | 删除指定的属性 |
response对象
作用:页面重定向
方法 | 描述 |
SendRedirect(“跳转链接” | 跳转本地链接和超链接 |
setHeader(“refresh”;“秒数”) | 自动刷新 |
setHeader(“refresh”;“秒数;跳转链接”) | 定时跳转链接 |
请求转发和重定向的区别
如果要实现路径跳转,又要实现数据共享,建议使用请求转发;
如果只想要实现路径跳转,我们可以使用重定向;
1、请求转发是服务器行为、重定向是客户端浏览器行为;
2、请求转发是request对象调用方法、重定向是response对象调用方法;
3、请求转发只有一次请求可以实现request域对象中的数据共享;重定向是多次请求、多次响应;
4、请求转发的效率高于重定向;请求转发地址栏不变,重定向地址栏发生变化;
5、请求转发是服务器内部的行为,所以只能访问服务器内部资源;重定向是浏览器行为,地址栏会变,所以可以访问服务器外部资源;
Test01.java
package com.su.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/test01")
public class Test01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.PageContext
//2.request
request.setAttribute("name","request");
//3.session
HttpSession session = request.getSession();
session.setAttribute("name","session");
//4.application
ServletContext servletContext = request.getServletContext();
servletContext.setAttribute("name","servletContext");
//请求转发
//request.getRequestDispatcher("test01.jsp").forward(request,response);
//重定向
response.sendRedirect("test01.jsp");
}
}
test01.jsp
<html>
<head>
<title>作用域对象测试</title>
</head>
<body>
<h1>test01.jsp</h1>
<!-- EL表达式获取作用域对象的顺序是pageContext(当前页面)、request(请求间)、session(当前会话)、application(应用程序) -->
<%
//pageContext.setAttrbute("name","pageContext");
%>
<h2>
pageContext只能当前页面定义数据,当前页面使用;<br>
request后端程序和页面之间有请求关系,则数据可以共享;<br>
session是当前会话有效(同一个人使用同一个浏览器在任何页面都可以数据共享);<br>
application是整个服务器有效,所有用户的请求都可以数据共享;
</h2>
<%!
int n =1;
%>
<%
n++;
application.setAttribute("count",n);
%>
${name}
</body>
</html>
test02.jsp
<html>
<head>
<title>作用对象测试</title>
</head>
<body>
<h1>test02.jsp</h1>
${name}
</body>
</html>
当加上test01时,有两次请求
返回session
当加上test01.jsp时,只有一次请求