servlet

1 关于后期的项目

2 servlet

1 概述

Servlet是SUN公司提供的一套规范,名称就叫Servlet规范,它也是JavaEE规范之一。我们可以像学习Java基础一样,通过API来学习Servlet。这里需要注意的是,在我们之前JDK的API中是没有Servlet规范的相关内容,需要使用JavaEE的API。目前在Oracle官网中的最新版本是JavaEE8,该网址中介绍了JavaEE8的一些新特性。当然,我们可以通过访问官方API,学习和查阅里面的内容。

打开官方API网址,在左上部分找到javax.servlet包,在左下部分找到Servlet,如下图显示:

翻译如下

通过阅读API,我们得到如下信息:

第一:Servlet是一个运行在web服务端的java小程序

第二:它可以用于接收和响应客户端的请求

第三:要想实现Servlet功能,可以实现Servlet接口,继承GenericServlet或者HttpServlet

第四:每次请求都会执行service方法

第五:Servlet还支持配置

2 servlet编写步骤,继承GenericServlet方式

1)编码步骤

第一步:前期准备-创建JavaWeb工程

第二步:编写一个普通类继承GenericServlet并重写service方法

第三步:在web.xml配置Servlet

md-end-block 复制代码
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">FirstServlet</span> <span style="color:#770088">extends</span> <span style="color:#000000">GenericServlet</span> {
    <span style="color:#555555">@Override</span>
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">service</span>(<span style="color:#000000">ServletRequest</span> <span style="color:#000000">servletRequest</span>, <span style="color:#000000">ServletResponse</span> <span style="color:#000000">servletResponse</span>) <span style="color:#770088">throws</span> <span style="color:#000000">ServletException</span>, <span style="color:#000000">IOException</span> {
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"servlet的方法执行了"</span>);
    }
}</span></span>
md-end-block 复制代码
<span style="background-color:#f8f8f8"><span style="color:#333333">   <span style="color:#117700"><</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>firstServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>cn.xinzhi.servlet.FirstServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
​
    <span style="color:#117700"><</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>firstServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>/first<span style="color:#117700"></</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span></span></span>

启动程序:访问 localhost:8080/虚拟路径/first,最终执行了UserServlet的service方法

3 Servlet执行过程分析

我们通过浏览器发送请求,请求首先到达Tomcat服务器,由服务器解析请求URL,然后在部署的应用列表中找到我们的应用。接下来,在我们的应用中找应用里的web.xml配置文件,在web.xml中找到FirstServlet的配置,找到后执行service方法,最后由FirstServlet响应客户浏览器。整个过程如下图所示:

一句话总结执行过程:

浏览器------>Tomcat服务器------>我们的应用------>应用中的web.xml------>FirstServlet------>响应浏览器

4 Servlet类视图

在Servlet的API介绍中,它提出了我们除了继承GenericServlet外还可以继承HttpServlet,通过查阅servlet的类视图,我们看到GenericServlet还有一个子类HttpServlet。同时,在service方法中还有参数ServletRequest和ServletResponse

5 Servlet的编写方式

第一种:实现Servlet接口,接口中的方法必须全部实现。 使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义。

第二种:继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写。 使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的。

第三种:继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。**如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。**使用此种方式,表示我们的请求和响应需要和HTTP协议相关。也就是说,我们是通过HTTP协议来访问的。那么每次请求和响应都符合HTTP协议的规范。请求的方式就是HTTP协议所支持的方式(目前我们只知道GET和POST,而实际HTTP协议支持7种请求方式,GET POST PUT DELETE TRACE OPTIONS HEAD )。

6 HttpServlet的使用

第一步:在工程中创建一个Servlet继承HttpServlet

第二步: 配置web.xml文件

第三步: 访问localhost:8080/虚拟路径/second

解决办法:在servlet中添加doGet() 或者doPost()方法

7 servlet的方法和生命周期

  • 方法

  • 生命周期
md-end-block 复制代码
<span style="background-color:#f8f8f8"><span style="color:#333333"><strong><span style="color:#0000ff"># 被创建:执行init方法,只执行一次</span></strong>
    <span style="color:#aa5500">-- 在标签下配置</span>
    <span style="color:#aa5500">1. 第一次被访问时,创建</span>
        <span style="color:#aa5500"><load-on-startup>的值为负数,默认的是第一次访问的时候创建</span>
    <span style="color:#aa5500">2. 在服务器启动时,创建</span>
        <span style="color:#aa5500"><load-on-startup>的值为0或正整数,随着tomcat的启动创建</span>
<strong><span style="color:#0000ff"># 提供服务:执行service方法,执行多次</span></strong>
  
<strong><span style="color:#0000ff"># 被销毁:执行destroy方法,只执行一次</span></strong>
    <span style="color:#aa5500">-- Servlet被销毁时执行。服务器关闭时,Servlet被销毁</span>
    <span style="color:#aa5500">-- 只有服务器正常关闭时,才会执行destroy方法。</span>
    <span style="color:#aa5500">-- destroy方法在Servlet被销毁之前执行,一般用于释放资源</span>
<strong><span style="color:#0000ff"># 注意事项:</span></strong>
    <span style="color:#aa5500">Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的</span>
    <span style="color:#aa5500">多个用户同时访问时,可能存在线程安全问题。</span>
    <span style="color:#aa5500">解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值</span></span></span>

8 分层开发

  • JSP Model1开发

  • JSP Model2

  • MVC设计模式

视图(View)- JSP、HTML等:负责与用户交互

控制器(Controller)- Servlet:负责流程控制

模型(Model)- JavaBean:负责业务逻辑处理、数据库访问

  • 分层开发

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层、业务逻辑层、数据访问层。区分层次的目的即为了"高内聚低耦合"的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。

分层开发优缺点

优点:

1、开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、利于各层逻辑的复用。

缺点:

1、降低了系统的性能

2、增加了程序的复杂度

3、有时会导致级联的修改。

9 服务器向浏览器写数据的步骤

  1. 服务器获取字符/字节输出流

  2. 输出数据

md-end-block 复制代码
<span style="background-color:#f8f8f8"><span style="color:#333333">        <span style="color:#000000">response</span>.<span style="color:#000000">setContentType</span>(<span style="color:#aa1111">"text/html;charset=utf-8"</span>);
        <span style="color:#000000">request</span>.<span style="color:#000000">setCharacterEncoding</span>(<span style="color:#aa1111">"utf-8"</span>);
        <span style="color:#000000">PrintWriter</span> <span style="color:#000000">out</span> <span style="color:#981a1a">=</span> <span style="color:#000000">response</span>.<span style="color:#000000">getWriter</span>();
        <span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"<HTML>"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"  <HEAD><TITLE>首页</TITLE>"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"</HEAD>"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"  <BODY>"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">print</span>(<span style="color:#aa1111">"<p style='color: red'>"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">print</span>(<span style="color:#aa1111">"这是个段落"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">print</span>(<span style="color:#aa1111">"</p>"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"  </BODY>"</span>);
        <span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"</HTML>"</span>);
        <span style="color:#aa5500">// flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满</span>
        <span style="color:#000000">out</span>.<span style="color:#000000">flush</span>();
        <span style="color:#000000">out</span>.<span style="color:#000000">close</span>();</span></span>

10 servlet改写jsp

  • 改写注册逻辑

  • 改写登录逻辑

  • 改写展示逻辑

相关推荐
while(1){yan}19 小时前
计算器和登录界面(实现前后端互通)
spring boot·spring·servlet·java-ee·tomcat·maven
lkbhua莱克瓦2419 小时前
反射4-反射获取成员变量
java·开发语言·servlet·反射
青衫码上行21 小时前
【JavaWeb学习 | 第23篇】监听器、RBAC权限模型
java·学习·servlet·jsp
顶点多余21 小时前
继承和多态
c++·servlet
本旺1 天前
【数据开发离谱场景记录】Hive + ES 复杂查询场景处理
hive·hadoop·elasticsearch
无泪无花月隐星沉1 天前
uos server 1070e部署Hadoop
大数据·运维·服务器·hadoop·分布式·uos·国产化os
悟能不能悟1 天前
springboot全局异常
大数据·hive·spring boot
JH30732 天前
Gateway 中能写 Servlet Filter 吗?
servlet·gateway
是阿威啊2 天前
【第一站】本地虚拟机部署Hadoop分布式集群
大数据·linux·hadoop·分布式
lightningyang2 天前
Hadoop 分布式集群配置(OpenEuler 1主2)
hadoop·openeuler·天枢一体化虚拟仿真靶场平台