当前位置: 首页 > news >正文

浅谈Servlet

Servlet(服务端小程序)是使用Java语言编写的服务端小程序,可以用于生成动态的Web页面。

Servlet处理的基本流程

clipboard.png

  1. 客户端通过HTTP提出请求。
  2. Web服务器接受该请求并将其发送给Servlet。如果这个Servlet还没有被加载,Web服务器会将它加载到Java虚拟机并执行它。
  3. Servlet程序将接收该HTTP请求并执行某种处理。
  4. Servlet会将处理后的结果向Web服务器返回应答。
  5. Web服务器将从Servlet收到的应答发回给客户端。

在整个Servlet程序中,最重要的就是Servlet接口,在此接口下定义了一个GenericServlet的子类,但是一般不会直接继承这个子类,而是根据不同的协议选择GenericServlet的子类来继承,例如:
clipboard.png

用Servlet来写一个“Hello World”

首先我们要明确的一件事是:在处理HTTP请求的Servlet程序中,肯定要继承HttpServlet类,那么在自定义的Servlet中至少要覆写HttpServlet中提供的doGet()方法。

javapackage servlet;

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;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        out.print("<html><head><title>First Servlet</title></head>");
        out.println("<body>");
        out.println("

<h1>Hello world</h1>

");
        out.println("</body></html>");
        out.close();
    }
}

写好这个Servlet然后编译,还不能访问,因为我们还需要找到一个钩子让网页跟我们的Servlet联系起来。那么这个“钩子”就是配置web.xml的路由映射

xml<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/helloServlet</url-pattern>
</servlet-mapping>

这样,就可以通过../helloServlet查看效果:
clipboard.png

一个表单实例

如果表单使用的是post的方式提交的,所以在编写Servlet程序时要使用doPost()方法。
input.html:

html<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>信息录入</title>
</head>
<body>
<form action="inputServlet" method="post">
    输入内容: <input type="text" name="info"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

InputServlet.java:

javapackage servlet;

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;

/**
 * Created by mcbird on 14/11/24.
 */
public class InputServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String info = req.getParameter("info");
        PrintWriter out = resp.getWriter();
        out.println("<html><body>");
        out.println("

<h1>" + info + "</h1>

");
        out.println("</body></html>");
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

同样,我们也需要在web.xml下添加一条路由映射规则:
web.xml:

xml<servlet>
        <servlet-name>input</servlet-name>
        <servlet-class>servlet.InputServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>input</servlet-name>
        <url-pattern>/inputServlet</url-pattern>
    </servlet-mapping>

这样我们在input.html中输入信息后就会跳转到InputServlet,这样InputServlet就可以通过req对象获取到info变量的值。

Servlet生命周期

Servlet的生命周期包括加载程序、初始化、服务、销毁、卸载5个部分,如下图所示。
clipboard.png

加载Servlet

Web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实例,但是必须在web.xml中指定Servlet的位置,成功加载后,Web容器会通过反射的方式对Servlet进行实例化

初始化

当一个Servlet被实例化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一系列初始化的工作,像建立数据库的连接、读取资源文件信息等,如果初始化时失败了,那么Servlet将被直接卸载。

处理服务

当有请求提交时,Servlet将调用service()方法(常用的是doGet()doPost())进行处理。

销毁

当Web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让实例释放掉所占用的资源。

卸载

当一个Servlet调用完destroy()方法后,此实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法进行初始化。

在默认情况下,初始化方法是在第一次使用时才调用,你也可以通过在web.xml中配置servlet<load-on-startup>1</load-on-startup>这样在容器启动时Servlet就会被初始化。

相关文章:

  • [推荐]DDOS攻击与防范知识介绍
  • leetcode------Reverse Words in a String
  • js中常用数组方法concat join push pop slice splice shift
  • 那些年,一起学的Java 2-4
  • 那些年,一起学的Java 3-3
  • Android SDK下载项的说明
  • Linux内存管理_stack区的地址方向
  • 简单易懂的现代魔法——Play Framework攻略1
  • struts2上传文件,文件大小默认最大值的修改
  • **PHP二维数组遍历时同时赋值
  • Windows server 2008系统的安装
  • 修正memcache.php中的错误示例
  • [每天一个知识点]34-职业生涯-用得着和用不着的知识
  • 将集成spring的项目从tomcat上移植到weblogic下存在的问题
  • Python中不要定义和系统模块一样的名字
  • 分享一款快速APP功能测试工具
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • JavaScript设计模式之工厂模式
  • Java精华积累:初学者都应该搞懂的问题
  • Material Design
  • MySQL几个简单SQL的优化
  • React+TypeScript入门
  • Shadow DOM 内部构造及如何构建独立组件
  • Vue 2.3、2.4 知识点小结
  • vue脚手架vue-cli
  • Webpack 4 学习01(基础配置)
  • Web标准制定过程
  • 后端_MYSQL
  • 解析带emoji和链接的聊天系统消息
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小而合理的前端理论:rscss和rsjs
  • 小试R空间处理新库sf
  • 在electron中实现跨域请求,无需更改服务器端设置
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (二)fiber的基本认识
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)vue-router+UI组件库
  • (十八)三元表达式和列表解析
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .jks文件(JAVA KeyStore)
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core引入性能分析引导优化
  • .NET NPOI导出Excel详解
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net 路由处理厉害了
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET大文件上传知识整理
  • .Net语言中的StringBuilder:入门到精通
  • /etc/motd and /etc/issue
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [<死锁专题>]
  • [20170728]oracle保留字.txt