Java Servlet-程序员宅基地

技术标签: java  后端  java基础学习笔记  开发语言  

B/S:浏览器/服务器。 浏览器通过网址来访问服务器

一、什么是Servlet

servlet 是运行在 Web 服务器中的小型 Java 程序(简单理解为:服务器端的小应用程序)。

作用:接收用户的请求,并对请求做出处理,处理结果响应给客户端

Servlet是JavaWeb的三大组件之一(servlet、过滤器、监听器),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

接收请求数据、处理请求、完成响应。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口

二、实现Servlet的三种方式

  • javax.servlet.Servlet接口
  • javax.servlet.GenericServlet类;implements Servlet  abstractor
  • javax.servlet.http.HttpServlet类;extends GenericServlet abstractor

示例Servlet接口:

ervlet.java
public interface Servlet {
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
}

 

 三、servelt的生命周期

相关方法:

void init(ServletConfig); 出生(servlet被创建成功后执行的方法)

void service(ServletRequest,ServletResponse); 服务

void destroy();销毁

1、出生:

服务器会在Servlet第一次被访问时创建Servlet,或者是在服务器启动时创建Servlet。如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。

2、Servlet服务:

  当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

3、Servlet的离去:

Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。

示例:

public class HelloServlet implements Servlet {
    public void init(ServletConfig config) throws ServletException {
       System.out.println("Servlet被创建了!");
    }
    public ServletConfig getServletConfig() {return null;}
    public void destroy() {
       System.out.println("Servlet要离去了!");
    }
    public String getServletInfo() {return null;}
 
    public void service(ServletRequest req, ServletResponse res)
           throws ServletException, IOException {
       System.out.println("hello servlet!");
    }
}

四、servlet细节

1、Servlet与线程安全

因为servlet是单例的(100个人访问,访问都是同一个servlet)

因为一个类型的Servlet只有一个实例对象,那么就有可能会现时出一个Servlet同时处理多个请求,那么Servlet是否为线程安全的呢?答案是:“不是线程安全的”。这说明Servlet的工作效率很高,但也存在线程安全问题!

所以我们不应该在Servlet中随便创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。

2 让服务器在启动时就创建Servlet

默认情况下,服务器会在某个Servlet第一次收到请求时创建它。也可以在web.xml中对Servlet进行配置,使服务器启动时就创建Servlet

<servlet>
       <servlet-name>hello1</servlet-name>
       <servlet-class>cn.test.servlet.Hello1Servlet</servlet-class>
       <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>hello1</servlet-name>
       <url-pattern>/hello1</url-pattern>
    </servlet-mapping>
    <servlet>
       <servlet-name>hello2</servlet-name>
       <servlet-class>cn.test.servlet.Hello2Servlet</servlet-class>
       <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>hello2</servlet-name>
       <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    <servlet>
       <servlet-name>hello3</servlet-name>
       <servlet-class>cn.test.servlet.Hello3Servlet</servlet-class>
       <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>hello3</servlet-name>
       <url-pattern>/hello3</url-pattern>
    </servlet-mapping>

五、手动编写servlet

1、创建一个MyServlet继承HttpServlet,重写doGet和doPost方法,也就是看请求的方式是get还是post,然后用不同的处理方式来处理请求

2、在web.xml中配置MyServlet,为什么需要配置?让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用。

配置四个东西。               

配置之后,浏览器是如何通过我们配置的信息来找到对应的servlet的。            

按照步骤,首先浏览器通过http://localhost:8080/test01/MyServlet来找到web.xml中的url-pattern,这就是第一步,匹配到了url-pattern后,就会找到第二步servlet的名字MyServlet,知道了名字,就可以通过servlet-name找到第三步,到了第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。

3、实验,验证上面配置成功。         

            

4、利用向导新建MyServlet,右击项目,在new选项中有直接新建servlet的选项,配置MyServlet类中的信息             

5、配置web.xml中的servlet信息              

   

6、查看MyServle01类中的代码和web.xml,其中的配置跟手动的配置是一样的,只是用图形化界面,让我们更方便的创建servlet而产生的。

六、Servlet get和Servlet post的区别

 1、get方式的提交

         (1)get提交中请求参数以 ?username=admin&password=admin123 形式拼接在路径(url)的后面

         (2)不安全的提交方式

         (3)提交的参数个数是有限制的,get方式能提交的数据只能是文本,且大小不超过1024个字节

         (4)提交后调用的是doGet()方法处理

    2、post方式的提交

         (1)提交的请求参数是放在请求体中(http包的包体中)

         (2)相对安全的提交方式

         (3)参数个数没有限制的,post不仅可以提交文本还有二进制文件。

         (4)提交后调用的是doPost()方法处理除了用form表单提交指定为post方式则为post方式提交,其它均为get方式提交

七:重定向和转发

重定向(Redirect):

是指当浏览器请求一个URL时,服务器返回一个重定向指令,告诉浏览器地址已经变了,麻烦使用新的URL再重新发送新请求。

示例:

//已经编写了一个能处理/hello的HelloServlet,如果收到的路径为/hi,希望能重定向到/hello,可以再编
//写一个RedirectServlet


@WebServlet(urlPatterns = "/hi")
public class RedirectServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 构造重定向的路径:
        String name = req.getParameter("name");
        String redirectToUrl = "/hello" + (name == null ? "" : "?name=" + name);
        // 发送重定向响应:
        resp.sendRedirect(redirectToUrl);
    }
}

转发(Forward):

Forward是指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。

示例:

//已经编写了一个能处理/hello的HelloServlet,继续编写一个能处理/morning的ForwardServlet:


@WebServlet(urlPatterns = "/morning")
public class ForwardServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/hello").forward(req, resp);
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ww981580010/article/details/123171761

智能推荐

蓝桥杯第四届省赛模拟智能灌溉_第四届蓝桥杯单片机省赛 site:blog.csdn.net-程序员宅基地

文章浏览阅读649次。第四届省赛主要涉及到IIC和DS1302,在官方驱动基础上进行改动。#include &lt;STC15F2K60S2.h&gt;#include "ds1302.h"#include "iic.h"#define uchar unsigned char#define uint unsigned intuchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X9..._第四届蓝桥杯单片机省赛 site:blog.csdn.net

unity3D 实现物体(人物)移动到鼠标点击的位置_unity获取鼠标点击的位置,并将其赋值给物体1的坐标-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏45次。1、通过输入鼠标右键获取光标在屏幕上的坐标信息,if(Input.GetMouseButtonDown(1)){ Vector3 mousePosition= Input.MousePosition;}//此处获得的是光标在屏幕上的相对坐标,不方便直接使用。2、将该光标转化为世界坐标//从相机中打出一个经过mousePosition的射线Ray ray=Camera.main.ScreenP..._unity获取鼠标点击的位置,并将其赋值给物体1的坐标

uni-app vue-cli创建项目方式,打包成android ios手机apk_vueuniapp打包成-程序员宅基地

文章浏览阅读4k次,点赞2次,收藏13次。当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。文章演示Android打包,ios打包也差不多步骤(ios要自有证书,测试证书只能用在越狱手机上上)。项目基于vue-cli方式创建,打包成Android ios手机apk。第一步: 勾选需要打包为 Android 还是 ios 的手机apk。第三步:测试app包,选择公共测试证书就好了,正式上线选择自有证书。应用名称:打包后的Apk包名称。_vueuniapp打包成

Linux安装字体_可以讲windows上的字体放在linux服务器上吗-程序员宅基地

文章浏览阅读4.2k次。Windows下的ttf字体是可以在Linux上使用的,我们可以“盗用”Windows现成的字库,所以我们只需要把windows下的字体文件上传到Linux上,执行相关命令就行了。(1)创建目录mkdir -p /usr/share/fonts/my_fonts(2)将要安装的字体上传到该文件夹下这里我们安装黑体常规,即simhei.ttf。关于具体字体查找,我以windows为例。进入C:\Windows\Fonts,该文件夹下就存放相关字体,将simhei.tty拷贝到linux 目录/u_可以讲windows上的字体放在linux服务器上吗

【Ubuntu16.04】安装无线网卡驱动_ubuntu 16.04 连接 usb网卡-程序员宅基地

文章浏览阅读4.9w次,点赞6次,收藏29次。1、参考链接:https://blog.csdn.net/weijia_kmy/article/details/51304518昨天下载了ubuntu16.0.4,安装后发现没有wifi可连接,于是上网查了一个晚上,都没有可行的办法。无奈今早就又下载ubuntu15.10安装,发现可以连wifi。用了一会突然桌面没了。我的天!又捣鼓了一上午......也没好过来。个人感觉15.10没16.04好。..._ubuntu 16.04 连接 usb网卡

数据标注行业那些事_数据标注未涉及的行业-程序员宅基地

文章浏览阅读198次。一位在觉醒向量做数据标注的员工说:正如别人评论的那样,我们的工作的确很像数字世界的建筑工人,但是我们在扮演着很重要的角色,因为没有我们,AI这栋摩天大楼就无法建成。 大数据作为一个术语而言,其历史可能并不久远,但形成数据的许多基础早已经奠定。我们来简要回顾一下引领我们进入数据时代的历史。大约公元前18000年人类用计数棒进行储存和分..._数据标注未涉及的行业

随便推点

PO系列之 PO中使用webService_sap po edit external definition-程序员宅基地

文章浏览阅读738次。一前言PO(/PI)是SAP公司的一个中间件产品,用来辅助连接SAP系统与外围系统. (当然外围系统之间也可以使用PO).作为中间件,PO支持很多与系统交互的方式(RESTful, SOAP ,JDBC, FILE )等等百度了一下 webService 与SOAP的关系(如图一)可以看出SOAP只是webService三要素之一, 用来描述传递信息的格式本文主要介绍webService在PO中的应用及特殊映射方式图一二ABAP与webServiceABAP可.._sap po edit external definition

通达信公式编写使用哪种计算机语言,通达信公式编写入门(附通达信经典实用选股公式).pdf...-程序员宅基地

文章浏览阅读7.1k次,点赞4次,收藏20次。通达信公式编写入门通达信公式入门公式编辑器快捷键: [Ctrl+F][.9]我们大多数的用户并不是完全了解“公式编辑器”的意义, 简单地,我们可以从以下几个角度进行理解:一、指标分析:“公 式编辑器”好比是一个工作母床,通过这个工作母床可以制造出所需要的各式各样的零件, 同样,在指标分析的工作中, 利用编辑器可以编写出相应的分析条件..._通达信编程3000例pdf

Cado-nfs使用-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏14次。Cado-nfs使用CADO-NFS是C / C ++中数字字段筛选(NFS)算法的完整实现,用于分解整数并计算有限字段中的离散对数。它包含与算法所有阶段相对应的各种程序,以及可能在计算机网络上并行运行它们的通用脚本。Cado-nfs gitlab地址1. Cado分解大整数命令非常简单,直接加上大整数即可./cado-nfs.py [大整数]举个栗子./cado-nfs.py 9037762929200312168400214710176085810924733654900109067_cado-nfs

Web开发 ------ 基于Django+Vue网上购物商城(一):数据库模型和xadmin后台设计_django 不要 admin-程序员宅基地

文章浏览阅读4.2k次,点赞6次,收藏48次。文章目录基于Django+Vue网上购物商城一、项目介绍1.技术难点2.系统功能3.项目环境4.后台管理页面二、项目准备创建Django工程报错 及解决三、数据库模型设计1.创建app包以及app里面的四个应用2.用户认证数据库模型设计(1)设计代码(2)settings中配置,替换系统的用户(3)settings中注册,到INSTALLED_APPS(4)迁移数据库2.商品管理模型设计(1)安装..._django 不要 admin

Idea导入jar包的两种方法_idea将前端jar包导入到后端-程序员宅基地

文章浏览阅读10w+次,点赞140次,收藏375次。今天用IDEA,需要导入一个Jar包,因为以前都是用eclipse的,所以对这个idea还不怎么上手,连打个Jar包都是谷歌了一下。但是发现网上谷歌到的做法一般都是去File –&gt; Project Structure中去设置,有没有如同eclipse一样简便的右键添加方法呢。然后自己摸索了一下,找到了。以阿里大于的依赖包为例子,因为正好是我遇到要导入的Jar包。先说下第一种方法吧。也就是Fi..._idea将前端jar包导入到后端

MySQL for 循环里做判断_判断和循环(完整版)-程序员宅基地

文章浏览阅读1.1k次。循环与判断一、判断判断语句通常基于某种条件触发,当条件满足时,执行一些特定的操作。1.if语句Python使用关键字if语句实现判断,最简单的用法为:if :其中包含这样几个部分:if关键字,表示这是一条判断语句;表示判断的条件,当这个条件被满足(即条件为真)时,执行中的代码,条件不满足,中的代码不会被执行;冒号表示判断代码块的开始;表示条件满足时,执行的代码块。举个例子:x = 1if x &g..._mysql判断成绩等级循环