目录
1、Http协议
1.1、协议介绍
协议:双方的约定。
网络协议:计算机网络中进行数据交换而建立的规则、标准或约定等等。
http协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计http的最初目的是为了提供一种发布和接受html页面的方法。
互联网数据交互一种规则。http特点:
1、http协议是基于tcp协议的。属于应用层
2、默认端口是80(如果是80可以省略:80) 地址栏可以省略不写
http://www.baidu.com
http://www.baidu.com:803、基于请求响应模型。
请求:浏览器向服务器发送的信息,request
响应:服务器向浏览器发送的信息,response
请求和响应涉及到数据的发送。涉及到数据的格式。请求和响应的格式,满足http的规范。
1.2、Post请求方式
所有请求信息 【请求的url ,请求方式,请求状态码, 请求端口】
请求行
请求头
请求体 (Post请求方式特有,Post请求参数,以请求体的方式存在)
1.3、Get请求方式
所有请求信息 【请求的url (请求行),请求方式,请求状态码, 请求端口, 参数 】
请求行
请求头
Accept: text/html,image/* 客户端识别文件类型
Accept-Charset: ISO-8859-1 客户端字符集
Accept-Encoding: gzip 客户端支持编码类型 gzip 压缩格式
Accept-Language:zh-cn 客户端语言
Host: www.yanqi.com:80 访问服务器地址
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT和Last-Modified 一起使用 控制缓存 (tomcat 提供缓存 过滤器 缓存处理)
Referer: http://www.itcast.com/index.jsp (重要) 防止盗链 获取网站域名地址
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 浏览器类型(文件下载时,不同浏览器进行不同处理) 不同的浏览器器存在兼容性!!
Connection: close/Keep-Alive 请求后连接是关闭还是保持
Date: Tue, 11 Jul 2000 18:23:51 GMT 请求时间
1.4、 请求的http中post和get区别
1、post请求行,请求头,请求体
2、get请求行,请求头,没有请求体
3、post请求的参数在请求体中,理论上来说是无限大,安全性相对较高
4、get请求的参数在请求行中,通过url拼接,安全性相对较低
1.5、状态码
常见状态码:
200 - 请求成功
302 – 请求重定向 (response+302)==重定向
404 - 请求的资源(网页等)不存在 (请求的url找不到具体的资源,例如找不到servlet,或者html,如果遇到404的错误,通常检查url是否写错,或者url-patten 是否配置错。)
500 - 内部服务器错误(如果遇到500的情况,表示的是java代码出错误)
2、HttpServletRequest
2.1、获取请求API
方法 | 说明 |
---|---|
getMthod() | 获取请求方式 |
getRequestURI() | 获取请求的uri(相对路径) |
getRequestURL() | 获取请求的url(绝对路径) |
getRemoteAddr() | 获取请求的地址 |
getProtocol() | 获取请求的协议 |
getLocalPort() | 获请请求的端口 |
getHeader("Host") | 获取请求的端口+地址 |
@WebServlet(urlPatterns = "/RequestAPIServlet")
public class RequestAPIServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//相对地址
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//绝对地址
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//获取请求地址
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
//获取请求的协议
String protocol = request.getProtocol();
System.out.println(protocol);
//获取请求的端口
int localPort = request.getLocalPort();
System.out.println(localPort);
//获取请求的端口+地址
String host = request.getHeader("Host");
System.out.println(host);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
请求路径
2.2、获取请求参数API
方法 | 说明 |
---|---|
public String getParameter(String name) | 获取请求指定单个参数 |
public String[] getParameterValues(String name) | 获取请求指定多个参数 |
public Map<String,String[]> request.getParameterMap() | 获取页面所有提交过来的数据 |
准备一个页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="RequestAPIServlet02" method="post">
user:<input type="text" name="username"><br>
sex:<input type="text" name="sex"><br>
age:<input type="text" name="age"><br>
爱好:<input type="checkbox" name="hobby" value="吃饭">吃饭
<input type="checkbox" name="hobby" value="睡觉">睡觉
<input type="checkbox" name="hobby" value="打豆豆">打豆豆<br>
<input type="submit">
</form>
</body>
</html>
创建servlet类测试
@WebServlet(urlPatterns = "/RequestAPIServlet02")
public class RequestAPIServlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决post请求乱码问题
request.setCharacterEncoding("utf-8");
//方式一:通过getParameter方法获取
String username = request.getParameter("username");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
System.out.println("username:"+username);
System.out.println("sex:"+sex);
System.out.println("age:"+age);
System.out.println("=================");
//方式二:通过getParameterValues方法获取,返回的是数组
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//通过getParameterMap方法获取,返回是一个map集合
System.out.println("=============");
Map<String, String[]> parameterMap = request.getParameterMap();
for (String key : parameterMap.keySet()) {
String[] strings = parameterMap.get(key);
for (String value : strings) {
System.out.println(value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
启动tomcat服务器,访问请求路径
点击提交按钮后,页面跳转到了RequestAPIServlet02类
2.3、Post请求乱码问题解决
post方式请求如果不设置编码格式,会出现以下乱码问题
为了能够解决这个乱码问题,我们需要在servlet的开头进行设置编码。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决post请求乱码问题
request.setCharacterEncoding("utf-8");
//指定获取输入框内容,如果获取不到返回null
String username = request.getParameter("username");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
System.out.println(username);
System.out.println(sex);
System.out.println(age);
}
2.4、Get请求乱码的解决
tomcat8 以上的版本都默认解决了get请求乱码问题,无需关注。
如果是tomcat8以下版本出现乱码问题想要解决,通过以下代码
String username = request.getParameter("username");
username = new String(username.getBytes("iso8859-1"),"utf-8");
System.out.println(username);
2.5、转发
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//转发到指定页面
// request.getRequestDispatcher("index.jsp").forward(request,response);
//转发指定servlet,注意:请求方式要与转发的请求方一致
request.getRequestDispatcher("ServletDemo").forward(request,response);
}
转发:
一次请求一次响应。
转发是服务器内部行为。
url不会发生改变。
3、HttpServletResponse
3.1、常用API
方法 | 说明 |
---|---|
public void setStatus(int status) | 设置响应状码 |
public void setHeader( String name,String value) |
设置响应该头 |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//重定向
response.setStatus(302);
response.setHeader("Location","http://localhost:8081/index.jsp");
//这种方法等价于以上两行代码
response.sendRedirect("http://localhost:8081/index.jsp");
}
3.2、重定向
重定向: 客户端形行,一次请求,把上一个url清空,重新响应了一个新的url,最终看到是新的url,重定向不能返回上一个url。
3.3、转发和重定向的区别
在request中有个转发进行页面跳转,而response中的重定向也是页面跳转,那么它们两个有什么区别呢?
重定向(redirect):属于客户端行为,一次请求两个url,url会在地址栏中显示,不能返回上一个历史记录,不能携带数据
转 发(forward): 属于服务器行为,一次请求一个url,url地址始终只有一个,可以携带数据
3.4、 设置响应体/响应浏览内容
方法名 | 说明 |
---|---|
setContentType(String charset) | 设置响应字符集(解决响应乱码问题) |
getWriter() | 把响应内容以流的形式输出(响应给浏览器) |
getHeader() | 设置响应头 |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应体及响应乱码
response.setContentType("text/html;charset=utf-8");
//响应给浏览器
PrintWriter writer = response.getWriter();
writer.println("<h2>servlet是动态网页技术</h2>");
writer.println("<font style='color:red'>servlet</font>");
response.getWriter().println("从后台servlet响应给浏览器的");
}
3.5、解决响应乱码问题
//设置响应体及响应乱码
response.setContentType("text/html;charset=utf-8");
3.6、自动刷新
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应体及响应乱码
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("对不起,你访问的资源不存在,3秒之后跳转到百度网站!!");
response.setHeader("refresh","3;url=https://www.baidu.com");
}
4、域对象
4.1、什么是域对象
一个有作用范围的对象,可以在范围内共享数据。
常见的域对象
Request 范围是一次请求。
Session 范围是一次会话。
ServletContext(application) 范围是整个项目中,直到服务器关闭。
4.2、域对象共有方法
方法 | 说明 |
---|---|
void setAttribute(String name,Object obj) | 设置数据 |
Object getAttribute(String name) | 获取数据 |
void removeAttribute(String name) | 删除数据 |
4.3、Request域
代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据。
AServlet类
@WebServlet(urlPatterns = "/AServlet01")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是AServlet");
request.setAttribute("checkCode", "6666");
//转发
request.getRequestDispatcher("BServlet01").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
BServlet类
@WebServlet(urlPatterns = "/BServlet01")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是BServlet");
Object checkCode = request.getAttribute("checkCode");
System.out.println(checkCode);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
请求Aservlet01
4.4、Session域
session域对象,作用范围:一次会话 (打开浏览器 ,操作数据 ,关闭浏览器)。
AServlet类
@WebServlet(urlPatterns = "/AServlet02")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是AServlet");
HttpSession session = request.getSession();
session.setAttribute("checkCode","5699");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
BServlet类
@WebServlet(urlPatterns = "/BServlet02")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是BServlet");
HttpSession session = request.getSession();
Object checkCode = session.getAttribute("checkCode");
System.out.println("从session域获取到的验证码为:"+checkCode);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
请求AServlet02路径
再请求BServlet02路径
4.5、ServletContext域
ServletContext生命周期
1、何时创建?
项目加载时,创建。
2、何时销毁?
项目服务器关闭时,销毁。3、作用范围?
与项目共存亡(多个servlet都可以操作它)。
AServlet类
@WebServlet(urlPatterns = "/AServlet03")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = request.getServletContext();
servletContext.setAttribute("checkCode","6998");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
BServlet类
@WebServlet(urlPatterns = "/BServlet03")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = request.getServletContext();
Object checkCode = servletContext.getAttribute("checkCode");
System.out.println(checkCode);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
请求路径
结果