欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

servlet请求和响应

程序员文章站 2022-05-07 08:28:28
...

一,请求对象
    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");

相关标签: javaWeb