【JavaWeb-Servlet】笔记(1)--- Servlet规范;Servlet接口实现类;Servlet对象生命周期;HttpServletResponse/HttpServletRequest;请求对象和响应对象生命周期;欢迎资源文件
前言:
Servlet规范介绍:
1.servlet 规范来自于 JAVAEE 规范中的一种。
2.作用:
1)指定【动态资源文件】开发步骤。
2)指定Http服务器调用动态资源文件规则。
3)指定Http服务器管理动态资源文件实例对象规则。
Servlet接口实现类:
1.Servlet接口来自于Servlet规范下的一个接口,这个接口存在于Http服务器提供的 jar 包中。
2.Tomcat服务器(也是一种Http服务器)下的lib文件中有一个 servlet-api.jar 来存放 Servlet 接口(javax.servlet.Servlet接口)。
3.Servlet规范认为,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类。
Servlet接口实现类开发步骤:
第一步:创建一个Java类继承 HttpServlet父类,使之成为一个Servlet接口实现类。
提问:为什么不直接创建一个Java类实现Servlet接口?
因为Servlet接口中除了doGet()和doPost(),还有很多抽象方法,但是非抽象类实现接口,必须要重写接口中的所有方法,而我们需要使用的方法只有doGet()和doPost(),这样就大大增加了我们写代码的工作量。而通过 HttpServlet 抽象类(作为一个“中介”)来实现Servlet接口,将我们需要使用的两个方法保留,而将Servlet中我们不需要的方法重写为非抽象方法,这样我们再创建一个Java类来继承HttpSerlet抽象类,既得到了我们需要用的两个方法,又不需要重写接口中的其他方法,so nice ~ ~
第二步:重写 HttpServlet 父类两个方法,doGet( )或doPost( )。
package com.burnyouth.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class OneServlet extends HttpServlet {
//执行doGet()还是doPost()取决于客户端服务器发过来的请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneSelect类针对浏览器发送GET请求方式处理");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneSelect类针对浏览器发送POST请求方式处理");
}
}
第三步:将 Servlet 接口实现类信息【注册】到Tomcat服务器。
文件路径:【网站】--->【web】--->【WEB-INF】--->web.xml
<!--将Servlet接口实现类的路径地址交给Tomcat-->
<servlet>
<!--声明一个变量存储servlet接口实现类路径-->
<servlet-name>mm</servlet-name>
<!--声明servlet接口实现类路径-->
<servlet-class>com.burnyouth.controller.OneServlet</servlet-class>
</servlet>
<!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
<servlet-name>mm</servlet-name>
<!--设置简短请求别名,别名在书写时必须以"/"为开头-->
<url-pattern>/one</url-pattern>
</servlet-mapping>
如果此时用户通过浏览器向 Tomcat 索要 OneServlet 时的地址: http://localhost:8080/myWeb/one
Servlet对象生命周期:
1.网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责创建。开发人员不能手动创建Servlet接口实现类的实例对象,所以我们以后几乎不需要再写 main方法了。
2.默认的情况下,Http服务器只有在接收到对于当前 Servlet 接口实现类第一次请求时才会自动创建这个Servlet接口实现类的实例对象。
如何使 Http 服务器在启动时自动创建某个Servlet接口实现类的实例对象?
<servlet>
<!--声明一个变量存储servlet接口实现类类路径-->
<servlet-name>oneServlet</servlet-name>
<servlet-class>com.burnyouth.controller.OneServlet</servlet-class>
<!--填写一个大于0的整数即可-->
<load-on-startup>1</load-on-startup>
</servlet>
3.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象。
4.在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁。
HttpServletResponse接口:
1.介绍:
1)HttpServletResponse 接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。
2)HttpServletResponse 接口实现类由Http服务器负责提供。
3)HttpServletResponse 接口负责将 doGet/doPost 方法的执行结果写入到【响应体】中交给浏览器。
4)开发人员习惯于将 HttpServletResponse 接口修饰的对象称为【响应对象】。
2.主要功能:
1) 将执行结果以二进制形式写入到【响应体】
package com.burnyouth.controller;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//演示 HttpServletResponse接口的功能一:
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//假设result为执行结果
String result = "Hello World";
//通过响应对象,向Tomcat索要输出流
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
//通过输出流,将执行结果以二进制形式写入到响应体
out.write(result);
}
}
注意:
out.writer方法可以将【字符】,【字符串】,【ASCII码】写入到响应体,所以实际开发过程中,都是通过out.print()将真实数据写入到响应体(防止数字被以ASCII码的方式解读等)。
2) 设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】。
package com.burnyouth.controller;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//既有文字信息又有HTML标签命令
String result="Java<br/>HTML<br/>";
//在得到输出流之前,设置响应头content-type属性(使浏览器用正确的编译器解读数据)
response.setContentType("text/html;charset=utf-8");
//向Tomcat索要输出流
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
//通过输出流将结果写入到响应体
out.print(result);
}
}
注意:
在默认的情况下,content-type属性的值为“text”,此时浏览器将会采用【文本编译器】对响应体二进制数据进行解析。
所以一定要在得到输出流之前,通过响应对象对响应头中content-type属性进行重新赋值,令浏览器使用正确的编译器解读数据。
3) 设置响应头中【location】属性,将一个请求地址赋值给 location,从而控制浏览器向指定服务器发送请求。
package com.burnyouth.controller;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
String result = "http://www.baidu.com";
//通过响应对象,将地址赋值给响应头中location属性
try {
//浏览器在接收到响应包之后,如果发现响应头中存在location属性,自动通过地址栏向location指定网站发送请求
response.sendRedirect(result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
HttpServletRequest接口:
1.介绍:
1)HttpServletRequest 接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。
2)HttpServletRequest 接口实现类由Http服务器负责提供。
3)HttpServletRequest 接口负责在doGet/doPost方法运行时读取Http请求协议包中信息。
4)开发人员习惯于将 HttpServletRequest 接口修饰的对象称为【请求对象】。
2.作用:
1)可以读取Http请求协议包中【请求行】信息。
知识小贴士:
URI:资源文件精准定位地址(请求行并没有URI属性),实际上URI就是URL中截取的一个字符串,URI(格式为:/网站名/资源文件名)用于让Http服务器对被访问的资源文件进行定位。
package com.burnyouth.controller;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//通过请求对象,读取【请求行】中【url】信息
String url = request.getRequestURL().toString();
//通过请求对象,读取【请求行】中【method】信息
String method = request.getMethod();
//通过请求对象,读取【请求行】中URI信息
String uri = request.getRequestURI();// substring
System.out.println("URL: "+url);
System.out.println("method: "+method);
System.out.println("URI:"+uri);
}
}
控制台:
2)可以读取保存在Http请求协议包中【请求头】或则【请求体】中的请求参数信息。
package com.burnyouth.controller;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Enumeration;
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//通过请求对象获得【请求头】中【所有请求参数名】(将所有请求参数名称保存到一个枚举对象进行返回)
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
//通过请求对象读取指定的请求参数的值
String value = request.getParameter(paramName);
System.out.println("请求参数名 " + paramName + "--->请求参数值 " + value);
}
}
}
3)可以代替浏览器向Http服务器申请资源文件调用(后面再曰)
请求对象和响应对象生命周期:
1.在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】。
2.在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】,作为实参传递到方法,确保doGet/doPost正确执行。
3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁。
4、换一种说法:
【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中。
【请求对象】和【响应对象】相当于用户在服务端的代言人。
5、请求对象和响应对象生命周期图示:
欢迎资源文件:
1.试问,用户愿意记“杠来杠去”的网站资源文件名还是网站名呢?显然是后者,通过在地址栏中输入网站名,然后再通过“点点点”就可以访问这个网站下的各种资源文件了!
2.什么是欢迎资源文件?
用户发送了一个针对某个网站的【默认请求】时,此时由Http服务器会自动从当前网站返回的资源文件就是欢迎资源文件。
默认请求张啥样?
http://localhost:8080/myWeb(当前网站)/(打个比方)
正常请求张啥样?
http://localhost:8080/myWeb/index.html(打死比方)
3、在我们没有手动指定欢迎资源文件是谁时,Tomcat 指定的默认欢迎资源文件规则:
1)文件位置:Tomcat安装位置/conf/web.xml
2)规则命令:
咱们浅浅地翻译一下哈:服务器返回欢迎资源文件,先找一下有没有【index.html】,没有?再找一下有没有【index.htm】,没有?再找一下【index.jsp】,还没有???来人,给我把404打在公屏上!
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
4.手动配置当前网站的默认欢迎资源文件规则:
1)规则位置: 网站/web/WEB-INF/web.xml
2)规则命令:
<welcome-file-list>
<!--
自定义默认欢迎资源文件规则:
servlet作为默认欢迎资源时,开头斜线必须抹掉
-->
<welcome-file>login.html</welcome-file>
<welcome-file>user/find</welcome-file>
</welcome-file-list>
自定义设置网站的欢迎资源文件定位规则后,此时 Tomcat 默认定位规则将失效。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术