前言

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

Servlet还有学习的必要吗?(手工搭建Servlet)的更多相关文章

  1. ABP架构学习系列三:手工搭建ABP框架

    由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢 ...

  2. 【转】spring3 MVC实战,手工搭建Spring3项目demo

    更新:这几天对spring3的理解又进了一步,今天抽空把这篇文章中的错误和不当之处做了修改. 最近的项目在用Spring3,涉及到了基于注解的MVC,事务管理,与hibernate的整合开发等内容,我 ...

  3. win7/win8下手工搭建WAMP环境

    win7/win8下手工搭建WAMP环境. 最近学习wamp,看了好多教程,出来好多问题,终于成功搞定,这里集合了一下最好的教程,写了一些自己的经验,希望大家有用 这里不能上传图片,我就写了个带pdf ...

  4. Java学习心得之 Linux下搭建Java环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建Java环境 1.前言2.JDK安装3.配置环境变量4. ...

  5. Java学习心得之 Linux下搭建JavaWeb环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建JavaWeb环境 1. 前言2. Java安装3. t ...

  6. Ruby学习心得之 Linux下搭建Ruby环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Ruby学习心得之 Linux下搭建Ruby环境1.前言2.Linux下安装Ruby环境 一 ...

  7. MyBatis学习系列一之环境搭建

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 学习一个新的知识,首先做一个简单的例子使用一下,然后再逐步深入.MyBat ...

  8. Hadoop学习笔记(3)——分布式环境搭建

    Hadoop学习笔记(3) ——分布式环境搭建 前面,我们已经在单机上把Hadoop运行起来了,但我们知道Hadoop支持分布式的,而它的优点就是在分布上突出的,所以我们得搭个环境模拟一下. 在这里, ...

  9. javaweb学习路之一--web项目搭建

    概述: 工作闲暇时间想要自己搭建一个web项目玩玩,没想到大半天才弄了一个springMVC+mybatis的网站,简直菜的不行,以下记录所有的步骤加深印象 使用环境 1.jdk1.8 2.maven ...

随机推荐

  1. C语言|博客作业05

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9825 我在这个课程的 ...

  2. windows下大数据开发环境搭建(1)——Hadoop环境搭建

    所需环境 jdk 8 Hadoop下载 http://hadoop.apache.org/releases.html 配置环境变量 HADOOP_HOME: C:\hadoop-2.7.7 Path: ...

  3. AE10.0在Visual Studio 2012下安装没有模板(转)

    转自百度经验: VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及 ...

  4. Flex容器拖动(Bordercontainer为例)

    Bordercontainer的拖放到任意位置. mxml: 为Bordercontainer添加鼠标按下和弹起事件 <s:BorderContainer id="bdShow&quo ...

  5. 元数据管理的重要性 - xms

    什么是元数据?引用百科的描述就是:元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息: 看起来有点抽象 ...

  6. Hadoop之HDFS文件系统

    概念 HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件:其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色. HDFS的设计适合一次写入,多次读出的场景,且不 ...

  7. 从两个List集合里找到相同部分和不同部分

    /** * 获取两个集合里元素不同的部分 */ public List<User> getDifferent(List<User> u1, List<User> u ...

  8. 全网最通俗易懂的Kafka入门!

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在这篇之前已经写过两篇基础文章了,强烈建议先去阅读: ...

  9. 实战webpack系列03

    03.Webpack的强大功能 一.生成Source Maps(使调试更容易) 通过简单的配置,webpack就可以在打包时为我们生成的source maps,这为我们提供了一种对应编译文件和源文件的 ...

  10. CentOS 7 Cobbler 配置 YUM仓库

    通过Cobbler配置内网YUM仓库 在上一篇Cobbler 安装中,配置好了Cobbler 下面来通过Cobbler来配置内网的YUM仓库 这里可以同步所有版本的yum源,增加内网的yum安装下载速 ...