版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Coder_Boy_/article/details/82290259
HTTP协议
什么是HTTP协议
- 浏览器和服务器之间通信的规范;
- 它规定了通信的方式以及数据格式;
通信方式
- 建立连接
- 发送请求
- 接收响应
- 关闭连接
特征是一次请求需建立一次连接,目的是降低服务器压力。
数据格式
请求数据包
- 请求行:基本信息
- 消息头:数据的描述信息
- 实体内容:数据
响应数据包
- 状态行:基本信息
- 消息头:数据的描述信息
- 实体内容:数据
对开发的要求
- 通信方式已经由浏览器和服务器实现;
- 数据的打包和传输由浏览器和服务器实现;
- 程序要需要通过Servlet处理请求和响应数据;
- 其中request处理请求数据,response处理响应数据;
注册
Servlet运行原理
请求方式
什么是请求方式
- 浏览器向服务器传递数据的方式
- req.getMethod()
- 有多种传递数据的方式,其传递数据的能力不同,解决乱码的方案也不同
GET
- 采用路径传参,参数可见
- 隐私性差
- 因为路径大小有限制(2K),因此数据大小受限
- 默认的所有请求都是GET请求(网址、超链接、提交表单)
POST
- 采用实体内容传参,参数不可见
- 隐私性好
- 实体内容专门用来传参,大小不受限制
使用场景
- 向服务器索取(查询)数据时通常用GET
- 向服务器提交(保存)数据时通常用POST
案例演示:
工程案例目录结构
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>Servlet01_v2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency>
</dependencies>
</project>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Servlet01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 1.注册别名:给这个类取一个别名,
该别名只能在此文件中使用,与注册访问路径中对应 -->
<servlet>
<servlet-name>time</servlet-name>
<servlet-class>web.TimeServlet</servlet-class>
</servlet>
<!-- 2.注册访问路径:根据别名给这个类
取一个网名,用于在网络上访问 -->
<servlet-mapping>
<servlet-name>time</servlet-name>
<url-pattern>/tt</url-pattern>
</servlet-mapping>
</web-app>
TimeServlet.java
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TimeServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//1.获取请求数据
//1.1请求行
System.out.println("协议类型:"+req.getProtocol());
System.out.println("请求方式:"+req.getMethod());
System.out.println("Servlet路径:"+req.getServletPath());
//1.2消息头(key-value)
//getHeaderNames()返回所以key的迭代器,
//Enumeration是比Iterator更古老的迭代器
Enumeration e = req.getHeaderNames();
while(e.hasMoreElements()){
String key = e.nextElement().toString();
String value = req.getHeader(key);
System.out.println(key+":"+value);
}
//1.3实体内容
//由于本案例没有给服务器传递业务数据,
//因此实体内容为空,后面再演示
//2.输出响应数据
//2.1状态行:由服务器自动写。
// res.setContentType("application/json;charset=utf-8");//指定返回的格式为JSON格式
// res.setCharacterEncoding("UTF-8");//setContentType与setCharacterEncoding的顺序不能调换,否则还是无法解决中文乱码的问题
// String jsonStr ="{\"id\":\"123\",\"name\":\"小黎\"}";
// PrintWriter out =null ;
// out =res.getWriter() ;
// out.write(jsonStr);
// out.close();
// System.out.println(res.getCharacterEncoding());// 如果未指定字符集,则将使用ISO-8859-1
//2.2消息头
res.setContentType("text/html");
//2.3实体内容
PrintWriter pw = res.getWriter();
//用Servlet直接拼一个完整网页太麻烦了,
//将来有更好的办法(jsp),当jsp以Servlet
//为基础,所以也必须掌握Servlet怎么用。
//此处省略HTML中大部分的标签,直接写出
//内容,浏览器有纠错能力,依然能正常显示。
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String now = sdf.format(date);
pw.println("<h1>"+now+"</h1>");
pw.close();
}
@Override
public void init() throws ServletException {
System.out.println("init");
}
}
将Servlet01_v2工程部署到Tomcat上后,运行Tomcat启动案例工程,
浏览器录入http://localhost:8080/Servlet01_v2/tt即可:
如果没有错误,最终页面展示效果应如下图:
后台控制台输出截图: