Java Web开发 - Servlet入门 (一)
前言-Servlet简介
Java Servlet 是运行在 Web 服务器或应用服务器上的程序 是Server Applet(服务端小程序)的简称,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
一、Servlet的部署
1. TomCat服务器
不知道在哪里下载?点这里!
下载TomCat 9版本(别问为什么,问就是稳定)
直接解压就能用。
IDEA配置TomCat服务器
-
IDEA中 新建一个项目,可以采用Maven构建(推荐),也可以用InterlliJ构建后导入servlet-api.jar(可以从TomCat的lib目录中拷一份,然后添加目录)的依赖,建议使用 JDK 1.8 进行创建。
-
如过没有使用Maven构建项目,需要手动添加Web应用程序的框架支持 双击shift 搜索 ”添加框架支持“ 选择”Web应用程序“
-
IDEA右上角”编辑配置“ ---->添加新配置,选择”TomCat服务器“ ----> “本地” 在应用程序服务器配置中将主目录添加为刚刚解压好的TomCat服务器根目录。
-
手动添加”部署“ 或者 点击右下角”修复“,修复部署。
2. Servlet的注册
1. web.xml中进行映射注册
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?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>a</servlet-name> <servlet-class>com.msb.testservlet.Servlet04</servlet-class> </servlet> <servlet-mapping> <servlet-name>a</servlet-name> <url-pattern>/s04</url-pattern> </servlet-mapping> </web-app>
|
servlet标签中写的servlet-name为 为该Servlet编辑注册的名称(可以随便起),servlet-class填写Servlet在本地资源的Servlet路径
servlet-mapping中servlet-name为解映射名称,url-pattern在URL中的映射地址。
在URL后添加/s04即可访问该Servlet
2. 添加@WebServlet注解注册
在高版本的Servlet中支持注解注册
可以参考下文”三、Servlet 的创建“,了解用法(比web.xml简单多了)
二、Servlet的生命周期
Servlet的生命周期:从Servlet被创建到Servlet被销毁的过程
Servlet一次创建多次服务
一个Servlet只有一个对象,用于服务所有的请求
- Servlet创建时调用init()方法。
- Servlet调用service()方法来处理客户端的请求。
- Servlet调用destory()方法来进行销毁。
1. init()方法
init()方法只会在第一次创建Servlet时被调用,在后续的请求中不再被调用。
也就是说只有 在服务器启动之后第一个用户第一次通过URL访问该Servlet时,init()方法才会被调用。
该方法被定义在 javax.servlet 的Servlet接口中,下面是init()的定义。
1 2 3 4 5
| void init(ServletConfig var1) throws ServletException{`
}
|
###2.service()方法
Service()方法是执行客户端请求的主体,客户端的请求事务,一般都在这里被处理。
1 2 3 4
| void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ }
|
3. doGet()方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
1 2 3 4
| void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { }
|
4. doPost()方法
与doGet()方法类似,来自于一个未指定 METHOD 的 HTML 表单。
1 2 3 4 5
| void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
|
5. destory()
destory()方法在Servlet的生命周期结束时被调用。一般是在服务器被关闭时进行销毁。
*通过代码加强对Servlet的理解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package com.msb.testservlet;
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("/s05") public class Servlet05 extends HttpServlet {
public Servlet05(){ System.out.println("构造器被调用!"); } @Override public void init() throws ServletException { System.out.println("Servlet-init"); }
@Override public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
System.out.println("处理业务"); }
@Override public void destroy() { System.out.println("Servlet被销毁!"); } }
|
接下来启动服务器,访问该Servlet
控制台会输出
1 2 3
| 构造器被调用! Servlet-init 处理业务
|
如果刷新页面,控制台将直接输出
而不会再次调用init()方法
直到服务器被关闭时控制台才会输出
三、Servlet 的创建
Servlet的实现有三种方式
1、实现Servlet接口
由于是实现Servlet的接口,因此需要对Servlet中的方法进行实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package com.msb.testservlet;
import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException;
@WebServlet("/s03") public class Servlet03 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("servlet03"); }
@Override public String getServletInfo() { return null; }
@Override public void destroy() {
} }
|
2、继承GenericServlet
GenericServlet实现了Servlet, ServletConfig, Serializable
一般只需要对其中的Service()方法进行重写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.msb.testservlet;
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("/s02") public class Servlet02 extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("servlet02..."); } }
|
3、继承HttpServlet
第三种方法也是最常用的方法,HttpServlet这个抽象类继承于GenericServlet。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package com.msb.testservlet;
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("/s01") public class Servlet01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Hi Servlet!");
resp.getWriter().write("Hi Servlet!"); } }
|