• 2018-09-04ServletContext域对象+Response设置响应头+重定向302+解决getWriter中文乱码问题


    ServletContext对象:

    ServletContext代表是一个Web应用的环境(上下文)对象,ServletContext对象内部封装是该Web应用的信息,ServletContext对象一个Web应用只有一个!

    //ServletContext代表整个Web项目,包含了整个Web项目信息,是一个域对象!

    一个Web应用有几个servlet对象?

    有一个ServletContext对象(因为Web项目只有一个,所以ServletContext对象只有一个)和无数个Servlet对象!

    ServletContext对象的生命周期?

    创建:该Web应用被加载(服务器启动或发布Web应用(前提:服务器启动状态))

    销毁:Web应用被卸载(服务器关闭,移除该Web应用)

    创建ServletContext对象:

    ServletContext servletContext = this.getServletContext();

    配置全局Web.xml中的参数:

    //需要声明在web-app标签内!

    ServletContext是一个域对象:

    什么是域对象?什么是域?

    存储数据的区域就是域对象

    ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向       servletcontext域中存取数据,数据可以共享)

    域对象的通用的方法:

    setAtrribute(String name,Object obj);

    getAttribute(String name);

    removeAttribute(String name);

    创建Servlet类的快捷方法:

    直接在包上new一个Servlet类,Web.XML中会自动生成该Servlet的信息,但是这部分信息可以自动生成,但是不可以自动删除,所以当删除Servlet类时,一定要删除Web.XML中的信息!

    黑科技之代码模板示例:

    package ${enclosing_package};
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class ${primary_type_name} extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().write("");
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    示例代码(ServletContext域对象):

    package com.oracle.demo01;
    import java.io.IOException;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class TestServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取ServletContext域对象:
            ServletContext servCon=this.getServletContext();
            //获取全局信息:
            String url=servCon.getInitParameter("url");
            System.out.println(url);
            //通过相对路径获得TomCat服务器上源码的绝对路径:
            String PathA=servCon.getRealPath("WEB-INF/classes/A.txt");
            String PathB=servCon.getRealPath("B.txt");
            String PathC=servCon.getRealPath("WEB-INF/C.txt");
            //D.txt是直接建在Web0904工程下的,所以不会有路径!
            System.out.println(PathA);
            System.out.println(PathB);
            System.out.println(PathC);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    示例代码(通过ServletContext域对象实现Servlet对象的相互影响):

    package com.oracle.demo01;
    import java.io.IOException;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class Servlet01 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //搞个ServletContext域对象:
            ServletContext servCon=this.getServletContext();
            //然后上传几个东西(这几个东西的Key不允许有重复值):
            servCon.setAttribute("张三",18);
            servCon.setAttribute("李四",20);
            servCon.setAttribute("王五",25);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    
    package com.oracle.demo01;
    import java.io.IOException;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class Servlet02 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //搞个ServletContext域对象,跟Servlet01是同一个对象:
            ServletContext servCon=this.getServletContext();
            int zhangsan=(int)servCon.getAttribute("张三");
            int lisi=(int)servCon.getAttribute("李四");
            int wangwu=(int)servCon.getAttribute("王五");
            System.out.println(zhangsan+"……"+lisi+"……"+wangwu);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    HttpServletResponse简介:

    设置响应行的状态码:

    setStatus(int sc)

    通过response设置响应头:

    addHeader(String name, String value)

    addIntHeader(String name, int value)

    addDateHeader(String name, long date)

    setHeader(String name, String value)

    setDateHeader(String name, long date)

    setIntHeader(String name, int value)

    其中,Add表示添加,而Set表示设置

    重定向:

    ①    需要状态码为302!

    ②    响应头Location代表重定向地址!

    通过Response设置响应体:

    getWriter()

    获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后TomCat会将response缓冲区中的内容组装成HTTP响应返回给浏览器端!

    关于设置中文的乱码问题:

    原因:Response缓冲区的默认编码是ISO8859-1,此码表中没有中文,可以通过response的setCharacterEncoding(String charset) 设置Response的编码!

    通过Response的setContentType(String type)方法指定页面解析时的编码是UTF-8

    response.setContentType("text/html;charset=UTF-8");

    //这行代码不仅将Response缓冲区设置成中文,而且也将浏览器的解码方式设置成中文,因此完全可以代替setCharacterEncoding方法!

    Response示例代码:

    package com.oracle.demo03;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class RefreshServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setHeader("refresh","5;url=https://www.baidu.com");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    
    package com.oracle.demo03;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class Servlet04 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setStatus(302);
            //设置响应头:
            //response.setHeader("Location","Servlet01");
            //实际开发中用一句话搞定:
            response.sendRedirect("Servlet01");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    
    package com.oracle.demo04;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class Writers extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置response缓冲区查询的码表:
            //response.setCharacterEncoding("utf-8");
            //通过设置一个头告知客户端用UTF-8解码(同时设置了response缓冲区和浏览器的解码方式):
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("你好!");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
  • 相关阅读:
    java基础-对象
    java基础-类
    java基础-数组
    java基础-for循环、while循环相关
    java基础-程序执行流程之if-else语句
    ODBC, OLEDB, ADO, ADO.NET
    无题
    优秀资源
    SSRS Report Knowledge Base
    SSRS 通过Customer Code访问Dataset
  • 原文地址:https://www.cnblogs.com/postgredingdangniu/p/9592796.html
Copyright © 2020-2023  润新知