目录
(3.2) 在Web应用的web.xml文件中使用servlet-mapping元素定义虚拟路径。
一、Servlet技术:运行在服务器端的程序。
(1)Servlet知识点总览。
Servlet的运行:必须要支持Servlet标准的Web容器,像Tomcat、Jboss、Weblogic、WebSphere、Jetty等都支持。
(2)servlet类实例化时间的两种方式。
(1)客户端第一次请求创建servlet实例。
在客户端发起第一次请求时,服务器端会创建一个新的 Servlet 实例(使用无参构造器或 init 方法)。
(2)服务器启动时创建servlet对象。
如果在配置了 load-on-startup 参数为非 0 值时,Servlet 容器在启动 Web 应用时会预先实例化指定的 Servlet,并调用其 init 方法。这样就能提前加载并初始化 Servlet 对象,当第一次请求到来时可以直接使用。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>proxy.demo.test</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
(3)servlet的生命周期方法。
每一次请求都会使用同一个Servlet实例来处理,直到Servlet容器关闭或Web应用程序被卸载为止。
通常情况下,Servlet实例的生命周期包括以下三个阶段:
-
init()
: 当Servlet容器创建Servlet实例对象时,会调用init()
方法来对Servlet进行初始化设置,该方法只会执行一次。 -
service()
:在接收到客户端请求时,Servlet 容器会调用该方法。在此方法中,我们可以编写处理请求并生成响应的代码。 -
destroy()
:当 Servlet 容器关闭或卸载 Servlet 应用程序时调用此方法。在 Servlet 生命周期的末尾,该方法用于释放这个 Servlet 实例使用的所有资源。
以上生命周期方法的执行顺序是:
1.init()
-> 2.service()
-> 3.destroy()
注意:注意变量的改变,Servlet容器要求Servlet类必须具有线程安全性,因为Servlet实例对象可能同时处理多个并发请求。
public class test extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("你好");
}
int number = 1;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(number++);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
第一次访问:创建实例,并初始化(这里是第一次请求创建实例)
你好
1
第二次访问:变量+1
2
(4)Servlet的常用方法(前三个为生命周期方法)。
(1)init:初始化Servlet,该方法只调用一次。
(2)service(doGet、doPost方式是继承httpServlet方法的,此方法是httpServlet对象用在service方法中,所以不用重写service,只要重写请求方式方法就可以)
Servlet容器或Tomcat初始化Servlet后,Servlet处于服务就绪状态,来处理请求并作出响应,可被调用多次。
@WebServlet("/responseDemo1")
public class responseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf8");
resp.setHeader("context-type","text/html;charset=utf8");
System.out.println("responseDemo1被访问了");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
(3)destroy:Servlet容器或Tomcat关闭或卸载Web应用而在销毁Servlet前,调用destroy方法来释放或回收资源,该方法只调用一次。
(4)getServletConfig:返回Servlet的配置信息。
(5)getServletInfo:返回Servlet的相关信息,如作者、版本、版权。
(5)Servlet的生命周期。
Servlet生命周期可以根据不同的实现细节被划分为不同的阶段,一般来说,常见的Servlet生命周期分为以下三个阶段:
-
初始化:当Servlet容器启动或者在客户端请求到来时,Servlet容器会调用Servlet的init()方法对Servlet进行初始化。在该方法中,开发人员可以进行各种资源的初始化操作,例如读取配置文件、建立数据库连接等。初始化完成后,Servlet对象进入就绪状态,可以接受客户端请求。
-
服务:在接收到客户端请求时,Servlet容器会调用Servlet类中的service()方法,该方法中编写处理请求的业务逻辑代码,例如读取请求参数、执行数据库操作等。根据不同的HTTP请求类型(如GET、POST、PUT等),可以重写相应的方法,例如doGet()、doPost()等方法。
-
销毁:在Web应用程序关闭或者Servlet被卸载时,Servlet容器会调用Servlet的destroy()方法,释放占用的资源以及进行必要的清理工作,例如关闭数据库连接、释放内存等。销毁完成后,Servlet对象被标记为不可用,随后被彻底销毁。
因此,Servlet生命周期可以认为是三个阶段,即初始化、服务和销毁。但需要注意的是,不同的Servlet容器实现可能会有所不同。
(6)Servlet在web.xml中的配置。
需要在web.xml中配置。(如今使用注解WebServlet("资源路径"))
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>web-10</display-name>
<!-- web.xml是整个项目的配置文件 -->
<!-- web.xml如果被修改,服务器必须重启 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 1.配置servlet -->
<servlet>
<!-- 给它取个名字 -->
<servlet-name>one</servlet-name>
<!-- servlet-class 需要填上类的全路径 -->
<servlet-class>com.xyz.servlet.LoginServlet</servlet-class>
</servlet>
<!-- 2.配置servlet的访问路径 -->
<!-- mapping 映射 -->
<servlet-mapping>
<!-- 对应的servlet的名字 -->
<servlet-name>one</servlet-name>
<!-- 给它配置一个访问的路径 -->
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
</web-app>
————————————————
版权声明:本文为CSDN博主「筱X」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_67235801/article/details/124445517
(7)Request、Response对象的生命周期。
Request、Response对象的生命周期可以根据不同的应用程序架构和实现方式而有所不同,但一般遵循以下流程:
-
请求接收:当客户端向服务器发送请求时,服务器接收到请求并创建一个Request对象。该对象包含了所有关于这个请求的信息,例如请求头、请求体、请求方法等。
-
路由匹配:请求接收后,服务器会根据配置的路由规则来匹配请求的URL和对应的处理函数。如果存在匹配的路由,服务器会将Request对象传递给相应的处理函数进行处理。如果不存在匹配的路由,则返回404 Not Found错误码。
-
处理请求:在匹配的处理函数中,服务器会使用Request对象中的信息来处理请求。这些处理包括验证请求参数、访问数据库、调用其他服务等。
-
构造响应:处理完请求后,服务器会构造一个Response对象来响应客户端请求。该对象包含了所有需要返回给客户端的数据,例如响应头、响应体、响应状态码等。
-
响应发送:构造完成Response对象后,服务器将其发送给客户端,完成响应过程。在发送成功后,服务器一般会清理Request和Response对象并释放相关资源。
因此,Request、Response对象的生命周期可以认为是五个阶段,即请求接收、路由匹配、处理请求、构造响应和响应发送。
二、Request与Response对象。
(1)Request对象。
(1)Request对象的使用。
(2)request的常用方法:
1、防盗链。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//演示获取请求头数据:referer
String referer = req.getHeader("referer");
System.out.println(referer);//http://localhost:8080/login.html
//防盗链
if (referer != null) {
if (referer.contains("/requestDemo4")){
//正常访问
//System.out.println("正常播放");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("播放电影");
}else{
//盗链
//System.out.println("想看电影吗?来优酷吧...");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("想看电影吗?来优酷吧...");
}
}
}
2、获取session 对象
getSession()
3、获取输入输出流对象,获取请求体数据。(get方式不行)
req.getReader();
req.getInputStream();
resp.getWriter();
resp.getOutputStream();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取字符流
// BufferedReader br = req.getReader();
ServletInputStream br = req.getInputStream();
//2.读取数据
byte[] bys = new byte[1024];
int len;
while ((len = br.read(bys))!= -1){
String data = new String(bys, 0, len);
String agent = req.getHeader("user-agent");
if (agent.contains("Chrom")){
data = URLDecoder.decode(data, "utf8");
}
System.out.println(data);
}
}
4.查找是否包含对应的字符串。
查找的数据agent.contains("Chrom")
(3)ServletContext对象。
(2)Response对象。
(1)Response对象的使用。
(1)添加Cookie
addCookie()
(2)URL编码解码问题
package cn.itcast.web.response.案例_文件下载_中文文件名问题.utils;
import java.util.Base64;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class Utils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器(版本太低的也无法打开)
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
Base64.Encoder encoder = Base64.getEncoder();
filename = "=?utf-8?B?" + encoder.encodeToString(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
三、Tomcat服务器(Web服务器)
(1)Web服务器与HTTP服务器的概念。
Web服务器:可以看作是HTTP服务器与应用程序容器的组合(应用程序容器(也称为应用服务器)则是为了支持动态内容而存在的。)。
HTTP服务器:负责接收和处理客户端发来的HTTP请求,并返回相应的HTTP响应。它提供了基本的静态资源服务功能,如传输网页、图片、视频等文件。
JSP/Servlet容器的基本功能:是把动态资源转换成静态资源。
(2)Tomcat服务器的基本使用。
(3)配置虚拟路径。
(3.1)在conf/server.xml中配置。
找到host元素中的<Context docBase="D:\xml" path="/a"></Context>。
在Tomcat中,配置虚拟目录是通过在<Host>
元素下添加<Context>
元素来实现的。
<Host name="localhost" ...>
...
<Context path="/myapp" docBase="/opt/myapp" />
...
</Host>
其中,path
属性指定虚拟路径,docBase
属性指定本地路径。
要访问 D:\opt\myapp\login.jsp:
docBase:本地地址,要映射的地址。 如:D:\opt\myapp
path:对应的虚拟路径 一定要以/开头。如:/myapp
对应的访问方式为:http://localhost:8080/myapp/login.jsp
理解:虚拟地址映射物理地址。(/myapp —映射—> /opt/myapp)
(3.2) 在Web应用的web.xml
文件中使用servlet-mapping
元素定义虚拟路径。
例如:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myapp/*</url-pattern>
</servlet-mapping>
(4)Tomcat目录结构。
(5)Tomcat的安装问题解决。
(6)解决一闪而过的问题。
set JAVA_HOME=C:\Program Files\Java\jdk-15.0.1
(7)指定tomcat服务器的首页。
<welcome-file-list>
标签用于指定Web应用程序的默认首页文件,其中可以配置多个文件名,按顺序依次尝试匹配,直到找到存在的文件为止。如果找不到任何一个文件,则会返回一个HTTP 404错误页面。
在tomcat默认配置下,当访问的目录为虚拟目录时,会指向WEB-INF文件夹中web.xml的welcome-file属性指定的文件。
这里的是在IDEA中项目的web.xml文件中进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<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>
</web-app>
下面的是在tomcat目录下进行配置首页的注意事项:
在Tomcat服务器中,每个Web应用都有自己的web.xml
文件。而在Tomcat的安装目录下的conf
目录中,也有一个全局的web.xml
文件,这个文件中包含了所有Web应用通用的配置信息。
当Tomcat启动时,它会先读取全局的conf/web.xml
文件,然后再读取各个Web应用目录下的WEB-INF/web.xml
文件。如果某个Web应用没有显式地定义某个配置项或元素,那么Tomcat会默认使用全局的conf/web.xml
文件中的相应配置。
对于具体的问题,如果在conf
目录下的web.xml
文件和某个Web应用目录下的WEB-INF/web.xml
文件都定义了同一个元素,那么这个Web应用中的WEB-INF/web.xml
文件会覆盖全局的conf/web.xml
文件。
因此,当存在多个web.xml
文件时,Tomcat会优先使用Web应用目录下的WEB-INF/web.xml
文件中的配置来处理请求,如果该文件中没有定义某个元素,才会尝试使用全局的conf/web.xml
文件中的配置。