JavaWeb核心
HTTP协议
概念:HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
HTTP协议特点:
1.基于TCP协议:面向连接,安全
2.基于请求-响应模型的:一次请求对应一次响应
3.HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
缺点:多次请求之间不能共享数据。Java中使用会话技术(Cookie、Session)来解决这个问题
优点:速度快
HTTP-请求数据格式
请求数据分为三部分:
1.请求行:请求数据的第一行。
2.请求头:第二行开始,格式为key:value形式。
3.请求体:POST请求的最后一部分,存放请求参数
常见的HTTP请求头:
HTTP-响应数据格式
响应数据分为三部分:
1.响应行:响应数据的第一行。
2.响应头:第二行开始,格式为key:value形式
3.响应体:最后一部分。存放响应数据
常见的HTTP响应头:
状态码分类:
注: 状态码:https://cloud.tencent.com/developer/chapter/13553
Web服务器——Tomcat
Web服务器:Web服务器是一个应用程序(软件),对于HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"
Tomcat
概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量javaEE规范。
基本使用:
部署项目:
IDEA中创建Maven Web项目
IDEA中使用Tomcat:
1.集成本地tomcat
2.使用Maven-Tomcat插件
Servlet
简介:
1.Servlet是Java提供的一门动态web资源开发技术
2.Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
Servlet 快速入门:
1.创建web项目,导入Servlet依赖坐标
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
2.创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
public class ServletDemo1 implements Servlet{ public void service(){} }
3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet("/demo1") public class ServletDemo1 implements Servlet {
4.访问:启动Tomcat,浏览器输入URL访问该Servlet
http://localhost:8080/web-demo/demo1
Servlet执行流程:
1.Servlet由谁创建?Servlet方法由谁调用?
Servlet由Web服务器创建,Servlet方法由服务器
2.服务器怎么知道Servlet中一定有service方法?
因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法
Servlet生命周期
对象的生命周期指一个对象从被创建到被销毁的整个过程
Servlet运行在Servlet容器(Web服务器)中,其生命周期由容器来管理,分为四个阶段:
1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
2.初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作。该方法只调用一次
3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
4.服务终止:当需要释放内存或者容器关闭时,容器都会调用Servlet实例的destroy()方法完成资源的释放。在destory()方法调用之后,容器会释放这个Servlet
实例,该实例随后会被Java的垃圾收集器所回收
Servlet方法介绍:
1.初始化方法,在Servlet被创建时执行,只执行一次
2.提供服务方法,每次Servlet被访问,都会调用该方法
3.销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
4.获取ServletConfig对象
5.获取Servlet信息
@WebServlet(urlPatterns = "/demo2",loadOnStartup = 1) public class ServletDemo2 implements Servlet { /** * 初始化方法 * 1.调用时机:默认情况下,Servlet被第一次访问时,调用 * *loadOnStartup: * 2.调用次数:一次 * @param config * @throws ServletException*/ public void init(ServletConfig config) throws ServletException { System.out.println("init..."); } /** * 提供服务 * 1.调用时机:每次Servlet被访问时调用 * 2.调用次数:多次 * * * @param req * @param res * @throws ServletException * @throws IOException*/ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("servlet hello world~"); } /** * 销毁方法 * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁调用 * 2.调用次数:一次 * */ public void destroy() { System.out.println("destroy..."); } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
Servlet体系结构
HttpServlet
1.HttpServlet使用步骤
1.继承HttpServlet
2.重写doGet和doPost方法
2.HttpServlet原理
获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
Servlet urlPatten配置
Request和Response
Request
概念:是服务器创建的请求对象,request对象是来获取请求消息
Resqest获取请求数据
请求数据分为三部分:
1.请求行:GET/request-demo/req1?username=zhangsan HTTP/1.1
String getMethod():获取请求方式:GET
String getContextPath():获取虚拟目标(项目访问路径):/request-demo
StringBuffer getRequestURL():获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
String getRequestURL():获取URL(统一资源标识符):/request-demo/req1
String getQuerString():获取请求参数(GET方式):username=zhangsan&password=123
2.请求头:User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
String getHeade(String name):根据请求头名称,获取值
3.请求体:username=superbaby&password=123
ServletlnputStream getlnputStream():获取字节输入流
BufferedReader getReader():获取字符输入流
Request通用方式获取请求参数
Map<String,String[]> getParameterMap():获取所有参数Map集合
String[ ] getParameterValues(String name) : 根据名称获取参数值(数组)
String getParamete(String name) : 根据名称获取canshuz(单个值)
使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:
@WebServlet("/req3") public class RequestDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
可以使用Servlet模板创建Servlet更高效
Request请求参数中文乱码处理
解决方案:
POST:设置输入流的编码
request.setCharacterEncoding("UTF-8");
通用方式:(GET/POST):先编码,再解码
new String(username.getBytes(IOS-8859-1),"UTF-8);
Request请求转发
请求转发(forward):一种在服务器内部的资源跳转方式
实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用Request对象
1 | void setAttribute(String name,Object o):存储数据到request域中<br>Object getAttribute(String name):根据key,获取值<br> void removeAttribute(String name):根据key,删除该键值对 |
Response
概念:服务器端发送给客户端的数据
Response设置响应数据功能介绍
响应数据分为三部分:
1.响应行:HTTP/1.1 200 OK
void setStatus(int sc):设置响应状态码
2.响应头:Content-Type:text/html
void setHeader(String name,String value):设置响应头键值对
3.响应体:<html><head></head><body></body></html>
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
Response完成重定向
重定向(Redirect):一种资源跳转方式
实现方式:
//1.设置响应状态码 302 response.setStatus(302); //2.设置响应头Location response.setHeader("Location","资源B的路径");
//简化方式完成重定向 response.sendRedirect("资源B的路径");
重定向特点:
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部,外部均可)
两次请求,不能在多个资源使用request共享数据
Response响应字符数据
使用:
1.通过Response对象获取字符输出流
PrintWriter writer = resp.getWriter();
2.写数据
writer.writer("aaa");
注:
Response响应字节数据
使用:
1. 通过Response对象获取字符输出流
ServletOutputStream outputStream = resp.getOutputStream();
2. 写数据
outputStream.write(字节数据);
IOUtils工具类使用
1. 导入坐标
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency>
2. 使用
IOUtils.copy(输入流,输出流);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现