servlet

发布时间:2023年12月25日

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

<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>
<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的方法和生命周期

  • 方法

  • 生命周期

<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. 输出数据

<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

  • 改写注册逻辑

  • 改写登录逻辑

  • 改写展示逻辑

文章来源:https://blog.csdn.net/weixin_65700815/article/details/135168366
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。