好记性不如烂笔头,记录学习的过程和内容,望与君共勉!
Servlet:server applet,运行在服务器的小程序。Servlet 是一个接口,定义了 Java 类被浏览器访问(Tomcat识别)到的的规则。我们需要自定义一个类,实现 Servlet 接口,重写方法。
1、创建 JavaEE 项目
2、定义一个类,实现 Servlet 接口
public class ServletDemo1 implements Servlet
3、实现接口中的抽象方法
4、配置 Servlet
在 web.xml 中配置:
<servlet>
<servlet-name>demo1servlet-name>
<servlet-class>org.it.web.servlet.ServletDemo1servlet-class>
servlet>
<servlet-mapping>
<servlet-name>demo1servlet-name>
<url-pattern>/demo1url-pattern>
servlet-mapping>
Java 代码:
public class ServletDemo1 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() {
}
}
通过上面配置好的路径访问时,每次刷新一次页面都会在控制台输出一句 service() 方法中的代码。
1、当 web 服务器接收到客户端浏览器的请求后,会解析请求 URL 路径,获取访问的 Servlet 的资源路径
2、查找 web.xml 文件,是否有对应的 url-pattern 标签体内容
3、如果有,则会找到对应的 servlet-class 全类名
4、tomcat 会将字节码文件加载进内存,并且创建其对象
5、调用其中的方法
1、被创建:执行 init 方法,只执行一次
Servlet 什么时候被创建?
默认情况下,第一次访问时,Servlet 被创建,也可以通过 Servlet 标签下的配置配置来改变 Servlet 的创建时机:
第一次访问时创建:load-on-startup标签 为负值
服务器启动时创建:load-on-startup标签 为0或正整数
2、提供服务:执行 service 方法,执行多次
3、被销毁:执行 destroy 方法,只执行一次
只有服务器正常关闭时,destroy 方法才能被执行,在 Servlet 被销毁之前执行。
在 Servlet 3.0 之后的版本,支持注解的配置,也就是可以不再需要 web.xml 了。
操作步骤:
1、创建 JavaEE 项目
Versions 3.0 以上,可以不勾选创建 web.xml 。
2、定义一个类,实现 Servlet 接口
3、实现接口中的抽象方法
4、在类上使用 @WebServlet 注解,配置 Servlet
在创建好的类前面添加注解:
@WebServlet(urlPatterns = "/ServletDemo2")
由于注解里有一个属性 value,表示最重要的属性,而 value 又可以省略不写,故注解可以简写为:
// @WebServlet("资源路径")
@WebServlet("/ServletDemo2")
Servlet(接口):有两个实现类,GenericServlet(儿子) 和 HttpServlet(孙子)。
1、GenericServlet(抽象类):将 Servlet 接口中其他的方法做了默认空实现,只将 service() 方法作为抽象,那么我们再次定义 Servlet 时,可以继承 GenericServlet,重写 service() 方法即可。
@WebServlet("/ServletDemo3")
public class ServletDemo3 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
2、HttpServlet(抽象类):
该类是对 HTTP 协议的一种封装,可以简化操作。
步骤:
①继承 HttpServlet 类
②重写 doGet / doPost 方法
@WebServlet("/ServletDemo4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
}
}
通过浏览器直接访问是 get 方式,每次访问都可以看到在控制台打印 doGet。
我们可以通过表单的方式,指定其提交方式为 post,每次提交都可以看到在控制台打印出 doPost。
<body>
<form action="ServletDemo4" method="post">
<input type="text">
<button type="submit">提交button>
form>
body>
urlPatterns:指定 Servlet 资源的访问路径
1、urlPatterns 是一个数组,一个 Servlet 可以定义多个访问路径:
@WebServlet({"/ServletDemo4", "/demo4", "/d4"})
将注解改为以上代码,通过浏览器访问时,ServletDemo4、demo4、d4 均可访问到同一个资源。
2、路径定义规则:
① /xxx
② /xxx/xxx:多层路径,目录结构
@WebServlet("/ServletDemo4/demo4")
通过浏览器访问时要通过这两层路径才能访问到。
③ * . 后缀名:拓展名匹配
@WebServlet("*.do")
这里定义了后缀名为 do(可以随便定义),* 是通配符,那么通过浏览器访问时要通过 任意名字.do 才能访问到。
我是快斗,请多多指教!