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(请求间)

后端程序和页面之间有请求关系,则数据可以共享

java 作用域friendly javaweb作用域从小到大_前端

常用方法 

方法

 概述

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”;“秒数;跳转链接”)

定时跳转链接

 请求转发和重定向的区别 

java 作用域friendly javaweb作用域从小到大_重定向_02

java 作用域friendly javaweb作用域从小到大_java_03

如果要实现路径跳转,又要实现数据共享,建议使用请求转发;
如果只想要实现路径跳转,我们可以使用重定向;

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时,有两次请求

java 作用域friendly javaweb作用域从小到大_开发语言_04

 

java 作用域friendly javaweb作用域从小到大_前端_05

 返回session

java 作用域friendly javaweb作用域从小到大_java 作用域friendly_06

当加上test01.jsp时,只有一次请求

 

java 作用域friendly javaweb作用域从小到大_前端_07

java 作用域friendly javaweb作用域从小到大_前端_08