ServlertContext
1、ServletContext代表着整个JavaWeb应用,每个项目只有唯一的ServletContext的实例。
2、生命周期
服务器启动时创建
服务器关闭时销毁
3、获取ServletContext对象:从ServletConfig对象的getServletContext方法得到
方式1:通过ServletConfig来获取ServeltContext
//获取ServletContext的引用
public class ServletDemo1 extends HttpServlet {
//获取ServletConfig
private ServletConfig config; public void init(ServletConfig config) throws ServletException {
this.config = config;
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取servletContext
ServletContext sc = config.getServletContext();
sc.setAttribute("p", "abc"); //获取全局参数
System.out.println(sc.getInitParameter("encoding")); System.out.println("Demo1:"+sc);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }
方式2:直接获取,推荐
public class ServletDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ServletContext
ServletContext sc = this.getServletContext();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
4、ServletContext对象的核心API
java.lang.String getContextPath() --得到当前web应用的路径(就是运行的项目名称)
public class ContextDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.得到ServletContext对象
//ServletContext context = this.getServletConfig().getServletContext();
ServletContext context = this.getServletContext(); //(推荐使用)
//2.得到web应用路径 /Demo
/**
* web应用路径:部署到tomcat服务器上运行的web应用名称
*/
String contextPath = context.getContextPath();
System.out.println(contextPath);
/**
* 案例:应用到请求重定向
*/
response.sendRedirect(contextPath+"/index.html");
}
}
--得到web应用的初始化参数
java.lang.String getInitParameter(java.lang.String name) 根据初始化参数名字得到参数的值
java.util.Enumeration getInitParameterNames() 获取所有参数的值
注意:初始化参数配置在web.xml文件中。用<context-param>标签,web应用参数可以让当前web应用的所有servlet获取!!!
<!-- 配置web应用参数 -->
<context-param>
<param-name>AAA</param-name>
<param-value>AAA's value</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>BBB's value</param-value>
</context-param>
<context-param>
<param-name>CCC</param-name>
<param-value>CCC's value</param-value>
</context-param>
代码:
/**
* 得到web应用参数
*
*
*/
public class ContextDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到SErvletContext对象
ServletContext context = this.getServletContext(); //根据初始化参数的名字得到初始化参数的值:java.lang.String getInitParameter(java.lang.String name)
String gp =sc.getInitParameter("AAA");
System.out.println(gp); //获取所有初始化参数 java.util.Enumeration getInitParameterNames()
Enumeration<String > en =sc.getInitParameterNames();
//遍历
while(en.hasMoreElements()){
String paramterName = en.nextElement();
String paramterValue = sc.getInitParameter(paramterName);
System.out.println(paramterName+":"+paramterValue);
}
//尝试得到ConfigDemo中的servlet参数
String path = this.getServletConfig().getInitParameter("path");
System.out.println("path="+path);
} }
域对象有关的方法
void setAttribute(java.lang.String name, java.lang.Object object) 保存数据
java.lang.Object getAttribute(java.lang.String name) 等到数据
void removeAttribute(java.lang.String name) 移除数据
域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。
ServletContext就是一个域对象!!!!
ServletContext域对象:作用范围在整个web应用中有效!!!
/**
* 保存数据
*
*
*/
public class ContextDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.得到域对象
ServletContext context = this.getServletContext(); //2.把数据保存到域对象中
//context.setAttribute("name", "eric");
context.setAttribute("student", new Student("jacky",20));
System.out.println("保存成功");
} } class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
} }
=============================================
/**
* 获取数据
*
*
*/
public class ContextDemo4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.得到域对象
ServletContext context = this.getServletContext(); //2.从域对象中取出数据
//String name = (String)context.getAttribute("name");
Student student = (Student)context.getAttribute("student");
//System.out.println("name="+name); System.out.println(student);
} }
转发
RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
/**
* 转发(效果:跳转页面)
*
*
*/
public class ForwardDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { /**
* 保存数据到request域对象
*/
request.setAttribute("name", "rose"); //转发
/**
* 注意:不能转发当前web应用以外的资源。getRequsertDispatcher后面的路径必须以“/“开头,目标servlet的访问路径
*/
/*RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet");
rd.forward(request, response);*/
this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response);
} }
=================================
public class GetDataServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { /**
* 从request域对象中获取数据
*/
String name = (String)request.getAttribute("name");
System.out.println("name="+name);
} }
===============================================================
public class RedirectDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 保存数据到request域对象
*/
request.setAttribute("name", "rose");
//重定向
/**
* 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。
*/
//response.sendRedirect("/demo11/adv.html");
response.sendRedirect("/demo/GetDataServlet");
}
}
转发与重定向的区别:
1)转发
a)地址栏不会改变
b)转发只能转发到当前web应用内的资源
c)可以在转发过程中,可以把数据保存到request域对象中
2)重定向
a)地址栏会改变,变成重定向到地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能再重定向的过程,把数据保存到request中。
结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!
得到web应用的资源文件
java.lang.String getRealPath(java.lang.String path) 返回资源文件的绝对路径
java.io.InputStream getResourceAsStream(java.lang.String path) 得到资源文件,返回的是输入流
/**
* 读取web应用下的资源文件(例如properties)
* @author APPle
*/
public class ResourceDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* . 代表java命令运行目录。java运行命令在哪里?? 在tomcat/bin目录下
* 结论: 在web项目中, . 代表在tomcat/bin目录下开始,所以不能使用这种相对路径。
*/ //读取文件。在web项目下不要这样读取。因为.表示在tomcat/bin目录下
/*File file = new File("./src/db.properties");
FileInputStream in = new FileInputStream(file);*/ /**
* 使用web应用下加载资源文件的方法
*/
/**
* 1. getRealPath读取,返回资源文件的绝对路径
*/
/*String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
System.out.println(path);
File file = new File(path);
FileInputStream in = new FileInputStream(file);*/ /**
* 2. getResourceAsStream() 得到资源文件,返回的是输入流
*/
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties prop = new Properties();
//读取资源文件
prop.load(in); String user = prop.getProperty("user");
String password = prop.getProperty("password");
System.out.println("user="+user);
System.out.println("password="+password); } }
补充: web应用的路径问题
/**
* web应用中路径问题
*
*
*/
public class PathDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//目标资源: target.html
/**
* 思考: 目标资源是给谁使用的。
* 给服务器使用的: / 表示在当前web应用的根目录(webRoot下)
* 给浏览器使用的: / 表示在webapps的根目录下
*/
/**
* 1.转发
*/
//request.getRequestDispatcher("/target.html").forward(request, response); /**
* 2.请求重定向
*/
//response.sendRedirect("/demo/target.html"); /**
* 3.html页面的超连接href
*/
response.getWriter().write("<html><body><a href='/demo/target.html'>超链接</a></body></html>"); /**
* 4.html页面中的form提交地址
*/
response.getWriter().write("<html><body><form action='/demo/target.html'><input type='submit'/></form></body></html>");
} }
ServlertContext的更多相关文章
- JavaWeb中读取文件资源的路径问题
在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存 ...
- JavaWeb中读取文件资源的路径问题 -- 转自新浪博客
在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存 ...
- Spring和SpringMVC整合及关系
SpringMVC扼要的讲,就是控制请求和处理.有必要将Spring和SpringMVC整合,否则仅配置SpringMVC并完成Spring的功能,会造成业务逻辑混乱. 简要总结:①原理:采用监听器, ...
随机推荐
- 李治军老师操作系统课程资源分享(视频+pdf)
最近别人推荐,看看了哈工大的李治军老师主讲的操作系统,李治军老师通过linux0.11内核源码的讲解,学习了很多,更加形象了解了理论知识. 分享给大家,有pdf 链接:https://pan.baid ...
- What's the difference between 'Even if' and 'Even though'?
为一个英语词组语法写一篇Blog: even if 与 even though 这两个词组大致意思相当,但强调的侧重有所不同. even if与even though的区别: even if一般引导的 ...
- 软件工作考核项(zcl)——
注意:这里没有对代码风格做要求,因为要代码走查! 考核项 考核标准 分数等级 需求规格说明书编写 主要用例图缺失 -1 主要软件界面设计图缺失 -1 主要功能清单项目缺失 -1 主要复 ...
- php异常处理类
<?php header('content-type:text/html;charset=UTF-8'); // 创建email异常处理类 class emailException extend ...
- smarty变量调节器与函数
smarty自带了一些变量调节器与内置函数,都在libs/plugins目录下,变量调节器以modifier开头,函数以function开头,而且我们可以自定义变量调节器与函数,熟练运用之后会极大地提 ...
- loadrunder脚本篇——执行操作系统命令
思路: 用loadrunner system()函数 函数原型: int system( const char *string ); 示例一:在指定目录下创建指定文件 Action() { char ...
- PHPExcel读写封装
<? require_once ('inc/PHPExcel/PHPExcel/IOFactory.php'); /** * @author lgl * 使用实例 * $fieldMap=['昵 ...
- 【HackerRank】Median
题目链接:Median 做了整整一天T_T 尝试了各种方法: 首先看了解答,可以用multiset,但是发现java不支持: 然后想起来用堆,这个基本思想其实很巧妙的,就是维护一个最大堆和最小堆,最大 ...
- qt5.4.1的imx6编译
2.到https://download.qt.io/archive/qt/5.4/5.4.1/single/下载源码包qt-everywhere-opensource-src-5.4.1.tar.gz ...
- 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】
转载地址:http://m.blog.csdn.net/blog/u010489766/9229011 题目链接:http://poj.org/problem?id=1276 题意:机器里面共有n种面 ...