zoukankan      html  css  js  c++  java
  • java web(三):ServletContext、session、ServletConfig、request、response对象

      上一篇讲了Servlet:

        1)什么是Servlet【servlet本身就是一种Java类,这种Java类提供了web形式的方法,只要实现了servlet接口的类,都是一种servlet资源。】    

        2)三种方式创建Servlet(继承HTTPServlet使我们使用的)

        3)Servlet的生命周期【通过三个成员方法体现】


      

    一:ServletContext对象

    ServletContext对象被称作应用/servlet上下文。

      生命周期:

        启动tomcat服务器被创建

        关闭tomcat服务器被销毁【每个web项目有且只有一个ServletConfig对象】

      

      获取方式:this.getServletContext(); this.getServletConfig.getServletContext();request.getServletContext();

     

      作用范围:

        在整个项目运行期间,有且只有一个ServletConfig对象,为所有用户共享。

       

      使用:

        1)web项目共享数据   setAttribute(String key,Object value); //已键值对存放数据,整个项目运行期间都存在

          getAttribute(String key); //通过键获取数据

          removeAttribute(String kye); //通过键移除数据

        

        2)全局初始化参数

           如果在web.xml中配置

              <context-param>

                <param-name>id</param-name>

                <param-value>11</param-value>

        

                <param-name>name</param-name>

                <param-value>jack</param-value>

                <param-name>age</param-name>

                <param-value>18</param-value>

              </context-param>

          this.getServletContext().getInitParameter("id"); // 11

          this.getServletContext().getInitParameter("name"); // jack

          this.getServletContext().getInitParameter("age"); // 18

          this.getServletConfig().getInitParameterNames(); //获得全局参数所有<param-name>值

        

        3)获取web项目资源

          this.getServletContext().getRealPath("WEB-INF/web.xml");    //获取web项目下指定文件的绝对路径【D:\apache_tomcat\apache-tomcat-7.0.62-windows-x64\apache-tomcat-7.0.62\webapps\StudyServlet\WEB-INF\web.xml】

        

          InputStream getResourceAsStream(java.lang.String path); //获取web项目下指定资源的内容,返回的是字节输入流

        浏览器请求一个Servlet,然后通过上面方法把一个html页面写过去。页面代码:

          

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		ServletContext context = this.getServletContext();
    		//ips.html在webContent目录下
    		InputStream ips = context.getResourceAsStream("/ips.html");
    		BufferedReader reader = new BufferedReader(new InputStreamReader(ips));
    		String str = null;
    		while((str = reader.readLine()) != null)
    			response.getWriter().write(str);
    		
    }
    

       浏览器效果:

      

      效果达到了,但出现???,这是中文乱码问题,后面会通过response解决。

        

    二:HttpSession对象。

      HpptSession对象和ServletContent对象类似,不过它的作用范围是一次会话期间,一次会话可以包括对此request请求。

      生命周期:第一次调用request.getSession(true);时被创建。【参数boolean类型,true是有session则返回,无则创建一个新的;false则返回一个null如果当前没有有效的session。无参的getSession是调用传入false的该方法】

    调用session.invalidate()或自动超时则被销毁。默认超时时间30分钟,超时时间指:【客户端不与服务器进行交互的时间】。【代码设置:session.setMaxInactiveInterval(60*30);单位:秒;web.xml中设置:

        <session-config> 

                          <session-timeout>1</session-timeout> 

                    </session-config>

    该标签与servlet标签处于同一级别。单位:分钟,必须为整数

      用途:一般用作一次会话期间保存数据,getAtrribute(),setAttribute(),removeAtrribute()用法和ServletContent对象用法一致。

     注意:服务器异常关闭不会销毁session,丢失session。服务器正常关闭不会销毁session,也不会丢失。

    三:ServletConfig对象  

      在Servlet 的配置文件中,可以用一个或多个<init-param>标签为servlet配置一些初始化参数。

    当servlet配置了初始化参数之后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给Servlet。进而,程序员通过Servlet对象得到当前servlet的初始化参数信息。

      上一篇我们说过,一般会重写无参的init方法,所以通过this.getServletConfig()获得对象。

      web.xml中:

      

      servlet中:

        

    @Override
        public void init() throws ServletException {
        	ServletConfig config = this.getServletConfig();
        	config.getInitParameter("id"); //223
        	config.getInitParameter("age"); //jack
        	Enumeration<String> keys = config.getInitParameterNames();
        	while(keys.hasMoreElements())
        		System.out.println(keys.nextElement());
        	
        }
    

    四:request对象、response对象

      request对象的作用范围是一次http请求响应之内,request也可以存放数据,和ServletContent和session对象类似,不过作用范围比它们两个小。

      request可以用过方法getParameter(String key):String;获取浏览器传递的参数【不管是在url后拼接参数的get提交方式或参数在请求体的post提交方式都是用该方法】,

    getParameterNames():Enumeration<?>;可以获取所有的key值,没有参数则返回一个空的Enumeration。接收数据前可以调用setCharacterEncoding(charset);设置接收格式。

      request还可以用于服务器内部跳转【还是一次http请求响应,所以request在N次内部跳转中是同一个】。request.getRequestDispatcher("HelloWorld").forword(request,reponse);

    可以跳转到WebContent目录下的一个html页面或者跳转到另一个Servlet请求处理。

      response对象作为响应向浏览器发送数据,可以通过setCharacterEncoding(charset)设置编码格式,setContentType("text/html;charset=utf-8")告诉浏览器已html文件解析。

    getWriter()可以获得一个字符输入流,该流可以向浏览器写东西。

      response还可以用作客户端重定向,sendRedirect(path)。例如:跳转到WebContent目录下的one.html,response.sendRedirect("one.html");

    跳转到另一个Servlet,response.sendRedirect("HelloWorld")。【注意:不要加"/"】

      "/"在服务器内部跳转和客户端重定向中怎么使用?代表这什么?

    内部跳转加不加"/"不影响,客户端重定向不能加。"/"在服务器代表当前web项目【http://ip:port/项目名/】;

    在客户端表示当前页面【http://ip:port/】。

     注意: 在WebContent下有一个one.html和一个HTML目录,HTML目录下有一个two.html,两个html页面代码一样。

        

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>测试</title>
    </head>
    <body>
    	<a href="HelloWorld">点击超链接进行跳转</a>
    </body>
    </html>
    

     在浏览器分别访问http://127.0.0.1:7778/StudyServlet/one.html和http://127.0.0.1:7778/StudyServlet/HTML/two.html,然后点击超链接进行跳转。

    在two.html中点击超链接发生错误,错误提示【HTTP Status 404 - /StudyServlet/HTML/HelloWorld】,404---没有该资源。为啥呐?因为在客户端页面发送请求是相对于

    当前路径的,这可能不方便。可以通过base标签设置。<base href="http://127.0.0.1:7778/StudyServlet/"></base>,这样在一个页面访问另一个资源时就可以相对于base标签设置的了。

        等后面学了jsp可以不必限定死协议、ip、port、项目名。

           request.getScheme();//获取协议 http

          request.getServerName(); //获取ip,127.0.0.1

          request.getServerPort(); //获取端口,7778

          request.getContextPath(); //获取项目名,StudyServlet

    response,response还有很多方法,具体可以查API。request和resonse的具体用法下一篇讲。

    总结:

      1.SevletContext对象。获取途径,生命周期,作用范围,以及一些该对象的一些用法【存取数据,获取全局配置参数,获取web项目资源】

      2.HTTPSession对象。session对象和上面类似,只是作用范围变成了一次会话期间。

      3.ServletConfig对象一般用作来获取web.xml中servlet配置中<init-param>...</init-param>里的参数。如果servlet配置了<load-on-startup>正整数</load-on-startup>,

    init方法就可以随服务器启动而被调用,继而可以在init中利用该对象做一些初始化配置。

      4.request和response对象。一般用来服务器内部跳转和客户端重定向。

    当然还有其他用法。下一篇通过一个小项目讲解request和response一些具体用法:比如文件的上传和下载...

      

      

        

  • 相关阅读:
    import 和 from … import 模块的变量、方法引用差异
    python引入模块的五种方式与内置模块
    webdriver定位元素的方法和基础函数的使用
    mysql update语句 in执行效率优化
    服务器配置jupyter notebook
    安装CUDA和cuDNN
    Linux命令后台运行
    Ubuntu查看系统信息(CPU、GPU信息)
    Linux下scp用法简析
    如何解决“This app is damaged and can’t be opened. You should move it to the Trash”
  • 原文地址:https://www.cnblogs.com/yangji0202/p/10512506.html
Copyright © 2011-2022 走看看