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 bin中的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出现异常,请移步 http://www.javashuo.com/article/p-hmqwhkhk-cc.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
  能够看出,使用注解和使用配置文件的效果是同样的。
相关文章
相关标签/搜索