快速开始
我们来写一个最简单的 hello world 项目,来对 servlet 有个最直观的认识。
项目结构
.
├── java
│ └── com
│ └── github
│ └── houbb
│ └── servlet
│ └── learn
│ └── base
│ └── hello
│ ├── Hello.java
└── webapp
├── WEB-INF
│ └── web.xml
└── index.html
pom.xml 设置
使用 maven 做项目 jar 管理。
- servlet-api
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
- 指定打包方式为 war 包
<packaging>war</packaging>
- tomcat7 插件
你可以将项目打包为 *.war 然后放到 tomcat 下启动,此处为了方便使用了 tomcat7-maven-plugin。
整体如下:
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>servlet</artifactId>
<groupId>com.ryo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<artifactId>servlet-base</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<plugin.tomcat.version>2.2</plugin.tomcat.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>9.0.0.M8</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>servlet</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>${plugin.tomcat.version}</version>
<configuration>
<port>8081</port>
<path>/</path>
<uriEncoding>${project.build.sourceEncoding}</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
<build>
<finalName>servlet</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>${plugin.tomcat.version}</version>
<configuration>
<port>8081</port>
<path>/</path>
<uriEncoding>${project.build.sourceEncoding}</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.github.houbb.servlet.learn.base.hello.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!--默认的欢迎页面-->
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
</web-app>
指定了 url 与 Servlet 类之间的映射。
当我们访问 /hello
的时候,会调用对应的 Hello
Servlet 类进行处理。
代码
- Hello.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 入门测试
*/
public class Hello extends HttpServlet {
private static final long serialVersionUID = -6775862788735743674L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html");
// 实际的逻辑是在这里
PrintWriter out = resp.getWriter();
out.println("<h1>hello</h1>");
}
}
- index.html
<!DOCTYPE html>
<html>
<body>
Hello Servlet!
</body>
</html>
启动
直接启动 tomcat7:run 运行当前 war。
打开浏览器 http://localhost:8081/,默认显示的是:
Hello Servlet!
访问 url
打开浏览器 http://localhost:8081/hello,显示的是:
hello
也就是我们在 Hello
类中返回的 html 内容。
基于注解实现
如果你使用过 springmvc 一定会发现,web.xml
中的配置太麻烦了。
当然,Servlet 中我们也可以使用注解来简化这一配置。
- HelloAnnotation.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 入门注解测试
*/
@WebServlet("/hello/annotation")
public class HelloAnnotation extends HttpServlet {
private static final long serialVersionUID = 491287664925808862L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html");
// 实际的逻辑是在这里
PrintWriter out = resp.getWriter();
out.println("<h1>hello annotation</h1>");
}
}
访问
和上面一样,打开浏览器 http://localhost:8081/hello/annotation,显示的是:
hello annotation
源码地址
源码参见servlet 入门案例