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
      可以看出,使用注解和使用配置文件的效果是一样的。
     
     

  • 相关阅读:
    Python自然语言处理学习笔记(6):1.4 回到Python:决策和控制
    Python自然语言处理学习笔记(11):2.3 代码重用
    Python文件夹与文件的操作
    Python自然语言处理学习笔记(10):2.2 条件频率分布
    [导入]SunriseUpload.0.9.1的源码分析(一)
    [导入]Processing A .aspx File From Console Window, Without Using IIS
    [导入]ASP.net(C#)学习要点交流。
    [导入]Access里使用存储过程及用户自己定义的控件里使用参数
    [导入]SunriseUpload.0.9.1的源码分析(五)
    [导入]上传文件时如何保存视图状态?
  • 原文地址:https://www.cnblogs.com/nedulee/p/12063894.html
Copyright © 2011-2022 走看看