JavaWeb学习3

本文详细介绍了JavaWeb中HttpServlet的作用、流程、HttpServletRequest接口的使用,包括参数获取方法,以及请求转发与重定向的区别。重点讲解了如何处理用户提交数据和管理请求域对象。
摘要由CSDN通过智能技术生成

一、HttpServlet

HttpServlet简述

HttpServlet类是专门为HTTP协议准备的。

  • HttpServletRequest对象中封装了请求协议的全部内容。
  • HttpServletResponse对象是专门用来响应HTTP协议到浏览器的。

HttpServlet的功能

HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中,大大简化了HttpServlet解析请求数据的工作量。

流程描述

1)Web客户向Servlet容器发出Http请求;

2)Servlet容器解析Web客户的Http请求;

3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;

4)Servlet容器创建一个HttpResponse对象;

5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;

6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;

7)HttpServlet调用HttpResponse的有关方法,生成响应数据;

8)Servlet容器把HttpServlet的响应结果传给Web客户。

二、HttpServletRequest接口详解

HttpServletRequest是一个接口

  • HttpServletRequest对象封装了的信息
    • HttpServletRequest对象是Tomcat服务器负责创建的。
    • 封装了HTTP的请求协议。
    • javaweb程序员面向HttpServletRequest接口编程,调用方法就可以获取到请求的信息了。
  • equest和response对象的生命周期
    • request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求中有效。
      一次请求对应一个request,两次请求则对应两个request。
获取用户提交的数据
Map<String,String[]> getParameterMap() 这个是获取Map
Enumeration<String> getParameterNames() 这个是获取Map集合中所有的key
String[] getParameterValues(String name) 根据key获取Map集合的value
String getParameter(String name)  获取value这个一维数组当中的第一个元素。这个方法最常用。
// 以上的4个方法,和获取用户提交的数据有关系。
四种方法的使用
//username=zhangsan&userpwd=123&interest=s&interest=d
/*Map<String,String[]>
     key				value
  ---------------------------
  "username"		{"zhangsan"}
  "userpwd"		  {"123"}
  "interest"		{"s", "d"}  */

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException,ServletException{
  
         /*1.最常用的方式  String getParameter(String name)*/
       	String username = request.getParameter("username");
        String userpwd = request.getParameter("userpwd");
  			
  				System.out.println(username);
       	  System.out.println(userpwd);
  
  
				/*2.既然是checkbox,调用方法:request.getParameterValues("interest")*/
      	String[] interests = request.getParameterValues("interest");
				
  					for(String  i : interests){
           			 System.out.println(i);
       	 }
				
  			/*3.直接通过getParameterNames()这个方法,可以直接获取这个Map集合的所有key*/
        Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            System.out.println(name);
        }
			
  			
  		/*4.获取参数Map集合*/
        Map<String,String[]> parameterMap = request.getParameterMap();
        // 遍历Map集合(获取Map集合中所有的key,遍历)
        Set<String> keys = parameterMap.keySet();
        Iterator<String> it = keys.iterator();
        while(it.hasNext()){
            String key = it.next();
					  System.out.print(key+"=");
            // 通过key获取value
            String[] values = parameterMap.get(key);
          for(String value : values){
                System.out.print(value+",");
            }

            System.out.println();
          
          /*4.输出结果
          username=zhangsan,
					userpwd=123,
					interest=s,d,

}
请求域对象request

请求域”对象要比“应用域”对象范围小很多。生命周期短很多。请求域只在一次请求内有效。
一个请求对象request对应一个请求域对象。一次请求结束之后,这个请求域就销毁了。
请求域对象中的三个方法:

// 存(怎么向request请求域中存数据)
public void setAttribute(String name, Object value); // map.put(k, v)
// 取(怎么从request请求域中取数据)
public Object getAttribute(String name); // Object v = map.get(k)
// 删(怎么删除request请求域中的数据)
public void removeAttribute(String name); // map.remove(k)

三、请求转发

  1. 原理: 是由WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的。
// 第一步:获取请求转发器对象
	RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
	// 第二步:调用转发器的forward方法完成跳转/转发
	dispatcher.forward(request,response);
            
	// 第一步和第二步代码可以联合在一起。
	 request.getRequestDispatcher("/b").forward(request,response);
	
//注意:转发的时候是一次请求,会将当前的request和response对象传递给下一个servlet.
         

转发的下一个资源必须是一个Servlet吗?
不一定,只要是Tomcat服务器当中的合法资源,都是可以转发的。例如:html…
注意:转发的时候,路径的写法要注意,转发的路径以“/”开始,不加项目名。

特点:在请求转发过程中,浏览器只发送一个了个Http请求协议包。
参与本次请求的所有Servlet共享同一个请求协议包,因此
这些Servlet接收的请求方式与浏览器发送的请求方式保持一致

四、重定向

  1. 工作原理:是浏览器完成的。具体跳转到哪个资源,是浏览器说了算。
  2. 实现命令
 response.sendRedirect("请求地址")
 //注意:重定向地址需要加上 项目名
 //因为浏览器发送请求是需要加上项目名的
  1. 特征

1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)

2)请求次数

浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。
后续请求都是浏览器自动发送的。
3) 请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
通过重定向解决方案调用的资源文件接收的请求方式一定是get

  1. 缺点
    重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
    消耗在往返次数上,增加用户等待服务时间

转发和重定向区别

  1. 如果在上一个Servlet当中向request域当中绑定了数据,希望从下一个Servlet当中把request域里面的数据取出来,使用转发机制。

  2. 剩下所有的请求均使用重定向。(重定向使用较多。)

  3. 他俩跳转的资源只要是服务器内部合法的资源即可。(Servlet,JSP,HTML)

  4. 转发会存在浏览器刷新问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值