Servlet入门
- Servlet是Java提供的一门动态web资源开发技术。简而言之,不同用户访问同样的资源会看到不一样的效果。
- Servlet是JavaEE规范之一,其实是一个接口。
1 快速入门
1.1 创建web项目,导入Servlet依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
还需要配置maven-tomcat插件
<build>
<finalName>Servlet-demo02</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
1.2 创建实现Servlet接口
public class ServletDemo 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("Servlet starts successfully!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
1.3 配置:使用注解,配置Servlet访问路径
@WebServlet("/demo01")
1.4 访问:启动Tomcat,浏览器输入URL访问
有可能出现8080端口被占用
可以使用以下命令:
sudo lsof -i tcp:8080
sudo kill -9 XXXX
点击网站,访问/demo01,即可看到terminal提示service的output!
2 Servlet执行流程
3 生命周期
4 Servlet方法
4.1 init()
/**
* 初始化方法
* 1. 调用时机:默认情况下,servlet第一次被访问时调用。
* loadOnStartup:
* 2. 调用次数: 1次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...........");
}
4.2 service()
/**
* 提供服务
* 1. 调用时机:每一次Servlet被访问时调用
* 2. 调用次数:每次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet starts successfully!");
}
4.3 destroy()
/**
* 销毁方法
* 1.调用时机:内存释放或者服务器关闭时候
* 2. 调用次数: 1次
*/
@Override
public void destroy() {
System.out.println("destroy.......");
}
4.4 ServletConfig()
@Override
public ServletConfig getServletConfig() {
return null;
}
4.5 getServletInfo()
@Override
public String getServletInfo() {
return null;
5 HttpServlet
针对B/S架构的web项目,都是针对HTTP协议,所以我们自定义的Servlet都会继承HttpServlet。
5.1 HttpServlet demo
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo")
public class HttpServlet extends javax.servlet.http.HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get");
}
}
这里使用PostMan分别做Get和Post请求
展示发送的Post请求
Terminal显示Post
Get请求以此类推,省略展示。
5.2 使用Servelt Service()方法处理post/get请求
通过自己定义的HttpServlet类,实现对Post、Get请求的处理。之后只需要继承HttpServlet类,重写Post和Get方法就可以完成请求的处理,不需要每次都完成Servlet接口的重写。
5.2.1 MyHttpServlet代码展示
这里并不需要指定url路径,因为以后的HttpServlet只是继承MyHttpServlet,只需要在子类中指定urlPattern。
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MyHttpServlet implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// Handle Different Http Request
// 1. 转换成HttpServeltRequest
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 2. Get Method
String method = httpServletRequest.getMethod();
// 3. 针对不同的请求做处理
if("GET".equals(method)){
doGet(servletRequest, servletResponse);
}else if("POST".equals(method)){
doPost(servletRequest, servletResponse);
}
}
/**
*
* 使用protected,方便子类继承时override
* @param servletRequest
* @param servletResponse
*/
protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
}
protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
5.2.2 MyHttpServletDemo展示
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/demo2")
public class MyHttpServletDemo extends MyHttpServlet {
@Override
protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println("This is MyHttp Post");
}
@Override
protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println("This is MyHttp Get");
}
}
5.2.3 HttpServlet源码分析
实际上以上的MyHttpServlet与HttpServlet service()框架一致
第一步也是获取method方法,然后进行method比对
最后调用对应的Method处理方法