Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序员的 API, 帮助程序员简单高效的开发一个 web app.
静态页面就只是单纯的 html
动态页面则是 html + 数据
我们写一个 hello world
预期写一个 Servlet 程序, 部署到 Tomcat 上
通过浏览器访问得到 hello world
下面我们就开始史上最难 hello world
这个程序分为7个步骤
创建一个 maven 项目
>maven 是个"工程管理"工具
1. 规范目录结构
2. 管理依赖(使用啥第三方库,都给处理好)
3. 构建
4. 打包
5. 测试
…
我们现在主要使用 管理依赖和打包功能
首先打开 IDEA 创建项目
创建 maven 项目
servlet 对应的 jar包
meven 仓库
这里使用 3.1.0 版本, 和 tomcat 8 是匹配的.
把 Meven 标签页下的代码 复制粘贴到 pom.xml 中
在顶级便签下, 创建一个 dependencies 便签, 把代码粘贴到 dependencies 便签下.
如果有多个依赖, 都往便签里依次粘贴即可
我们首次粘贴的话, 可见上面的代码有红的, 红色说明还没下载完.
一般只要你粘贴进来, idea 的 Meven 就会自动触发依赖的下载, 下载完毕就不红了(下载只需一次)
如果粘贴进来, 半天没动, 我们可以手动刷新一下.
到红色消失, 这个依赖就引入完成了.
虽然 maven 已经帮我们自动创建了一些目录, 但是还不够, 此处是需要使用 maven 开发一个 web 程序, 还需要别的目录
DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Applicationdisplay-name>
web-app>
我们写的这些代码没有main方法, 这个程序就相当于是车厢, tomcat 是车头, 我们把写好的 servlet 程序扔到 webapps 目录下, 就相当于把车厢挂在车头上了.
tomcat 如何识别呢?
webapps 目录下,判断哪些是要拉着跑的车厢, 哪些是不需要拉着跑的目录,就是靠目录下的 WEB_INF / web.xml
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 这个代码一定要删掉, 父类的这个方法只是返回一个错误页面.
// super.doGet(req, resp);
}
}
继承的这个类是 Servlet api 里提供的现成的类, 写 Servlet 代码一般都是继承这个 HttpServlet.
我们写的这个 doGet 方法, 不需要我们手动调用, 而是要交给 Tomcat 来调用, Tomcat 收到 get 方法, 就会触发doGet 方法.
Tomcat 会构造好两个参数, req 和 resp , req 是 TCP Socket 中读出来的字符串, 按照 HTTP 协议解析得到的对象, 这个对象里的属性就是和 HTTP 请求报文格式相对应的, 这个req 是个空的对象.
程序员就需要在 doGet 根据 req 结合自己的业务逻辑构造出一个 resp 对象来.
resp就相当于一个"输出型参数"
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("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 这个代码一定要删掉, 父类的这个方法只是返回一个错误页面.
// super.doGet(req, resp);
//这个打印是在 tomcat 的控制台打印
System.out.println("hello would");
// 要想把 Hello world 返回到客户端, 就需要使用以下代码
// getWriter 会得到一个 writer 对象
resp.getWriter().write("hello world");
}
}
此时的 write 操作其实是往 resp 的 body 部分进行写入, 等 resp 对象整个构造好了, Tomcat 会统一转成 HTTP 响应的格式, 再写 Socket
@WebServlet(“/hello”) 这个注解的作用是把当前类, 和一个 HTTP 请求的路径关联起来.
doGet 是 Tomcat 收到 GET 请求的时候就会调用, 具体要不要调用 doGet 还得看当前 GET 请求的路径是啥, 不同的路径可以触发不同的代码(关联到不同的类上)
一个Servlet 程序中, 可以有很多 Servlet 类, 每个 Servlet 类都可以关联到不同的路径(对应到不同的资源)
因此此处的多个 Servlet 类就可以实现不同的功能.
把程序编译好(得到一些 .class 文件), 再把这些.class 打成压缩包(war 包),
jar 包 只是一个普通的 java 程序
war 包是 Tomcat 专属的用来描述 webapp 的程序
一个 war 包就是一个webapp 程序
借助 meven 一点击即可
默认情况下, meven 打的是 jar 包, 我们需要的是 war 包, 需要微调一下 pom.xml.
这个便签描述了 打的 war 包的名字, 然后在进行打包就能得到我们要的 war 包
把 war 包拷贝到 Tomcat 的 webapps 目录下.
此时通过浏览器访问 http://127.0.0.1:8080/hello_servlet/hello
注意: URL 中的 PATH 分成两个部分, 其中 hello_servlet 为 Context Path, hello 为 Servlet Path