servlet请求和响应

一,请求对象
    1.请求对象的常用方法
        获取虚拟路径                 getContextPath()
        获取Servlet映射路径            getServletPath()
        获取访问者ip地址            getRemoteAddr()
        获取请求的消息数据            getQueryString()
        获取统一资源标识符            getRequestURI()
        获取统一资源定位符            getRequestURL()    
        注意:URI的范围比URL的范围要大
        代码演示:
      

 //        获取虚拟路径
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
//        获取Servlet映射路径
        String servletPath = req.getServletPath();
        System.out.println(servletPath);
//        获取访问者ip地址
        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);
//        获取请求的消息数据
        String queryString = req.getQueryString();
        System.out.println(queryString);
//        获取统一资源标识符
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);
//        获取统一资源定位符
        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL);


        
二,请求头信息的常用方法
        根据请求头名称获取一个值    getHeader(String name)
        根据请求头名称获取多个值    getHeaders(String name)
        获取所有请求头名称            getHeadNames()
        
        
        
        
三,获取请求参数信息
        根据名称获取数据            getParameter(String name)
        根据名称获取所有数据        getParameterValues(String name)
        获取所有名称                getParameterNames()
        获取所有参数的键值对        getParameterMap()
        代码演示:
      

 //        根据名称获取数据
        String username = req.getParameter("username");
        System.out.println(username);
        String password = req.getParameter("password");
        System.out.println(password);
        System.out.println("--------------------------");
//        根据名称获取所有数据
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        System.out.println("--------------------------");
//        获取所有名称
        Enumeration<String> headerNames = req.getParameterNames();
        while (headerNames.hasMoreElements()){
//            获取每一个名字
            String names = headerNames.nextElement();
            String result = req.getParameter("names");
            System.out.println(names+" " +result);

        }
        System.out.println("--------------------------");
//        获取所有参数的键值对
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()){
            String[] values = map.get(key);
            System.out.print(key+":");
            for (String value : values) {
                System.out.print(value+" ");
            }
            System.out.println();
        }
        System.out.println("--------------------------");


        
        
        
        1.将信息封装为对象
            a:getParameter(String name)和getParameterValues(String name)获取到每一个信息封装
            b:用反射进行封装(太复杂)
            c:先用req.getParameterMap();获取集合,导jar包用工具类 BeanUtils.populate(对象名,集合);
注意:封装的学生对象与map的值要一  一对应起来
            
三,用流的形式读取请求信息
    代码演示:
  

 public class RequestDemo4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1.获取请求正文的字节输入流
        ServletInputStream sis = request.getInputStream();
        //2.读取流中的数据
        int len = 0;
        byte[] by = new byte[1024];
        while((len = sis.read(by)) != -1){
            System.out.println(new String(by,0,len));
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

四,中文乱码问题
    get在tomcat8.0之后解决了乱码问题
    post:req.setCharacterEncoding("编码格式");
    
五,请求转发
     通过方法:req.getRequestDispatcher("要实现的Servlet名称");
     实现转发:requestDispatcher.forward(req,resp);
        
六,响应对象
    改变浏览器的编码格式:resp.setContentType("text/html;charset=UTF-8");
    代码演示:

public class ResponseDemo1 extends HttpServlet {

    /**
     * 演示字节流输出的乱码问题
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 问题:
         *       String str = "字节流中文乱码问题";
         *          使用字节流输出,会不会产生中文乱码?
         * 答案:
         *       会产生乱码
         * 原因:
         *     String str = "字节流中文乱码问题"; 在保存时用的是IDEA创建文件使用的字符集UTF-8。
         *     到浏览器上显示,chrome浏览器和ie浏览器默认的字符集是GB2312(其实就是GBK),存和取用的不是同一个码表,就会产生乱码。
         *
         * 引申:
         *   如果产生了乱码,就是存和取用的不是同一个码表
         * 解决办法:
         *   把存和取的码表统一。
         */
        String str = "字节流输出中文的乱码问题";//UTF-8的字符集,此时浏览器显示也需要使用UTF-8的字符集。
        //1.拿到字节流输出对象
        ServletOutputStream sos = response.getOutputStream();
        /**
         * 解决办法:
         *     第一种解决办法:
         *      修改浏览器的编码,使用右键——编码——改成UTF-8。(不推荐使用,我们的应用尽量不要求用户取做什么事情)
         *      ie和火狐浏览器可以直接右键设置字符集。而chrome需要安装插件,很麻烦。
         *     第二种解决办法: (不建议使用,因为不好记)
         *      向页面上输出一个meta标签,内容如下: <meta http-equiv="content-type" content="text/html;charset=UTF-8">
         *      其实它就是指挥了浏览器,使用哪个编码进行显示。
         *  第三种解决办法:
         *         设置响应消息头,告知浏览器响应正文的MIME类型和字符集
         *         response.setHeader("Content-Type","text/html;charset=UTF-8");
         *     第四种解决办法:我们推荐使用的办法
         *         它的本质就是设置了一个响应消息头
         *      response.setContentType("text/html;charset=UTF-8");
         */
        //第二种解决办法:sos.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
        //第三种解决办法:response.setHeader("Content-Type","text/html;charset=UTF-8");
        //第四种解决办法:
        response.setContentType("text/html;charset=UTF-8");
        //2.把str转换成字节数组之后输出到浏览器
        sos.write(str.getBytes("UTF-8")); 
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}


七,重定向
    resp.sendRedirect(req.getContextPath()+"/servletDemo02");
    注意:这里的地址是要重定向的地址
    
八,自动跳转
  

  //    定义字符串
        resp.setContentType("text/html;charset=utf-8");
     String str = "十秒后自动跳转到登录页面";
    //写回
     resp.getWriter().write(str);
     //     跳转
     resp.setHeader("Refresh","3;URL="+req.getContextPath()+"/regist.html");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值