request和response

HttpServletResponse

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。

response的运行流程

request和response_第1张图片

通过抓包工具抓取Http响应

request和response_第2张图片

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体

关于乱码

如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。

解决方案:response.setContentType(“text/html,charset=utf-8”)
把自己的文件用utf-8编码,并且告诉浏览器我用什么方式编码

转发和重定向的区别

1.转发的地址栏不变,而重定向的地址栏变化
2.转发只能在网站内部进行,而重定向不是
3.转发请求次数是一次,重定向是两次
4.转发request和response数据传递,重定向不传递

验证码

java有把字符串变成图片的API。
有专业的验证码公司,提供验证码API

各种API

public class show0 extends HttpServlet {
/**
 * 
 * 
 *          1、请求行  
Get  http://localhost:8080/day09/servlet/req1?username=zs  http/1.1
getMethod(); 获得请求方式
***getRequestURL();返回客户端发出请求时的完整URL。
***getRequestURI(); 返回请求行中的资源名部分。
*****getContextPath(); 当前应用的虚拟目录 /day09_01_request
getQueryString() ; 返回请求行中的参数部分。

            2、请求消息头
 * String   getHeader(String name)  根据头名称得到头信息值
 Enumeration   getHeaderNames()  得到所有头信息name
 Enumeration   getHeaders(String name)  根据头名称得到相同名称头信息值

            3、请求正文(重要)
与获取表单数据相关的方法

*** getParameter(name) 根据表单中name属性的名,获取value属性的值方法 
*** getParameterValues(String name)专业为复选框取取提供的方法
                getParameterNames() 得到表单提交的所有name的方法 
*** getParameterMap 到表单提交的所有值的方法   //------------做框架用,非常实用-----------
getInputStream  以字节流的方式得到所有表单数据
与操作非表单数据相关的方法(request也是一个域对象)
*** void setAttribute(String name, Object value);
*** Object getAttribute(String name);
Void removeAttribute(String name);

与请求转发相关的方法
//得到请求转发或请求包含的协助对象
RequestDispatcher getRequestDispatcher(String path)
*** forward(ServletRequest request, ServletResponse response) //转发的方法
include(ServletRequest request, ServletResponse response) //请求包含

与请求编码相关的方法:
//解决post方式编码
*****request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式

//解决get方式编码
String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);
 *          
 */
    /**
     * web服务器每次收到客户端的http请求,会这对每一次请求,创建request和response对象
     * 
     * 1、响应行  HTTP/1.1  200 OK
       setStatus(int sc) 设置响应状态码

       2、响应头
***** sendRedirect(String location) 请求重定向
setHeader(String name, String value) 设置响应头信息

        //告知浏览器使用什么码表
        response.setHeader("content-type", "text/html;charset=UTF-8");

        //告知客户端不缓存
        response.setHeader("pragma", "no-cache");
        response.setHeader("cache-control", "no-cache");
        response.setDateHeader("expires", 0);

        Referesh刷新
        3、响应正文(主体)
       *** getWrite(); 字符输出流
       getOutputStream(); 字节输出流
       setCharacterEncoding(String charset) 告知服务器使用什么编码
       *****setContentType(String type)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //response.setCharacterEncoding("UTF-8");   //告知服务器使用什么编码
        //response.setHeader("content-type", "text/html;charset=UTF-8");//告诉浏览器


        response.setContentType("text/html;charset=UTF-8");//告诉浏览器和服务器什么编码
        response.getWriter().write("邪恶的hero");   //直接打印过去的结果是:         ???hero     ,查不到码表,不是乱码

    }



    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);
    }

}


/**
     * 请求转发:request.getRequestDispatcher("/demo").forward(request,response)
     * 请求转发不能跳到别的应用,只能是当前app下的网址
     * request.getRequestDispatcher("http://www.baidu.com").forward(request,response)
     * 这个只会跳到  http://.....ReqAndRes/http://www.baidu.com根本去不了百度,用重定向吧。
     *          a
     *          b
     *          c   //转发  or重定向   如果是转发,去别的页面回来后执行d,如果是重定向,直接执行完d,再去别的页面。
     *          d
     * 
     * 请求重定向 response.sendRedirect("/ReqAndRes/demo")
     * 
     * 1.转发地址栏不变,重定向变,转发是request由服务器执行的,重定向是response由浏览器执行
     * 2.转发请求次数是一次,重定向是两次
     * 3.转发request和response数据传递,重定向不传递
     * 4.转发不能跳转别的网页,重定向可以
     * 
     * 
     * 请求包含request.getRequestDispatcher("/demo").include(request,response)
     * 请求包含就是把demo的代码直接拿过来用,两个资源当成一个资源。
     * 
     */

文件下载

request和response_第3张图片

public class show1 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过路径得到输入流
        String path=this.getServletContext().getRealPath("/WEB-INF/classes/图片.jpg");

        FileInputStream fis=new FileInputStream(path);
        //创建字节输出流
        ServletOutputStream sos=response.getOutputStream();
        //得到下载的文件名字
        String name=path.substring(path.lastIndexOf("\\")+1);
        System.out.println(path);
        System.out.println(name);
        //设置图片的文件名字编码
        name=java.net.URLEncoder.encode(name, "UTF-8");



        //告诉浏览器要下载文件

        response.setHeader("content-disposition", "attachment;filename="+name);
        response.setHeader("content-type", "image/jpeg");//告诉其文件类型


        //执行输出操作

        int len=1;
        byte[] b=new byte[1024];
        while((len=fis.read(b))!=-1){
            sos.write(b, 0, len);
        }

        //这里不用关流,response是会自己关的
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);
    }

}

你可能感兴趣的:(javaweb)