HttpServlet之HttpServletRequest和HttpServletResponse

HttpServletRequest

一.什么是HttpServletRequest

当tomcat接收到客户端发送的请求后,tomcat将http请求的信息封装成HttpServletRequest对象,然后经过service()方法分发给doGet()方法和doPost()方法取调用。通过HttpServletRequest对象获取想要的请求中的信息。

二.HttpServletRequest有哪些方法

getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的同意资源地位符(绝对路径)
getRemoteHost() 获取客户前端的ip地址
getHeader() 获取请求头
getParameter() 获取请求参数
getParameterValues() 获取请求参数(包括多个值)
getMethod() 获取方法的类型
getAttribute() 获取域对象
setAttribute() 设置域对象
getRequestDispatcher() 获取请求转发的对象

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("获取请求的资源路径="+req.getRequestURI());
        System.out.println("获取请求的统一资源定位符(绝对路径)"+req.getRequestURL());
        System.out.println("获取客户端的ip地址 "+req.getRemoteHost());
        System.out.println("获取请求头"+req.getHeader("Accept"));
         System.out.println("获取请求方式"+req.getMethod());
         //当请求中有多个值时,请求的方式是localhost:8080/Servlet01/requestServlet?username=张三&username=李四
        System.out.println("获取请求的参数"+req.getParameter("username"));
        System.out.println("获取请求的参数(多个)"+req.getParameterValues("password"));
        req.setAttribute("key","zhangsan");
        System.out.println("获取域对象"+req.getAttribute("key"));
    }

运行结果:
在这里插入图片描述

doGet请求中文参数乱码解决方式

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
// 获取请求参数 
String username = req.getParameter("username"); 
//1 先以 iso8859-1 进行编码 
//2 再以 utf-8 进行解码
 username = new String(username.getBytes("iso-8859-1"), "UTF-8");
 }

doPost请求参数乱码解决方式

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        req.setCharacterEncoding("UTF-8");
       System.out.println("获取请求的参数"+req.getParameter("username"));
        System.out.println("获取请求的参数(多个)“+Arrays.asList(req.getParameterValues("hobby")));
    }

请求转发

什么是请求转发呢,请求转发就是服务器接收到请求后,从一个资源跳到另一个资源的操作的操作叫做请求转发,是服务器内部的操作。
在这里插入图片描述

转发的特点(重点):

1.转发只是一次请求。
2.地址栏里面的请求地址没有变
3.可以共享request域中的数据
4.可以访问Web-INF中的资源
5.不可以访问访问工程外的资源

测试请求转发的特点

1)servlet1接收到请求,在request域对象中setAttrubute数据 ,然后转发请求到servlet2中

public class Servlet1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
     String userName=req.getParameter("userName");
        System.out.println("获取客户端穿过来的参数="+userName);
        req.setAttribute("key1","servlet程序一处理了");
        //获取转发对象资源
        RequestDispatcher dispatcher= req.getRequestDispatcher("/servlet2");
        dispatcher.forward(req,resp);

    }
}

servlet2中接收转发过来的请求,然后取request域中的数据,验证是否可以共享数据

public class Servlet2  extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
   Object key= req.getAttribute("key1");
        System.out.println("servlet1中的值是否存在"+key);
    }
}

客户端发送请求后,地址没有变
在这里插入图片描述
servlet2中获取到了servlet1中存到request域中的数据,所有转发是可以共享数据的
在这里插入图片描述
2)接下来验证是否可以访问WEB-INF种的资源

public class Servlet1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
     String userName=req.getParameter("userName");
        System.out.println("获取客户端穿过来的参数="+userName);
        req.setAttribute("key1","servlet程序一处理了");
        //获取转发对象资源
        RequestDispatcher dispatcher= req.getRequestDispatcher("/WEB-INF/hello.html");
        dispatcher.forward(req,resp);

    }
}

在这里插入图片描述
结果验证可以范文WEB-INF中的资源(值得注意的是getDispatcher()方法不一定是servlet的映射路径,也可以是html 或者jsp文件,或者说在tomcat中不管是html/jsp或者servlet编译后的class文件都是在文件夹中的一个文件而已)
在这里插入图片描述
3)不可以访问工程外的路径
重定向百度

public class Servlet1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
     String userName=req.getParameter("userName");
        System.out.println("获取客户端穿过来的参数="+userName);
        req.setAttribute("key1","servlet程序一处理了");
        //获取转发对象资源
        RequestDispatcher dispatcher= req.getRequestDispatcher("https://www.baidu.com");
        dispatcher.forward(req,resp);

    }
}

结果:404(无法访问工程外的资源)在这里插入图片描述

/在项目中解析的区别

1)/ 在浏览器端解析为http://ip:port/
2)/ 在服务器端解析为 http://ip:port/工程名/
1、<url-pattern>/servlet1</url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);

特殊情况 :斜杠在服务器端重定向时解析为 http://ip:port/ response.getRediect("/");

HttpServletResponse 类

什么是HttpServletResponse

HttpServletResponse和HttpServletResquest相同都是由tomcat创建,让我们使用,往客户端返回数据

字节流 ServletOutPutStream out=resp.getOutPutStream();(传输二进制数据,常用于下载)
字符流 PrintWriter writer =resp.getWriter()(传输字符,常用于客户端回传字符串)
resp.getOutPutStream()和resp.getWriter()同时使用只有有一个生效

public class Servlet1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
     String userName=req.getParameter("userName");
        System.out.println("获取客户端穿过来的参数="+userName);
        Writer writer=resp.getWriter();
        writer.write("writer context");
        ServletOutputStream out= resp.getOutputStream();
        out.println("ServletOutPutStream context");

    }
}

只有一个生效
在这里插入图片描述

解决回传的数据中文乱码

//解决中文乱码
resp.setContentType(“text/html;charset=UTF-8”);

  			//解决中文乱码
        resp.setContentType("text/html;charset=UTF-8");

重定向

resp.sendRedirect("/servlet2");

重定向的特点
1.客户端地址栏地址会变
2.发送两次请求
3.不共享域数据
4.不能访问WEB-INF下的资源
5.可以重定向项目外的路径

请求转发是request的方法,重定向是response的方法

重定向请求百度

public class Servlet1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        String userName=req.getParameter("userName");
        System.out.println("获取客户端穿过来的参数="+userName);
        resp.sendRedirect("http://www.baidu.com");

    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Insect_boy/article/details/110187856