从安装Tomcat容器,到编写servlet、配置web.xml文件。用最原始的方式构建一个网站,从而理解servlet的工作原理。

前言:关于Servlet

历史发展

https://blog.csdn.net/u010297957/article/details/51498018#commentBox

从CGI –> applet –> servlet(java) –> servlet1.1(jsp借鉴asp) –> servlet1.2(mvc思想) –> … –> Servlet3.1(稳定)
–> SpringMVC(本质也是Servlet)

Servlet规范

Servlet官方规范文档
Servlet中文翻译

两个链接分别是Servlet官方文档和中文翻译版本。

狭义的看,Servlet就是一个interface,一个Java的接口,它有五个方法:

1
2
3
4
5
6
7
8
9
10
11
public interface Servlet {
void init(ServletConfig var1) throws ServletException;

ServletConfig getServletConfig();

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

String getServletInfo();

void destroy();
}

13乎高赞回答,第一、二个回答醍醐灌顶了,爱了爱了。

功能

接受http请求,动态处理并返回结果给客户端。

Servlet与Tomcat

Tomcat是Servlet运行的容器。Servlet没有main方法,它受控于另一个Java应用,这个应用就成为容器(Container),而Tomcat就是Servlet的容器。而容器怎么处理用户的请求?我们来复现模拟这个过程:

  1. 客户端发起一个请求。
  2. 容器监听端口发现客户端的请求,创建HttpServletRequestHttpServletResponse两个对象
  3. 容器根据url判断把请求丢给哪个Servlet处理(根据映射规则),为这个请求创建一个线程,并把HttpServletRequestHttpServletResponse`丢给相应Servlet
  4. 线程调用Servlet的service(),service()根据请求调用doGet()或者doPost()方法
  5. Service()处理完成,通过HttpServletResponse把处理结果返回给Tomcat容器,Tomcat继续封装成http响应返回个客户端。

部署一个Servlet

安装Tomcat

本人在阿里云学生机安装Tomcat8,系统是ubuntu16.04,参考资料:
https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-ubuntu-16-04

编写和编译servlet

  1. /opt/tomcat目录下创建一个myapp目录,接着在myapp下创建images(存放图片)、src(存放java源码)、WEB-INF,在WEB-INF下创建classes(存放字节码文件)和web.xml,目录树如下:

myapp/
├── images
│ └── test.JPG
├── src
│ └── TestingServlet.java
└── WEB-INF
├── classes
│ └── TestingServlet.class
└── web.xml

写一个helloworld版的servlet,使用vim写java你就会发现ide确实方便了开发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class TestingServlet extends HttpServlet {

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Servlet Testing</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("Welcome to the Servlet Testing Center");
out.println("</BODY>");
out.println("</HTML>");
}
  1. 编译此文件,字节码文件输出到WEB-INFO/classes下:
    javac -d ../WEB-INF/classes/ TestingServlet.java

配置web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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_3_1.xsd"
version="3.1"
metadata-complete="true">
<servlet>
<servlet-name>Testing</servlet-name>
<servlet-class>TestingServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Testing</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>

</web-app>

当你访问 host:8080/test时,tomcat容器会根据web.xml文件映射,把请求丢给名为Testing的servlet,而Testing会找到/WEB-INFO/classes下的TestingServlet字节码文件,处理完成返回客户端。
https://www.tutorialspoint.com/servlets/servlets-first-example.htm
http://www.informit.com/articles/article.aspx?p=26920&seqNum=4

Comments

⬆︎TOP