文章目录
Servlet 入门
HTTP 协议
是一种客户端请求和响应的标准协议
浏览器与服务器交互流程
- 客户端发送 HTTP 请求,服务器接收后解析请求,处理业务逻辑并返回 HTTP 响应。
- 可通过浏览器 F12 的 Network 面板查看
http请求:- 请求行(第一行,包含请求方法,请求路径,请求协议版本)
- 消息头-请求头(键值对)
传递请求附加信息,如 Referer(标识请求来源) - 请求正文(get请求没有请求体(数据),参数跟在地址后面)
http响应:- 相应行(协议/版本/状态码)
成功状态码:200 - 消息头-响应头(键值对)
传递响应附加信息,如 Location(重定向地址[更换域名])、Refresh(自动跳转,单位秒) - 响应正文(结果)
- 相应行(协议/版本/状态码)
书写格式与协议特点
- 浏览器请求格式:
httP://host[:port](域名)/项目路径/资源?参数 - 特点:
支持客户 / 服务器模式简单快速(GET/POST 等请求方法)灵活(传输任意类型数据)无连接(每次连接只处理一个请求,HTTP1.1 支持可持续连接)无状态(对事物的处理没有记忆能力)
Tomcat 服务器
服务器统一接收客户端的请求,再分发给各种资源,处理结果再由服务器返回给客户端
特点
- 轻量级 Web 容器,开源免费,兼容性强、稳定可靠
关键操作
- 目录结构:
- bin(启动 / 关闭脚本)
- conf(配置文件,如 server.xml 配置端口、web.xml 配置 Web 应用)
- webapps(存放 Web 项目)
- work(JSP 编译后的文件)
- 启动与关闭:双击 bin 目录的 startup.bat 启动,shutdown.bat 关闭;启动后通过
http://localhost:8080访问
IDEA配置Tomcat
- File——>settings——>选择 “Appliction Servers”,点击右侧的 “+” 号,选择 “TomcatServer”
- ——>设置 Tomcat 的安装目录——>点击Apply
IDEA中创建Web项目
- File——>New——>Project——>Jakarta EE——>Template选择Web application——>选择部署的Tomcat Server——>Next
- JDK1.8选择的是Java EE8——>Specification选择web Profile——>Create
- 设置站点名
Servlet的实现
客户端发起请求
服务器解析请求并匹配 Servlet
Servlet 实例化与初始化(首次请求) ★
处理请求(service) ★
生成响应返回客户端
Servlet 销毁(服务器关闭时) ★
继承 HttpServlet 抽象类
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyHttpServlet extends HttpServlet {
//重写doGet/doPost/service方法
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h1>Hello, GenericServlet!</h1>");
}
// 处理 GET 请求(如浏览器直接访问、链接点击)
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h1>处理 GET 请求</h1>");
}
// 处理 POST 请求(如表单提交)
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h1>处理 POST 请求</h1>");
}
}
继承 GenericServlet 抽象类
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class MyGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h1>Hello, GenericServlet!</h1>");
}
}
实现 Servlet 接口
import javax.servlet.*;
import java.io.IOException;
public class MyFirstServlet implements Servlet {
// 1. 初始化:Servlet 实例创建后调用,仅执行一次
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("Servlet 初始化...");
}
// 2. 获取配置信息(如初始化参数)
@Override
public ServletConfig getServletConfig() {
return null;
}
// 3. 核心:处理请求并生成响应(每次请求都会调用)
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
// 向客户端输出内容
response.getWriter().write("<h1>Hello, Servlet!</h1>");
}
// 4. 获取 Servlet 信息(如版本、作者等)
@Override
public String getServletInfo() {
return "MyFirstServlet v1.0";
}
// 5. 销毁:Servlet 被移除时调用(如服务器关闭),释放资源
@Override
public void destroy() {
System.out.println("Servlet 销毁...");
}
}
注解配置
//@WebServlet("/hello") 注意“/”
//多路径映射
//@WebServlet(name="Servlet01",urlPatterns={"/ser01",'/ser001'})
//@WebServlet(name="Servlet01",value="/ser01")
HttpServletRequest 对象
接收请求
-
常用方法:
getMethod()(获取请求方式Get/Post)getRequestURL()(获取请求 的完整URL)getRequestURI()(获取请求 URI,部分名称)getQueryString()(获取请求的参数[字符串])getProtocol()(获取HTTP版本号)getContextPath()(获取webapp站点)
-
获取请求参数:
-
单个参数:
String getParameter(name) -
多个同 name 参数:
String[] getParameterValues(String name)
-
请求乱码问题
- GET 请求:Tomcat8 及以上默认已处理,若仍有乱码可修改服务器编码;Tomcat7 及以下需对获取的参数进行
new String(param.getBytes("ISO-8859-1"), "UTF-8")转码 - POST 请求:在获取参数前设置
request.setCharacterEncoding("UTF-8")
请求转发
request.getRequestDispatcher("目标资源路径").forward(request, response),一种服务器行为,属于服务器内部跳转,地址栏不变化,一次请求,可共享 request 作用域数据
request 作用域
数据仅在一次请求的转发链中有效,即服务器跳转有效
设置域对象内容
setAttribute(String name, Object value)获取域对象内容
``getAttribute(String name)`
删除域对象内容
removeAttribute(String name)
HttpServletResponse 对象
响应数据
- 响应文本:
PrintWriter getWriter()获取字符输出流,用于响应字符串、HTML 等文本内容 - 响应二进制数据:
ServletOutputStream getOutputStream()获取字节输出流,用于响应一切数据
注意:二者不可同时使用,因为response对象只有一个
// 字符输出流
PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h2>Hello</h2>");
// 字节输出流
ServletOutputStream out =
response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h2>Hello</h2>".getBytes());
// 设置响应MIME类型
response.setHeader("content-type","text/html");
响应乱码问题:
- 字符数据乱码:
response.setContentType("text/html;charset=UTF-8")(同时设置响应内容类型和两端的编码,推荐),或分开设置response.setCharacterEncoding("UTF-8")和response.setHeader("Content-Type", "text/html;charset=UTF-8")
重定向
响应码:302,response.sendRedirect("目标资源路径"),属于客户端跳转,地址栏会变化,两次请求,不可共享 request 作用域数据
| 对比项 | 请求转发(服务端行为) | 重定向(客户端行为) |
|---|---|---|
| 跳转次数 | 1 次 | 2 次 |
| 地址栏 | 不变 | 变化 |
| 共享数据 | 可共享 request 作用域 | 不可共享 request 作用域 |
| 跳转范围 | 仅能在当前服务器内部 | 可跳转到任意资源(同服务器、其他服务器) |




611

被折叠的 条评论
为什么被折叠?



