zoukankan      html  css  js  c++  java
  • Servlet还有学习的必要吗?(手工搭建Servlet)

    前言

      在初学Java web的时候,就曾听到过这样一种说法:
      java Web的演变过程大概可以分为4个阶段:
      1. jsp + Servlet + jdbc
      2. spring + struts2+ hibernate(ssh)
      3. spring + SpringMVC + mybatis(ssm)
      4. 微服务阶段。
      所以学习 Java web,可以从第3个阶段开始学习,不用再去关注Servlet,那么Servlet是否还有学习的必要呢?
    答案是有,并且非常重要。俗话说万变不离其宗,这个宗指的就是技术的底层,你会发现技术的底层其实都是相通的,只要把握了这个宗,我们就能在技术的浪潮来临时,把握机会,而不是去追逐一个又一个的泡沫。
      我记得初学java的时候,还是大三上,教我们java的老师是我们学院的副院长。他让我们用记事本去编写程序,用命令行去执行程序,而隔壁班用的却是eclipse。当初非常羡慕隔壁班,能用上“高大上”的开发环境,不用去改一个又一个的编译错误。现在想起来,却非常感谢那段经历,它让我对Java程序的执行过程有了更直观的认识,对java这门编程语言本身有了更深刻的认识。
    而现在作为一个Java程序员,我们已经习惯了使用IDE和Web框架进行开发,IDE帮助我们做了编译、打包的工作。Spring框架则帮助我们实现了Servlet接口,并把Servlet容器注册到了Web容器中。这样我们就可以专注于实现业务逻辑,但是同时,却缺少了接触底层的机会。
      如果程序一直都处于正常运行的状态,不了解底层其实并没有什么问题,但是如果程序一旦出现了预期之外的异常,那么如果我们不懂底层,就没有办法准确的定位问题。
    所以今天要和大家分享的是Servlet的学习:

    手工搭建一个Servlet

    下载Tomcat

      首先我们需要下载Tomcat :https://tomcat.apache.org/download-90.cgi
      Tomcat的目录如下: (Mac系统、Tomcat 8.5.38)
     
    • /bin:存放在windows(.bat)和Linux(.sh)环境下运行的脚本文件。
    • /conf: 存放配置的文件,其中最重要的是server.xml(配置Servlet)
    • /lib:存放Tomcat以及所有Web应用都可以访问的jar文件
    • /logs:存放Tomcat执行时产生的日志文件
    • /work:存放JSP编译后的产生class文件
    • /webapps:Tomcat的Web应用目录

    编写Servlet程序

      我们可以通过继承GenericServlet抽象类或者HttpServlet抽象类来实现我们自己的Servlet。HttpServlet是在GenericServlet的基础上,进一步封装了Http的特性,相对GenericServlet而言使用简单,我们只需要重写doGet和doPost方法即可。所以这里我们使用HttpServlet。(这里我们是使用记事本编写的,如果你是使用ide,请引入javax.servlet包,因为这个包不在jdk的标准开发包中,方法可以参考:https://blog.csdn.net/q343509740/article/details/79515911)
    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;
    
    /**
     * 自定义Servlet.
     * 
     * @author jialin.li
     * @date 2019-12-15 20:46
     */public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("开始处理get请求");
            PrintWriter writer = resp.getWriter();
            resp.setContentType("text/html;charset=utf-8");
            writer.println("<h1>hello Servlet</h1>");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("开始处理post请求");
            PrintWriter writer = resp.getWriter();
            resp.setContentType("text/html;charset=utf-8");
            writer.println("<h1>hello Servlet</h1>");
        }
    }

    编译程序

      这里需要我们将Tomcat lib中的Servlet-api.jar拷贝到当前目录下。因为我们编写的MyServlet继承了HttpServlet抽象类,而这个类属于该jar包,调用下面的命令编译代码:
    javac -cp ./servlet-api.jar MyServlet.java
      可以看出,我们编译成功,生成了一个class文件。
      接着我们需要创建一个Web应用的web文档结构,把它放到Webapps中。结构如下:
    MyWebApp/WEB-INF/web.xml
    MyWebApp/WEB-INF/classes/MyServlet.class
      我们将在web.xml中配置我们的Servlet,web.xml的内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0"
    metadata-complete="true">
    <description> Servlet Example. </description>
    <display-name> MyServlet Example </display-name>
    <request-character-encoding>UTF-8</request-character-encoding>
    <servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/myservlet</url-pattern>
    </servlet-mapping>
    </web-app>
      这里要保证servlet和servlet-mapping中的servlet-name一致。这样才能完成从url到servlet的映射。

    启动Tomcat

      接着我们启动tomcat,找到tomcat的bin目录,然后执行start.sh脚本(如果是windows系统,请使用.bat的脚本):
    sh startup.sh
      tomcat的默认端口是8080,我们可以访问一下myservlet,观察结果:http://127.0.0.1:8080/MyWebApp/myservlet
    hello Servlet
      MyWebApp是我们的应用名,即在webapps的文件夹,myservlet是我们配置在web.xml里的Servlet路径。
    (如果启动tomcat出现异常,请移步https://www.cnblogs.com/nedulee/p/12063786.html,里面有具体的解决办法)

    读取日志

      读tomcat的日志,也是后端开发工程师必不可缺的一项技能。它可以帮助我们快速的定位问题。tomcat中的日志分为两类,一类是运行日志,记录着系统运行过程中的信息,比如异常错误  等。一类是访问日志,记录着访问的时间、IP地址、访问路径等相关信息。

    catalina.***.log

      主要记录着Tomcat启动过程中的信息,这个文件可以看到JVM参数以及操作系统等日志信息。

    catalina.out

      catalina.out是Tomcat的标准输出和错误输出,在这个日志里我们可以看到MyServlet.java程序输出的信息。

    localhost.**.log

      主要记录Web应用在初始化过程中,遇到的未处理的异常。

    manager.***.log/host-manager.***.log

      存放Tomcat自带的Manager项目的日志信息
      除了使用xml的形式配置,servlet3.0又引入了注解开发的方式,大大简化了开发流程,我们先修改代码,给Servlet类加上@WebServlet注解:
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * 自定义Servlet.
     *
     * @author jialin.li
     * @date 2019-12-15 20:46
     */
    @WebServlet("/myAnnotationServlet")
    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("开始处理get请求");
            PrintWriter writer = resp.getWriter();
            resp.setContentType("text/html;charset=utf-8");
            writer.println("<h1>hello Servlet</h1>");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("开始处理post请求");
            PrintWriter writer = resp.getWriter();
            resp.setContentType("text/html;charset=utf-8");
            writer.println("<h1>hello Servlet</h1>");
        }
    } 
      这个注解有两层含义: 这个Java类是一个Servlet;这个Servlet对应的url路径是myAnnotationServlet
      然后我们需要重新编译文件,并删除原来的web.xml,重新启动tomcat,验证结果:
    hello Servlet
      可以看出,使用注解和使用配置文件的效果是一样的。
     
     

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/nedulee/p/12063894.html
Copyright © 2011-2022 走看看