Servlet相关知识

4.1servlet简介:

   是一种web服务器端编程技术(不要觉得Servlet很神奇,就是一个普通的java类,只不过可以运行在服务器端。在服务器端接收客户端的请求和返回响应信息)

   是实现了特殊接口的Java类(一级一级往上找,确实实现了Servlet接口,但是我们用得时候,是继承httpServlet类)

   Servlet类对象, 由支持Servlet的web服务器调用和启动运行(很大的区别:原来写的代码右键run就可以了,现在谁帮我们去调用,tomcat。)

   一个Servlet负责对应一个或一组URL访问请求,并返回相应的响应内容。

总结:

A:Html,css,js在浏览器中执行,在服务器端生成。我们学习的Servlet就是一种在服务器端动态生成html,css,js数据的技术。

B:Servlet是实现特殊接口的java类,所以才可以在服务器端运行

C: 运行Servlet必须在Servlet 容器中,说白了,就是Servlet必须在服务器上运行。(Servlet的启动和调用完全由Tomcat服务器掌控)【tomcat----->Servlet容器,web服务器】

4.2servlet运行过程:

浏览器发送请求到服务器(用到http协议)

    服务器根据请求的url,去调用响应的Servlet类(请求)

    通过Servlet中的打印流对象将生成的html数据输出给服务器(响应)

    服务器将servlet生成的数据在输出给客户端浏览器(用到http协议)

4.3servlet路径配置:

​
<servlet>

      <servlet-name>HiServlet</servlet-name>

      <servlet-class>(包名.类名)Servlet.HiServlet</servlet-class>

</servlet>

   <servlet-mapping>

      <servlet-name>HiServlet</servlet-name>

      <url-pattern>/abcd</url-pattern>只有abcd这一种方式可以访问到hiServlet类。

      <url-pattern>/aaa/*</url-pattern>

只要是在aaa这个路径下的所有请求都可以访问hiServlet类。

      <url-pattern>*.bbb</url-pattern>

 只要是以bbb结尾的路径都可以访问hiServlet类。

       http://localhost:8080/项目名/asdsafd/asffs/fsfdsgf/sfasdfsa.bbb

http://localhost:8080/项目名/sfasdfsa.bbb都可以

<url-pattern>/ccc/*.bbb</url-pattern>===非法写法!!

</servlet-mapping>

​

4.4 405错误原因:

doGet,doPost主要来说也还是用来处理业务逻辑的,根据不同的请求方式。

而Service方法一定要调用doGet,doPost方法,如果程序员没有重写doGet,doPost方法,那么就会报错405。所以当报405错误的时候,程序员就知道了啊,没有重写doGet,doPost方法。同时重写的时候,需要删除掉super.doGet()  super.doPost()方法。

4.5Servlet的生命周期:

我们发一个请求,后台是不是就有一个人帮我们去处理啊,我们称之为Servlet啊!我们以前的服务器环境,因为服务器内存比较小,支持不了很多的Servlet。于是就要想出来一个机制,只支持一个Servlet。你访问它我给你创建一个Servlet,你再访问它,还是用刚才的那个Servlet。也就是说不管你写多少个代码,我只给你创建一个对象。那这种模式就是单例模式。

  4.5.1.伪单例模式:

servlet是一个伪单例模式,只是借鉴了单例模式的思想,他通过别的途径做的实现】

  4.5.2.生命周期的步骤:

第一步:实例化

第二步:初始化,

(客户端【第一次】发送请求   ----到该Servletli里,服务器才会创建该对象)

执行,(第三步:接收请求,第四步:对请求进行分发)【反复】

第五步:销毁。(1.服务器关闭的时候,所有Servlet对象都销毁)

实例化,初始化,销毁只执行一次;执行和请求分发反复执行。

  4.5.3.讲解Servlet是一个伪单例模式:

    (1)创建HelloServlet类,实现5个方法,其中service方法,调用父类的Service方法。

(2)为什么说Servlet是伪单例模式呢?

        因为单例模式有3种方式,懒汉式(需要私有构造),饿汉式(需要私有构造),枚举方式。而我们的Servlet中没有枚举,也没有出现私有构造。那是通过什么方式实现单例模式的呢?---map集合方式。

因为运行在servlet容器中,类似于map(key-value)

【来看一个错误,在web.xml中,我把两个Servlet name值都设置为相同的。运行:

 <servlet>

      <servlet-name>hello</servlet-name>

<servlet-class>servlet.hello</servlet-name>

</servlet>

<servlet>

      <servlet-name>hello</servlet-name>

<servlet-class>servlet.hi</servlet-name>

</servlet>---后面的类把前面的类给覆盖了。

<servlet-mapping>

  <servlet-name>hello</servlet-name>

<url-class>/hello.action</url-class>

</servlet-mapping>

    Tomcat6.x如果名字相同直接报错

    Tomcat7.x如果名字相同直接覆盖

    Tomcat8.x如果名字相同直接报错

         Map<String,HttpServlet>

         Key:String --- (servlet-name)hello

         Value:代表Servlet对象通过反射获的。Class.getConstructor(null).newInstance(null);

            第一次访问的时候创建新的对象

            第二次访问直接使用已有的对象====所以servlet-name的名字不能重复。

(3)在servlet容器中最多只有一个对象(理论上),实际上可以创建多个为什么呢?

<servlet>

      <servlet-name>hello</servlet-name>

<servlet-class>servlet.hi</servlet-name>

</servlet>

<servlet-mapping>

  <servlet-name>hello</servlet-name>

<url-class>/hello.action</url-class>



<servlet>

      <servlet-name>hello01</servlet-name>

<servlet-class>servlet.hi</servlet-name>

</servlet>

<servlet-mapping>

  <servlet-name>hello01</servlet-name>

<url-class>/hello01.action</url-class>

=====当启动服务,访问/hello01.action创建一次hi ;访问/hello.action又创建一次hi。----只是从另外一个角度告诉我们Servlet容器就是一个map集合。【不推荐这种写法】

以上就是载入:

     初始化:

      执行,服务:map.get(key).service();

销毁:是我们处理不了的,都是服务器执行的。只是我们在销毁之前可以做一些工作。

(4)那你说Servlet模拟的是懒汉式还是饿汉式啊?

   Servlet默认属于懒汉式,第一次访问的时候被载入并初始化;

   如果觉得初始化时间较长Servlet可以设置成饿汉式。

 ---在web.xml中,

<servlet>1

     <servlet-name>helloServlet</servlet-name>

     <servlet-class>servlet.helloServlet</servlet-class>

    <load-on-startup></load-on-startup>
  ----如果值是正整数就是启动服务就被加载,整数越小越提前加载;

        如果值是负整数,或者没写这个标签,都是在第一次访问的时候加载。

</servlet>

(5)什么是生命周期啊?就是说什么时候有的,以及什么时候没的。

     什么时候有的:第一次访问的时候(默认)

     什么时候没的:服务器关闭,而不是调用destory();调用destory()方法只是为了在销毁之前,在做一些工作。不需要我们手动调用,服务器会给我们自动调用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少女许鑫蓁.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值