HttpServletResponse

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。

所有Servlet响应都实现ServletResponse接口。ServletResponse接口主要有以下方法:

(1)从Servlet中可以通过getWriter方法取得PrintWriter对象,来输出字符数据。从Servlet中可以通过getOutputStream方法取得ServletoutputStream对象。ServletOutputStream既可以输出字符数据,也可以输出MIME格式的二进制数据。如果getWriter方法已经被使用过,当使用getOutputStream时,会有java.lang.IllegalStateException例外抛出。

(2)setContentType方法:在响应中可以表明内容格式和长短。

(3)setBufferSize方法:设置Web容器的缓冲器大小; getBufferSize方法返回Web容器的缓冲器大小; resetBuffer方法清空并重置缓冲器,使用reset方法清空缓冲器、状态头信息,使用flushBuffer方法将缓冲器内的所有输出内容向客户传递。使用isCommitted方法判断是否响应已经被履行。“履行”的定义是指状态码冬耕 信息已经被写入响应。

(4)setLocal方法设定响应的地域信息,主要在Web程序的国际货币国际化时使用。这个方法应该在getWriter之前被使用。默认的Web服务器的地域信息。

HttpServletResponse继承了ServletResponse接口,并提供了与Http协议有关的方法,这些方法的主要功能是设置HTTP状态码和管理Cookie。

(1)setStatus方法用来设置Servlet向客户端返回的状态码,它用来设置没有出错的状态。如果Servlet运行出错,Servlet可以使用sendError方法设置状态码,如sendError(int sc)方法设置错误状态代码。sendError(int sc,String msg)方法除了设置状态码,还向客户发出一条错误信息。

(2)setHeader可以指定特定名称的头信息的值,addDateheader,addIntHeader,setDateHeader,setIntHeader可以加入或理性特定时间或整数型头信息。

(3)addCookie方法可以在Web服务器响应中加入Cookie对象,这个对象将被浏览器所保存。Cookie机制也被用来维护会话状态。

(4)sendRedirect方法向客户发出临时重新导向的响应。它生成的响应状态码为302。该响应给了客户一个新的URL风趣。如果缓冲器已经被清空,这个方法会弹出一个IllegalStateException例外。
复制代码

1.ServletContext接口

ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象 内部封装是该web应用的信息,ServletContext对象一个web应用只有一个,ServletContext在该web项目被加载时创建,在web项目卸载时或者服务器关闭时被销毁。

通过实例化一个ServletContext实现类对象,我们可以设置全局变量或者获取配置文件。

2.应用

(1)初始化参数设置与获取

实例化ServletContext对象:

ServletContext servletContext = config.getServletContext();
ServletContext servletContext = this.getServletContext();

在XML设置初始化参数:

<context-param>
      <param-name>JDBC</param-name>
      <param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

获取参数:

String name = context.getInitParameter("JDBC");

(2)全局属性设置与获取

context.setAttribute("user", "admin");
String user = context.getAttribute("user");

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

(3)获取web应用内配置文件的绝对路径

String path1 = context.getRealPath("123.txt");
String path2 = context.getRealPath("456.txt");
String path3 = context.getRealPath("789.txt");

不论该文件在web应用内的那个文件夹下,都能被获取到,可用于获取配置文件。

 3.response响应

服务器接收到一个请求时,会生成一个响应对象,即response,我们可以通过response来实现不同的操作。

(1)响应html代码

复制代码
public class LoginServlet extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
        String user = request.getParameter("user");
        String pwd = request.getParameter("pwd");
        String result = null;
        if(user.equals("admin")&pwd.equals("123456")) 
            result= "<h3 style='color:green'>登录成功</h3>";
        else
            result="<h3 style='color:red'>账户或密码错误</h3>";
        response.getWriter().println(result);
    }
}
复制代码

(2)设置响应头

复制代码
public class ResponseServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.addHeader("Adam", "wink");
        response.addIntHeader("GOD", 123);
        response.addDateHeader("when", 19820052566222L);
        String html = "www.baidu.com";
        response.setStatus(302);
        response.setHeader("Location", html);//实现页面302跳转
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
复制代码
复制代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print("<h2>页面将在5s后跳转至百度!</h2>");
        response.setHeader("refresh", "5;url=http://www.baidu.com");//定时自动跳转
    }
复制代码

(3)页面跳转:

客户端跳转:

两次请求,第一次为请求servlet的虚拟路径,第二次为请求html页面

两次响应,第一次为302,页面跳转,第二次为200,跳转页面加载

String html = "www.baidu.com";
response.setStatus(302);
response.setHeader("Location", html);//实现页面302跳转

服务端跳转:

一次请求,请求servlet,页面是在服务器内部打开

一次响应,200,跳转页面打开

服务端响应不会改变当前的url

复制代码
public class LoginServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        String name = request.getParameter("name");
        String password = request.getParameter("password");
 
        if ("admin".equals(name) && "123".equals(password)) {
            request.getRequestDispatcher("success.html").forward(request, response);
        }
 
    }
 
}
原文地址:https://www.cnblogs.com/jason111/p/9002396.html