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
- 请求转发get
- 请求包含post
- 请求包含get
- 重定向post
- 重定向get
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