zoukankan      html  css  js  c++  java
  • 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);
            }
     
        }
     
    }
  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/jason111/p/9002396.html
Copyright © 2011-2022 走看看