ServletContext对象(每个工程只有一个此对象)

一】重点方法:
        1》存取对象
                        void setAttribute(String name, Object object);//将object存入ServletContext对象中,并取名为name(方便取出,与Map类似)
                        Object getAttribute(String name);//获取name对应的对象
        2》解析web.xml中<context-param>标签
                        String getInitParameter(String name);//获取name标签对应的标签值
                        Enumeration getInitParameterNames();//获取所有的标签名,可以用于遍历标签值
        3》请求转发器(用于转发网页)
                        RequestDispatcher getRequestDispatcher(String path);//获取指向特定资源的一个转发器
                        void forward(ServletRequest request, ServletResponse response);//调用转发器指向的资源,并进行转发
                
    二】总结:
            1)在web应用中,由服务器创建的唯一的一个对象是ServletContext
            2)ServletContext对象在每个Servlet对象中取得的都是相同的
            3)ServletContext对象有存取方法:
                        void setAttribute(String name, Object object);//将object存入ServletContext对象中,并取名为name(方便取出,与Map类似)
                        Object getAttribute(String name);//获取name对应的对象

二、ServletContext对象有如下应用:
        一】多个Servlet对象可以通过ServletContext对象共享数据
            1》第一个Servlet对象:设置值
                    //取得客户端的请求参数
                    String username = request.getParameter("username");
                    //取得这个工程的唯一一个ServletContext对象
                    ServletContext sc = this.getServletContext();
                    //将信息存入ServletContext对象
                    sc.setAttribute("USERNAME", username);
            2》第二个Servlet对象:取出值
                    //取得唯一一个ServletContext对象
                    ServletContext context = this.getServletContext();
                    //获取ServletContext对象内容
                    String username = (String) context.getAttribute("USERNAME");
                    response.getOutputStream().write(("用户名="+username).getBytes());
                    
                    
        二】在web引用中,可以取得web应用的初始化参数
                    
                1》web.xml部分
                            <context-param>
                                <param-name>邮箱</param-name>
                                <param-value>434507250</param-value>
                            </context-param>
                            <context-param>
                                <param-name>电话号码</param-name>
                                <param-value>18381330428</param-value>
                            </context-param>
                2》Servlet对象部分
                    ServletContext context = this.getServletContext();
                    String email = context.getInitParameter("邮箱");
                    String tel = context.getInitParameter("电话号码");
                    
                    if(email!=null && tel!=null ){
                        response.setContentType("text/html;charset=utf-8");
                        response.getWriter().write("邮箱:"  +email + "<br />");
                        response.getWriter().write("电话号码" + tel + "<br />");
                    }
                
        
        三】ServletContext能够实现转发功能,即307+location。
                步骤:
                    1》获取一个ServletContext对象
                    2》获取一个定位到指定资源的转发器
                    3》利用转发器进行调度,并进行转发
        
                code:
                    // 1,获取指向fail.html的定位器
                        RequestDispatcher rd = context.getRequestDispatcher("/success.html");
                    // 2,利用此定位器进行转发
                        rd.forward(request, response);
        四】利用ServletContext对象读取资源文件--默认目录为:工程(应用)路径
                重点方法:
                        InputStream getResourceAsStream("文件路径");
                code:
                    ServletContext context = this.getServletContext();
                    InputStream is = context.getResourceAsStream("/doc/config.properties");// /代表的当前应用(工程)
                    Properties props = new Properties();
                    props.load(is);
                    System.out.println(props.getProperty("email"));
                    
                注意:
                        1》用传统方式读取文件的时候,是以相对于tomcat\bin的目录下访问的
                        2》如果以ServletContext方式读取资源文件(text/xml/properties),是相对于web服务器的当前web应用(工程)目录而言的
                                此时/:表示当前web应用(工程),即:day06
        五】通过类加载器加载文件:默认目录为WEB-INF/classes/
                注意:
                    1》类加载器只能加载IDE工具下src目录下的资源文件,其它目录无法加载。            
                    2》默认的路径为WEB-INF/classes/目录,即:此时/表示:/WEB-INF/classess/目录
                重点方法:
                    1》获得类加载器(    Class对象的方法)
                        ClassLoader getClassLoader();
                    2》获取资源输入流
                        ClassLoader getResourceAsStream(String name);
                步骤:
                    1》取得当前对象的字节码对象
                        Class clazz = this.getClass();
                    2》取得当前对象的类加载器
                        ClassLoader cl = clazz.getClassLoader();
                    3》通过类加载器加载资源
                        InputStream is = cl.getResourceAsStream("资源路径");
                code:
                        //1,获取当前对象的字节码对象
                        Class clazz = this.getClass();
                        //2,返回当前对象的类加载器
                        ClassLoader cl = clazz.getClassLoader();
                        //3,根据类加载器获取输入流
                        InputStream is = cl.getResourceAsStream("/cn/itcast/web/Servlet/config.properties");

六】将资源文件在工程中的路径转换成真实路径
            使用ServletContext()对象的String getRealPath("工程路径");方法;
            code:
                String path = this.getServletContext().getRealPath("/doc/abc.txt");
                File file = new File(path);

时间: 2024-11-03 05:21:56

ServletContext对象(每个工程只有一个此对象)的相关文章

返回一个集合对象,同时这个集合的对象的属性又是一个集合对象的处理方法(ViewModel)

如果遇到需要返回一个集合对象,其中该集合中的属性又是一个集合.第一种:可在考虑用外键关联,比如在控制器中可以采用预先加载的方式加载关联的数据,比如 RoleManager.Roles.Include<x =>r.Users>.ToList(); 第二种 可以考虑使用视图模型ViewModel的方式.第二种方式的适用范围更加广泛,第一种方式使用较为简单,但使用的场合有限. 一.建立视图模型 ViewModel public class IndexRoleViewModel { public

解决javaassist 出现的类没找到异常ClassNotFoundException,获取工程下任意class对象

项目中要对工程下任意class文件进行解析,但是使用javaassist中经常出现类没找到异常.当然最主要的还是ClassPool()没找到这东西,而搜索范围是整个项目的class, 所以就做了一个处理,通过,项目下的classpath这个文件,获取所有jar路径在,再通过文件递归搜索获取所有java编译后的class文件路径,将所有路径都添加到对象池中.当然这一步是很费时的,所以最好只初始化一次. /*** * * 静态存储 */ private static ClassPool pool;

php 中如何创建一个空对象

// 创建一个空对象 $obj=(object)array(); //假设这是从数据库取内容 $arr=["prod_id"=>103,"prod_name"=>"黑客技术从入门到入狱"]; // 遍历数组,并且填充进对象中 foreach($arr as $k=>$v) $obj->$k=$v;

Unity3d修炼之路:加载一个预制体,然后为该对象添加组件,然后查找对象,得到组件。

#pragma strict function Awake(){ //加载一个预制体 资源必须在 Resources文件夹下 Resources.LoadLoad(); //加载后 必须示例化 GameObject.Instantiate(); //为对象添加组件 AddComponent(); //Find游戏对象 Find(); //Get组件 GetComponent(); var pPrefab : GameObject = Resources.Load("Prefab/Scence&q

C++静态变量本身可否是一个实例对象

一般书上总是用int来举例,那个太简单.如果静态变量本身可否是一个实例对象呢?应该是可以,但是这样涉及到它的构造函数以及它内部的静态变量如何初始化两个问题,换而言之,这个静态变量本身应该如何初始化?这个问题和单例模式有些关系,回头查查. 以下是一个不成熟的例子,但是能编译运行通过. #include "stdafx.h" #include <iostream> using namespace std; class AAA { public: static int sss;

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型 的对象时检测到循环引用. 异常信息(部分): System.Web.Services.Protocols.SoapException: 服务器无法处理请求. ---> System.InvalidOperationException: 生成 XML 文档时出错. ---> System.InvalidOperationException: 序列化类型 Web

Asp.Net MVC学习记录之“一个实体对象不能由多个 IEntityChangeTracker 实例引用”

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

(一)数组或对象中最会一个属性是否该加逗号的测试

1.结论:在IE8中有兼容问题.会将逗号后面的空也算作一个属性,所以最后一个属性末不要加逗号 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> </body> <script src="lib

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):当函数返回一个局部对象时,虽然这个对象已经释放,但是返回时会产生一个临时的对象.而当返回一个局部对象的引用时,这个对象已经不存在了.这就要求在函数参数中,包含一个引用或指针.int &func(int a,int b,int &retsult){ retsult = a + b; return &retsult}但是如下代码是错误的(返回局部对象的引用)int &func(int a,int b){ int &