手工搭建Servlet实现

 更新时间:2021年7月8日 15:00  点击:1731

前言

在初学Java web的时候,就曾听到过这样一种说法:
java Web的演变过程大概可以分为4个阶段:

  • jsp + Servlet + jdbc
  • spring + struts2+ hibernate(ssh)
  • spring + SpringMVC + mybatis(ssm)
  • 微服务阶段。

  所以学习 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://www.jb51.net/article/196463.htm)

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的脚本):[code]sh

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.jb51.net/article/216973.htm,里面有具体的解决办法)

读取日志

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

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

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

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

manager.***.log/host-manager.***.log
  存放Tomcat自带的Manager项目的日志信息

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

可以看出,使用注解和使用配置文件的效果是一样的。

到此这篇关于手工搭建Servlet实现的文章就介绍到这了,更多相关Servlet手工搭建内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • Angularjs---项目搭建图文教程

    下面小编就为大家带来一篇Angularjs---项目搭建图文教程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-25
  • Linux环境下nginx搭建简易图片服务器

    这篇文章主要介绍了Linux环境下nginx搭建简易图片服务器,需要的朋友可以参考下...2016-01-27
  • 解决无法解析javax.servlet的方法

    最近在创建一个servlet时,自动生成的代码中出现servlet无法解析的提示,令我无法正常使用servlet里的方法,在对各个步骤进行查看后,发现了问题所在,需要的朋友可以参考下...2021-05-15
  • 详解Servlet入门级设置(超详细 IDEA2020版)

    这篇文章主要介绍了详解Servlet入门级设置(超详细 IDEA2020版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
  • Servlet实现统计页面访问次数功能

    这篇文章主要介绍了Servlet实现统计页面访问次数功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-08
  • node.js利用express自动搭建项目的全过程

    这篇文章主要给大家介绍了关于node.js利用express自动搭建项目的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-09
  • 前端自动化开发之Node.js的环境搭建教程

    这篇文章主要介绍了前端自动化开发之Node.js环境搭建的相关资料,文中介绍的非常详细,对大家学习或者使用node.js具有一定的参考价值,需要的朋友们下面来一起看看吧。...2017-04-03
  • 解决偶现的MissingServletRequestParameterException异常问题

    这篇文章主要介绍了解决偶现的MissingServletRequestParameterException问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-25
  • phpstudy2020搭建站点的实现示例

    这篇文章主要介绍了phpstudy2020搭建站点的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-30
  • 如何使用Vim搭建Lua开发环境详解

    这篇文章主要给大家介绍了关于如何使用Vim搭建Lua开发环境的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-30
  • 快速使用Bootstrap搭建传送带

    这篇文章主要介绍了快速使用Bootstrap搭建传送带的相关资料,非常具有参考借鉴价值,需要的朋友可以参考下...2016-05-09
  • Python Django搭建文件下载服务器的实现

    这篇文章主要介绍了Python Django搭建文件下载服务器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-10
  • 微信小程序 window_x64环境搭建

    这篇文章主要介绍了微信小程序 window_x64环境搭建的相关资料,需要的朋友可以参考下...2016-10-02
  • golang语言中wasm 环境搭建的过程详解

    将 golang 打包为 WASM,通常有两种打包方式,一种是 golang 自带的,另外是使用 tinygo ,接下来通过本文给大家介绍golang语言中wasm 环境搭建的过程,感兴趣的朋友一起看看吧...2021-11-10
  • MySQL 有关MHA搭建与切换的几个错误log汇总

    这篇文章主要介绍了MySQL 有关MHA搭建与切换的几个错误log汇总,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下...2020-12-22
  • Python3 虚拟开发环境搭建过程(图文详解)

    这篇文章主要介绍了Python3 虚拟开发环境搭建过程,本文通过图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-30
  • shell 脚本自动搭建nfs服务的方法示例

    这篇文章主要介绍了shell 脚本自动搭建nfs服务的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-11
  • php怎么样搭建本地服务器?

    php怎么样搭建本地服务器?小编分享的这篇文章详细介绍了php搭建本地服务器的步骤,不会的同学可以看看本文,按照步骤一步一步来,一定可以成功的。 网站程序写完之后,都...2017-07-06
  • 详解基于Scrapy的IP代理池搭建

    这篇文章主要介绍了详解基于Scrapy的IP代理池搭建,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-29
  • 微信公众平台开发教程(三) 基础框架搭建

    这篇文章主要介绍了微信公众平台开发教程(三) 基础框架搭建,具有一定的参考价值,有需要的可以了解一下。...2020-06-25