Servlet

一---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源码分析:

 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


 配置项目发布的路径,这里的s1是servlet01:war的简写

七:启动测试

原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14594409.html