一---Servlet简介
1)Servlet就是sun公司开发动态web的一门技术
2)sun在这些API中提供一个接口叫做:servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤。
2.1)编写一个类,实现Servlet接口
2.2)把开发好的java类部署到web服务器中。
把实现了Servlet接口的java程序叫做Servlet
二---HelloServlet
servlet接口在sun公司有两个默认的实现类:HttpServlet,GenerricServlet
GenerricServlet继承了Servlet。
HttpServlet继承了GenerricServlet。
1)构建一个maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建module,这个空的工程就是maven的工程
2)关于maven父子工程的理解:
父项目中会有
<modules>
<module>servlet-01</module>
</modules>
子项目中会有
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.kuang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
注:这里一定一定一定要加上,否则程序后面继承Httpservlet的时候会报错。如果程序不自动出现就手动添加。
三---maven环境优化
1)修改web.xml为最新的
2)将maven的结构搭建完整
四---编写一个servlet'程序
1)编写一个普通类
2)实现servlet接口,这里我们直接继承HttpServlet
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter(); // 响应流 writer.print("hello, Servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); }
servlet类:
GenericServlet源码分析:
![](https://img2020.cnblogs.com/blog/2250171/202103/2250171-20210329204814356-1531513784.png)
HttpServlet的service方法源码分析:
1 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2 String method = req.getMethod(); 3 long lastModified; 4 if (method.equals("GET")) { // 如果是get方式 5 lastModified = this.getLastModified(req); 6 if (lastModified == -1L) { 7 this.doGet(req, resp); // 调用get对应的方法 8 } else { 9 long ifModifiedSince = req.getDateHeader("If-Modified-Since"); 10 if (ifModifiedSince < lastModified) { 11 this.maybeSetLastModified(resp, lastModified); 12 this.doGet(req, resp); 13 } else { 14 resp.setStatus(304); 15 } 16 } 17 } else if (method.equals("HEAD")) { 18 lastModified = this.getLastModified(req); 19 this.maybeSetLastModified(resp, lastModified); 20 this.doHead(req, resp); 21 } else if (method.equals("POST")) { // 如果是post方式 22 this.doPost(req, resp);// 调用post方法 23 } else if (method.equals("PUT")) { 24 this.doPut(req, resp); 25 } else if (method.equals("DELETE")) { 26 this.doDelete(req, resp); 27 } else if (method.equals("OPTIONS")) { 28 this.doOptions(req, resp); 29 } else if (method.equals("TRACE")) { 30 this.doTrace(req, resp); 31 } else { 32 String errMsg = lStrings.getString("http.method_not_implemented"); 33 Object[] errArgs = new Object[]{method}; 34 errMsg = MessageFormat.format(errMsg, errArgs); 35 resp.sendError(501, errMsg); 36 } 37 38 } 39 40 private void maybeSetLastModified(HttpServletResponse resp, long lastModified) { 41 if (!resp.containsHeader("Last-Modified")) { 42 if (lastModified >= 0L) { 43 resp.setDateHeader("Last-Modified", lastModified); 44 } 45 46 } 47 }
这里面的默认实现不是我们想要的。但我们在用普通类继承的时候,只需要重写doPost和doGet方法
五---编写Servlet的映射
为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器
所以我们需要在web服务器中注册我们写的Servlet,还需要给她一个浏览器能够访问的路径。
<!--注册servlet --> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.kuang.servlet.HelloServlet</servlet-class> </servlet> <!--servlet的请求路径 --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> // 注意这里是 /hello。网址模式 </servlet-mapping> </web-app>
六---配置Tomcat
![](https://img2020.cnblogs.com/blog/2250171/202103/2250171-20210329212027293-511737692.png)
配置项目发布的路径,这里的s1是servlet01:war的简写
七:启动测试