Servlet相关对象

1 相关对象

1: HttpServletRequest:请求对象  tomcat接收到请求就会为本次请求创建一个HttpServletRequest类型的对象
                                封装与请求相关的所有信息 传递给请求的servlet的service方法
2: HttpServletResponse:响应对象  tomcat接收到请求就会为本次请求创建一个HttpServletResponse类型的对象
                                封装与响应相关的所有信息 传递给请求的servlet的service方法
3: HttpSession:回话对象   实现同一个回话的多次请求之间数据共享
4: ServletContext:上下文对象 实现整个项目的请求之间数据共享
5: ServletConfig:配置信息  封装的读取servlet的配置信息

2 HttpServletRequest的功能

 tomcat接收到请求就会为本次请求创建一个HttpServletRequest类型的对象
 封装与请求相关的所有信息 传递给请求的servlet的service方法

2.1 获取请求参数

//设置请求参数编码集
req.setCharacterEncoding("UTF-8");
//Request对象的功能1:获取请求参数::parameter
//String req.getParameter(parameterName);  根据参数名获取单值参数值
//String[] req.getParameterValues(parameterName);根据参数名获取多值参数值
//Map<String,String[]>req.getParameterMap(); 获取所有请求参数对应的map
//Enumeration<String> req.getParameterNames(); 获取所有的请求参数名字
System.out.println("获取单值请求参数name="+req.getParameter("name"));
System.out.println("获取单值请求参数age="+Integer.parseInt(req.getParameter("age")));

System.out.println("获取多值请求参数enjoy="+Arrays.toString(req.getParameterValues("enjoy")));

//获取所有请求参数对应的map
Map<String, String[]> parameterMap=req.getParameterMap();
//获取所有键值对对象对应的set
Set<Entry<String, String[]>> entrys=parameterMap.entrySet();
//通过entry的getkey和getvalue方法获取键和值
for(Entry<String, String[]> e:entrys){
    System.out.println("getParameterMap:::"+e.getKey()+"="+Arrays.toString(e.getValue()));
}

//获取所有的参数名
Enumeration<String>  names=req.getParameterNames();
while(names.hasMoreElements()){//判断光标下是否还有元素可以遍历
    String name=names.nextElement();//获取一个元素
    //通过参数名获取参数值
    System.out.println("getParameterNames::::"+name+"==="+req.getParameter(name));	
}

2.2 获取请求头

//Request对象的功能2:获取请求头::Header
//String req.getHeader(headerName); 根据请求头名获取单值请求头值
//Enumeration<String> req.getHeaderNames();根据所有的请求头名
//String[] req.getHeaders(headerName);根据请求头名获取多值请求头值
//long req.getDateHeader(headerName); 根据请求头名获取日期格式的请求头值
//int req.getIntHeader(headerName);根据请求头名获取int格式的请求头值
System.out.println("根据请求头名获取单值请求头值:Host="+req.getHeader("Host"));
System.out.println("根据请求头名获取单值请求头值:User-Agent="+req.getHeader("User-Agent"));
System.out.println("根据请求头名获取单值请求头值:Connection="+req.getHeader("Connection"));
//Accept-Language
System.out.println("根据请求头名获取单值请求头值:Accept-Language="+req.getHeader("Accept-Language"));
System.out.println("根据请求头名获取单值请求头值:Accept="+req.getHeader("Accept"));
//If-Modified-Since: Wed, 29 Sep 2021 03:53:05 GMT
System.out.println("根据请求头名获取单值请求头值:If-Modified-Since="+req.getHeader("If-Modified-Since"));
//Upgrade-Insecure-Requests
System.out.println("根据请求头名获取单值请求头值:Upgrade-Insecure-Requests="+req.getHeader("Upgrade-Insecure-Requests"));		
System.out.println("根据请求头名获取日期格式请求头值:If-Modified-Since="+req.getDateHeader("If-Modified-Since"));
System.out.println("根据请求头名获取int格式请求头值:Upgrade-Insecure-Requests="+req.getIntHeader("Upgrade-Insecure-Requests"));
//获取所有的请求头名
Enumeration<String>  headerNames=req.getHeaderNames();
while(headerNames.hasMoreElements()){
    //获取一个请求头名
    String headerName=headerNames.nextElement();
    //通过请求头名获取请求头值
    System.out.println("req.getHeaderNames:::"+headerName+"="+req.getHeader(headerName));
}

2.3 其他与请求相关的方法

//Request对象的功能3:	  其他功能:获取和请求相关的其他数据
	     System.out.println("获取请求方式:getMethod:"+req.getMethod());//POST
	     System.out.println("获取sessin会话对象:getSession:"+req.getSession());
	     System.out.println("获取servletcontext上下文对象:getServletContext:"+req.getServletContext());
	     System.out.println("获取cookie数组:getCookies:"+req.getCookies());
	     System.out.println("获取request输入流:getInputStream:"+req.getInputStream());
	     System.out.println("获取项目路径:getContextPath:"+req.getContextPath());///java37_ee_04_servlet
	     System.out.println("获取请求表单的类型:getContentType:"+req.getContentType());//application/x-www-form-urlencoded
	     
	     System.out.println("获取服务器ip:getLocalAddr:"+req.getLocalAddr());//127.0.0.1
	     System.out.println("获取客户端ip:getRemoteAddr:"+req.getRemoteAddr());//127.0.0.1
	     System.out.println("获取服务器端口:getLocalPort:"+req.getLocalPort());//8080
	     System.out.println("获取客户端端口:getRemotePort:"+req.getRemotePort());//56767
	     System.out.println("获取url种?后面的参数信息:getQueryString:"+req.getQueryString());//null
	     System.out.println("获取uri:getRequestURI:"+req.getRequestURI());///java37_ee_04_servlet/s01
	     System.out.println("获取主机名字:getServerName:"+req.getServerName());
	     System.out.println("获取主机端口:getServerPort;"+req.getServerPort());

2.4 作为域对象

//Request对象的功能4:	 作为域对象:实现同一个请求链之间数据共享
//域对象: 在指定区域内实现数据共享的对象
//servlet有三大域:request域对象:实现同一个请求链之间实现数据共享
//              session域对象:同一个会话之间的数据共享
//              servletContext域对象:同一个项目之间数据共享
//域对象种存储的数据:域属性::Attribute	
//域对象的共同方法:
//        void setAttribute(String,Object);设置域属性
//        void removeAttribute(String);删除域属性
//        Object getAttribute(String);获取域属性
//        Enumeration<String> getAttributeNames();获取所有域属性名
	     
	      req.setAttribute("a", "a_value");//在request域中添加属性
	      req.setAttribute("a1", "a_value1");
	      req.setAttribute("a2", "a_value2");
	      req.setAttribute("a3", "a_value3");
	      String attValue=(String)req.getAttribute("a");//根据域属性名 获取值  值类型是Object
	      System.out.println("request域属性a="+attValue);
	      req.removeAttribute("a");//根据属性名 删除域属性
	      attValue=(String)req.getAttribute("a");
	      System.out.println("request域属性a="+attValue);
	      //获取所有request域属性
	      Enumeration<String> attNames=req.getAttributeNames();//获取所有的域属性名
	      while(attNames.hasMoreElements()){
	    	  String attName=attNames.nextElement();
	    	  System.out.println("获取所有的request域属性:"+attName+"="+req.getAttribute(attName));
	      }

2.5 实现请求转发和请求包含

//Request对象的功能5:请求转发和请求包含
//RequestDispatcher req.getRequestDispatcher(path);获取跳转到参数资源的调度器对象
//RequestDispatcher的	 void forward(request.response);请求转发到 path  
//RequestDispatcher的	 void include(request.response);请求包含到 path 
	      
	      int n=Integer.parseInt(req.getParameter("n"));
	      if(n==0){
	    	  response.getWriter().print("<font color='red' size='7'>success</font>");
	      }else if(n<0){
	    	  //请求转发到
	    	  System.out.println(n+"::::请求转发到/s011");
	    	  req.getRequestDispatcher("/s011").forward(req, response);
	      }else{
	    	  //请求转发到
	    	  System.out.println(n+"::::请求包含到/s012");
	    	  req.getRequestDispatcher("/s012").include(req, response);
	      }

3 get和post的区别(重点)

http请求的常用的两种方式
get请求:地址栏输入资源的url
        超链接
        form表单method=get
post请求:form表单method=post
区别:
    1 地址栏显示不同:安全性不同
       get请求地址栏会显示请求参数;不安全 不适用于敏感的信息
       post请求地址栏不显示请求参数
    2  请求参数存放在http请求协议的位置不同
       get请求参数存放在请求首行
       post请求参数存放在请求体中
    3  传输数据量不同
       http协议规定 请求首行最大字节1kb  get请求不适用于大数据量的信息提交
       http协议没有对请求体容量限制   post请求可以提交任意大小的数据

4 HttpServletResponse的功能

4.1 设置响应体

 //response响应对象的功能1:设置响应体
		 resp.setCharacterEncoding("utf-8");  //设置response输出流的编码集
		 //String resp.getCharacterEncoding();//获取response输出流的编码集
		 resp.setContentType("text/html;charset=utf-8");
         //设置reponse的响应头:1 响应内容的格式是html页面 2response输出流的编码集 3浏览器解析使用的编码集
		 //OutputStream resp.getOutputStream();//获取字节输出流
		 //PrintWriter resp.getWriter(); //获取字符输出流
		 //resp.getWriter().print("你好吗?客户端!");

4.2 设置响应头

 //response响应对象的功能2:设置响应头
		 resp.setHeader("aa", "aa_value");

4.3 重定向

//response响应对象的功能3:重定向到/s022      需要添加项目路径
		 resp.sendRedirect("/java37_ee_04_servlet/s022");

4.4 其他方法

//response响应对象的功能4:其他功能
		 //void resp.addCookie(Cookie); 添加cookie
		 //resp.addCookie(new Cookie("c1", "c1_value"));//等价于设置响应头set-cookie
		 //resp.setHeader("set-cookie", "c2=c2_value");//等价于 resp.addCookie(new Cookie("c1", "c1_value"));
		 //resp.sendError(404,"请求的资源不存在!");//设置错误状态码和错误信息
		 //resp.setStatus(404);//设置状态码

5 请求转发、请求包含、重定向的区别(重点)

request.getRequestDispatcher(path).forward(request,response); 请求转发
request.getRequestDispatcher(path).include(request,response); 请求包含
response.sendRedirect(path);                                  重定向

5.1 准备工作:

创建一个html发送6个请求给s31 3个get 3个post  分别是请求转发到s32 请求包含到s33 重定向到s34
  • 页面:test01.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试请求转发+请求包含+重定向</title>
<style  type="text/css">
    table{
        border:1px solid blue;
        width:400px;
        margin:10px auto;
        border-collapse: collapse;
    }
    td,th{
        border:1px solid blue;
        padding:10px;
    }
</style>
</head>
<body>
     <form  action="http://localhost:8080/java37_ee_04_servlet/s31" method="post">
           <input type="hidden" value="2" name="n"/>
          <table>
              <tr>
                   <th>name:</th>
                   <td><input type="text" name="name"/></td>
                   <th><input type="submit"  value="post请求s31 请求转发到s32"/></th>
              </tr>
          </table>
     </form>
     <hr/>
      <form  action="http://localhost:8080/java37_ee_04_servlet/s31" method="get">
          <input type="hidden" value="2" name="n"/>
          <table>
              <tr>
                   <th>name:</th>
                   <td><input type="text" name="name"/></td>
                   <th><input type="submit"  value="get请求s31 请求转发到s32"/></th>
              </tr>
          </table>
     </form>
     <hr/>
     <form  action="http://localhost:8080/java37_ee_04_servlet/s31" method="post">
          <input type="hidden" value="3" name="n"/>
          <table>
              <tr>
                   <th>name:</th>
                   <td><input type="text" name="name"/></td>
                   <th><input type="submit"  value="post请求s31 请求包含到s33"/></th>
              </tr>
          </table>
     </form>
     <hr/>
      <form  action="http://localhost:8080/java37_ee_04_servlet/s31" method="get">
          <input type="hidden" value="3" name="n"/>
          <table>
              <tr>
                   <th>name:</th>
                   <td><input type="text" name="name"/></td>
                   <th><input type="submit"  value="get请求s31 请求包含到s33"/></th>
              </tr>
          </table>
     </form>
     <hr/>
     <form  action="http://localhost:8080/java37_ee_04_servlet/s31" method="post">
          <input type="hidden" value="4" name="n"/>
          <table>
              <tr>
                   <th>name:</th>
                   <td><input type="text" name="name"/></td>
                   <th><input type="submit"  value="post请求s31 重定向到s34"/></th>
              </tr>
          </table>
     </form>
     <hr/>
      <form  action="http://localhost:8080/java37_ee_04_servlet/s31" method="get">
          <input type="hidden" value="4" name="n"/>
          <table>
              <tr>
                   <th>name:</th>
                   <td><input type="text" name="name"/></td>
                   <th><input type="submit"  value="get请求s31 重定向到s34"/></th>
              </tr>
          </table>
     </form>
     <hr/>
</body>
</html>
  • servlet:s31
package com.zhiyou100.servlet03;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo01 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		System.out.println("s31执行了!:::请求方式是:"+request.getMethod());
		System.out.println("s31获取请求参数:name="+request.getParameter("name"));//获取请求参数
		request.setAttribute("aa", "requestAttribute_aa_s31");//设置request域属性
		response.setHeader("bb", "responseHeader_bb_s31");//设置响应头
		
		int n=Integer.parseInt(request.getParameter("n"));//获取请求参数
		
		if(n==2){//请求转发s32
			   System.out.println("s31执行了  n="+n+",请求转发到s32");
			   response.getWriter().print("s31执行了:::::::::::<br/>");
			   request.getRequestDispatcher("/s32").forward(request, response);
		}else if(n==3){//请求包含s33
			   System.out.println("s31执行了  n="+n+",请求包含到s33");
			   response.getWriter().print("s31执行了:::::::::::<br/>");
			   request.getRequestDispatcher("/s33").include(request, response);
		}else if(n==4){//重定向到s34
		    	System.out.println("s31执行了  n="+n+",重定向到s34");
		    	response.getWriter().print("s31执行了:::::::::::<br/>");
		    	response.sendRedirect("/java37_ee_04_servlet/s34");
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
		
	}
}
  • servlet:s32
package com.zhiyou100.servlet03;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo02 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setHeader("bbb", "responseHeader_bbb_s32");//设置响应头
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().print("s32执行了:::method="+request.getMethod()+"<br/>");
		response.getWriter().print("s32执行了:::获取请求参数name="+request.getParameter("name")+"<br/>");
		response.getWriter().print("s32执行了:::获取request域属性:aa=="+request.getAttribute("aa")+"<br/>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
  • servlet:s33
package com.zhiyou100.servlet03;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo03 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setHeader("bbb", "responseHeader_bbb_s33");//设置响应头
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().print("s33执行了:::method="+request.getMethod()+"<br/>");
		response.getWriter().print("s33执行了:::获取请求参数name="+request.getParameter("name")+"<br/>");
		response.getWriter().print("s33执行了:::获取request域属性:aa=="+request.getAttribute("aa")+"<br/>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
  • servlet:s34
package com.zhiyou100.servlet03;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo04 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setHeader("bbb", "responseHeader_bbb_s34");//设置响应头
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().print("s34执行了:::method="+request.getMethod()+"<br/>");
		response.getWriter().print("s34执行了:::获取请求参数name="+request.getParameter("name")+"<br/>");
		response.getWriter().print("s34执行了:::获取request域属性:aa=="+request.getAttribute("aa")+"<br/>");
	}

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

5.2 测试结果

  • 请求转发:post

image

  • 请求转发get

image

  • 请求包含post

image

  • 请求包含get

image

  • 重定向post

image

  • 重定向get

image

5.3 总结(重点)

请求转发和请求包含的区别
相同之处:A请求转发到B  A请求包含到B
1:请求转发和请求包含都是RequestDispatcher的方法
2:都是一次请求被两个servlet处理:一个请求链 可以通过request域对象实现数据共享
3:地址栏显示的都是A
4:请求A和请求B使用的同一种方式(get/post)
不同之处:
1:响应头的设置:
     请求转发:AB都能设置响应头
     请求包含:只有A可以设置响应头
2:响应体的设置
     请求转发:只有B可以设置响应体
     请求包含:AB都可以设置响应体
请求转发和重定向的区别
相同之处:都可以实现资源的跳转
不同之处:A请求转发到B  A重定向到B
1  B处理请求的方式不同
      请求转发AB的请求方式相同  但重定向B固定是get请求
2  请求个数不同
      请求转发是一次请求 被两个servlet处理
      重定向是两次请求 分别被两个servlet处理
3  是否可以使用request域对象
       请求转发的servlet是同一个请求链  可以使用request域对象实现数据共享
       重定向是两次请求  不能使用request域对象实现数据共享
4  状态码
       请求转发是200
       重定向 第一次请求是302 第二次是200
5 方法不同
       请求转发是RequestDispatcher的forward方法
       重定向是response的sendRedirect方法
6 地址栏显示不同
       请求转发地址栏显示的是A
       重定向地址栏显示的是B

补充:快捷创建servlet

通过eclipse快捷创建servlet

image
image
image

posted @ 2021-09-29 19:12  RenVei  阅读(40)  评论(2编辑  收藏  举报