JavaWeb核心day02-Servlet(一)

一.Servlet

Servlet介绍

是运行在java服务端上的程序,用于接收和响应来自客户端基于HTTP的请求

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

每次请求都会执行service方法

关系视图

在这里插入图片描述

三种编写方式

第一种:实现Servlet接口,接口中的方法必须全部实现。

使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义。

第二种:继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写。

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

第三种:继承HttpServlet,它是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。

使用此种方式,表示我们的请求和响应需要和HTTP协议相关。(目前我们只知道GET和POST,而实际HTTP协议支持7种请求方式,GET POST PUT DELETE TRACE OPTIONS HEAD )。

生命周期

init初始化,出生:请求第一次到达Servlet时,对象就创建出来,并且初始化成功。只出生一次,就放到内存中。

service服务,活着:服务器提供服务的整个过程中,该对象一直存在,每次只是执行service方法。

destory,死亡:当服务停止时,或者服务器宕机时,对象消亡。

安全问题
  • servlet是单例的, 被多个用户同时访问就有可能出现线程安全问题, 解决方案如下
    • 1.不要去定义成员变量, 去定义局部变量
    • 锁,现在就忘掉!!!这种效率太低, 需要排队执行
映射方式

第一种:指名道姓的方式

此种方式,只有和映射配置一模一样时,Servlet才会接收和响应来自客户端的请求。

例如:映射为:/servletDemo5

第二种:/开头+通配符的方式

此种方式,只要符合目录结构即可,不用考虑结尾是什么。

例如:映射为:/servlet/*

第三种:通配符+固定格式结尾

此种方式,只要符合固定结尾格式即可,其前面的访问URI无须关心(注意协议,主机和端口必须正确)

例如:映射为:*.do

三种映射方式的优先级为:第一种>第二种>第三种

创建时机

第一种:请求第一次访问是创建Servlet

  • 它的优势就是减少了对服务器内存的浪费,因为那些一直没有被访问过的Servlet对象都没有创建,因此也提高了服务器的启动时间。而它的弊端就是,如果有一些要在应用加载时就做的初始化操作,它都没法完成,从而要考虑其他技术实现。

第二种:应用加载时创建Servlet,在标签中添加

<load-on-startup></load-on-startup>

负数或0代表第一访问时候才会被创建,正数代表服务器启动就创建Servlet, 但是值越小优先级越高

  • 它的优势是在服务器启动时,就把需要的对象都创建完成了,从而在使用的时候减少了创建对象的时间,提高了首次执行的效率。它的弊端也同样明显,因为在应用加载时就创建了Servlet对象,因此,导致内存中充斥着大量用不上的Servlet对象,造成了内存的浪费。

场景

  • 何时采用第一种方式,何时采用第二种方式。就是当需要在应用加载就要完成一些工作时,就需要选择第一种方式。当有很多Servlet的使用时机并不确定是,就选择第二种方式。
ServletConfig

介绍:它是Servlet的配置参数对象,在Servlet规范中,允许为每个Servlet都提供一些初始化配置

生命周期:由于它是在初始化阶段读取了web.xml中为Servlet准备的初始化配置,并把配置信息传递给Servlet,所以生命周期与Servlet相同。这里需要注意的是,如果Servlet配置了1,那么ServletConfig也会在应用加载时创建。

配置方式
  • 在xml中的添加标签

<init-param>
         <param-name>键1</param-name>
         <param-value>值1</param-value>
     </init-param>
     <init-param>
         <param-name>键2</param-name>
         <param-value>值2</param-value>
    </init-param>
    ........

常用方法

  • String getInitParameter(String key)
    • ·根据键获取值,就是param-name中的键
  • Enumeration getInitParameterNames
    • 获取所有初始化参数
      • 遍历方式:
- Enumeration<String> keys = config.getInitParameterNames();
      while (keys.hasMoreElements()){
        String element = keys.nextElement();
        System.out.println(keys+","+element);
     }
  • ServletContext getServletContext()
    • 获取ServletContext对象
  • String getServletName()
    • 获取Servlet的名称,即servlet-name的内容
ServletContext

介绍:ServletContext对象,它是应用上下文对象。每一个应用有且只有一个ServletContext对象。它可以实现让应用中所有Servlet间的数据共享。

生命周期:

出生: 应用一加载,该对象就被创建出来了。一个应用只有一个实例对象。

活着:只要应用一直提供服务,该对象就一直存在。

死亡:应用被卸载(或者服务器挂了),该对象消亡。

配置方式
- 在<web-app>中添加标签
  - <context-param>
        <param-name>键1</param-name>
        <param-value>值1</param-value>
    </context-param>
    <context-param>
        <param-name>键2</param-name>
        <param-value>值2</param-value>
    </context-param>。。。。。

常用方法

  • ServletContext getServletContext()
    • 创建ServletContext对象
  • String getInitParameter(“键”)
    • 获取值
  • String getContextPath("/")
    • 得到虚拟路径
  • String getRealPath(“/”)
    • 得到真实路径
  • setAttribute(“userName”,“zhangsan”)
    • 设置共享数据
  • getAttribute(“userName”)
    • 获取共享数据
  • removeAttribute(“userName”)
    • 移除共享数据

Servlet3.0注解

1.定义一个类继承HttpServlet
2.重写service方法
3.在service方法中编写逻辑
4.使用@WebServlet(“访问路径”)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要创建一个Servlet,首先需要创建一个继承javax.servlet.http.HttpServlet实现doGet()和doPost()方法即可。好的,下面是创建一个Servlet的步骤: 1. 创建一个Java Web项目,可以使用任何Java Web开发工具,如Eclipse、IntelliJ IDEA等。 2. 在src目录下创建一个Java包,用于存放Servlet。 3. 在该包下创建一个Java,该必须继承javax.servlet.http.HttpServlet。 4. 实现doGet或doPost方法(或者两者都实现),根据业务需求进行相应的逻辑处理。 5. 配置Servlet映射,将Servlet与请求URL进行关联。可以在web.xml文件中配置Servlet映射,或使用注解@WebServlet进行配置。 6. 将项目部署到Web服务器中。 下面是一个示例Servlet: ```java import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "HelloServlet", urlPatterns = {"/hello"}) public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); response.getWriter().write("<h1>Hello Servlet!</h1>"); } } ``` 在这个示例中,我们创建了一个名为HelloServletServlet,并将其映射到URL“/hello”。在doGet方法中,我们设置了响应内容的型为"text/html;charset=utf-8",并输出了一条简单的HTML文本响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值