servlet概念相信做 java-web,用过 structs2 同学对于 Servlet 并不陌生。然而,目前大家做 java-web 都是用springmvc、springboot。spring 框架对servlet做了很好的封装,很好用,但是框架也让我们变成了只会用注解,对于 java-web 底层缺乏了解的,只专注业务逻辑的开发者。一旦有线上故障出现,就会很慌张。作为一名有志向的程序员,了解一些底层的知识是必备技能。
servlet是sun公司提供的用于开发动态web资源的技术,是 j2ee 三大规范之一,servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法。
其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:
•你初始化时要做什么?•你销毁时要做什么?•你接受到请求时要做什么?
容器1.servlet容器是什么?
Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于 MIME的请求,格式化基于MIME的响应。
Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。
1.http请求过程
参考知乎:智慧的文章,具体见参考
如上图所示,解析 http 请求的是 servlet 容器,容器将请求封装为 servlet 中的 HttpServletRequest 对象,调用 init(),service()等方法输出response,由容器包装为 httpResponse 返回给客户端的过程。
应用一: 创建项目
1.idea 新建一个 servlet 项目
创建好的项目目录如下:
2.新增一个 servlet 类
新增一个实现 DisplayHeader 类继承 HttpServlet 抽象类,重写了 doGet 的方法,可以通过HttpServletRequest 取到请求数据,并进行处理。返回时将数据和html结合起来,写到 HttpServletResponse 类中进行返回。
代码示例如下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
public class DisplayHeader extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "HTTP Header 请求实例";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " "transitional//en\">\n";
out.println(docType
"<html>\n"
"<head><title>" title "</title></head>\n"
"<body bgcolor=\"#f0f0f0\">\n"
"<h1 align=\"center\">" title "</h1>\n"
"<table width=\"100%\" border=\"1\" align=\"center\">\n"
"<tr bgcolor=\"#949494\">\n"
"<th>Header 名称</th><th>Header 值</th>\n"
"</tr>\n");
Enumeration headnames = req.getHeaderNames();
while (headnames.hasMoreElements()){
String paramName = (String) headnames.nextElement();
out.print("<tr><td>" paramName "<td>\n");
String paramValue = req.getHeader(paramName);
out.println("<td>" paramValue "</td><tr>\n");
}
out.println("</table>\n</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
3.servlet部署
默认情况下,Servlet 应用程序位于路径 /webapps/ROOT 下,且类文件放在 /webapps/ROOT/WEB-INF/classes 中。如果类名称 com.myorg.MyServlet,那么这个 Servlet 类必须位于 WEB-INF/classes/com/myorg/MyServlet.class 中。
并在位于 /webapps/ROOT/WEB-INF/ 的 web.xml 文件中创建以下配置:
<servlet>
<servlet-name>DisplayHeader</servlet-name>
<servlet-class>DisplayHeader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayHeader</servlet-name>
<url-pattern>/DisplayHeader</url-pattern>
</servlet-mapping>
在该项目中,配置好了,直接启动程序,访问http://localhost:8090/ServletTest/DisplayHeader则可以出现如下页面。
二: servlet 访问流程
浏览器地址栏中输入:http://localhost:8080/day06/hello
访问过程如下
servlet和springmvc的关系springmvcSpringmvc的核心是一个DispatcherServlet,并且DispatcherServlet继承自 FrameworkServlet继承自HttpServletBean 继承自HttpServlet(也就是你说的servelt) 本质上是一样的东西。其实就是基于tomcat等这些web容器对我们的CS请求能做更多的事情,如校验,拦截(AOP思想),后期渲染等等,好让我们专注于业务的开发。
参考博客1.将tomcat、servlet的关系讲的很清晰: https://blog.csdn.net/weixin_40396459/article/details/81706543
2. idea中创建一个servlet程序: https://www.cnblogs.com/liusong-funtime/p/9144275.html
3.https://zhuanlan.zhihu.com/p/295173834
4.https://blog.csdn.net/weixin_39893958/article/details/84389384