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);
    }
}

 

posted on 2018-09-05 16:18  Postgre叮当牛i  阅读(214)  评论(0)    收藏  举报

导航