一、Servlet入门
1、概述
概念:
运行在服务器上的小程序;
实际上Servlet是一个接口,定义了Java类被浏览器访问到(或者说被Tomcat识别的)规则;
使用:
自定义一个类实现Servlet接口,复写其中方法;
2、快速入门
步骤:
第一步:创建一个JavaEE项目;
在学习Tomca的时候创建了web项目;
第二步:定义一个类,实现Servlet接口;
public class MyServlet implements Servlet{
//...
}
第三步:实现接口中的抽象方法;
可根据IDEA的提示实现;
例如:
package com.zibo.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//提供服务的方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
第四步:配置Servlet
-- 在web.xml中配置:
<!--配置Servlet-->
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.zibo.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/my</url-pattern>
</servlet-mapping>
访问http://localhost:8080/web_war_exploded/my的结果是:
3、执行原理
第一步:当服务器接收到浏览器客户端发出的请求后,会解析请求的URL路径,获取访问的Servlet的资源路径;
第二步:查找web.xml文件,是否存在对应的<url-pattern>标签体内容;
第三步:如果有则查找到对应的<servlet-class>全类名;.
第四步:Tomcat会将字节码文件加载到内存,并创建其对象;
第五步:调用对象的方法;
二、Servlet生命周期方法
1、被创建
执行init方法,执行一次;
一般用于加载资源;
Servlet被创建的时间:
Servlet被创建的时间:
默认情况下,第一次被访问时,Servlet被创建;
可以指定Servlet被创建的时间;
指定Servlet被创建的时间:
<!--配置Servlet-->
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.zibo.servlet.MyServlet</servlet-class>
<!--指定servlet被创建时间
值为负整数(默认):第一次访问时创建;
值为正整数:在服务器启动时创建;
-->
<load-on-startup>1</load-on-startup>
</servlet>
Servlet是单例的
问题:
Servlet只执行一次,说明只有一个Servlet对象,Servlet是单例的,当多个用户同时访问时,可能存在安全问题;
解决:
尽量不要在Servlet中定义成员变量。即使定义了成员变量也不要对其值进行修改操作;
2、提供服务
执行service方法,执行多次;
每次访问Servlet时,service方法都会被调用一次;
3、被销毁
执行destroy方法,执行一次;
Servlet被销毁之前(服务器正常关闭时)执行,但是服务器若没有正常关闭,destroy方法是不会执行的;
一般用于释放资源;
4、方法介绍:
package com.zibo.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
//初始化方法-在Servlet被创建时执行,只会执行一次;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
//(了解)获取ServletConfig对象——Servlet的配置对象
@Override
public ServletConfig getServletConfig() {
return null;
}
//提供服务的方法,每次Servlet被访问时执行,会执行多次
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}
//(了解)获取Servlet的一些信息:版本、作者...
@Override
public String getServletInfo() {
return null;
}
//销毁方法,在Servlet被杀死时(之前)(服务器被正常关闭时)执行,只执行一次
@Override
public void destroy() {
System.out.println("destroy...");
}
}
三、Servlet3.0注解配置
1、好处
支持注解配置,可以不需要web.xml了;
2、步骤
第一步:创建JavaEE项目,选择Servlet3.0以上的版本,可以不勾选 web.xml;
第二步:定义一个类,实现Servlet接口,并复写其方法;
第三步:在类上使用@WebServlet注解进行配置;
注解如:只需要配置虚拟目录(资源路径)名字
@WebServlet(urlPatterns = "/my3")
或者
@WebServlet("/my3")
四、IDEA与Tomcat的相关配置
1、IDEA会为每一个Tomcat部署的项目单独建立一份配置文件;
查看控制台的log:Using CATALINA_BASE: "C:\Users\Administrator\.IntelliJIdea2019.2\system\tomcat\Tomcat_9_0_24_web_servlet3"
2、工作空间项目和Tomcat部署的项目,不是同一个,但后者会自动同步前者的所有内容(资源);
WEB-INF目录下的资源不能被浏览器直接访问;
断点调试:使用“小虫子”启动——debug启动;
五、Servlet的体系结构
1、Servlet接口的实现类
GenericServlet -- 抽象类,Servlet的实现类;
HttpServlet -- 抽象类,GenericServlet的子类;
2、GenericServlet
可以通过继承GenericServlet来实现自定义的Servlet类;
继承GenericServlet只需要复写server方法即可,如下:
package com.zibo.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/my")
public class MyServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("成功通过继承GenericServlet实现……");
}
}
但是,实际开发中并不用这种方式!
3、HttpServlet
是对http协议的封装,可以简化操作;
使用步骤:
第一步:自定义Servlet类继承HttpServlet;
第二步:复写doGet/doPost方法;
代码示例:
package com.zibo.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/my")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("doGet……");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println("doPost……");
}
}
4、Servlet相关配置
①urlpartten:Servlet访问路径:
单个访问路径示例:@WebServlet("/my")
多个访问路径示例:@WebServlet({"/my","/my1","/my2"})
②路径定义规则
三种方式:
1、/xxx
2、/xxx/xxx
/*,*表示随意写都可以访问,如/1、/sfd、/423fsf;
/*的优先级最低;
3、*.do
*.do表示随意写都可以访问,任意字符加上.do,而且do也不是固定的,可以.其他;
六、知识补充
1、将请求从一个servlet转发到另一个资源(servlet,jsp或HTML文件)
示例:
req.getRequestDispatcher("/index.jsp").forward(req,resp);
标签:Servlet,笔记,javax,E011Web,Override,import,servlet,public From: https://blog.51cto.com/u_13272819/6079070