web开发1——servlet

一. 什么是servlet
servlet是服务器端(tomcat)运行的一段java程序(java接口),通过http协议,负责接收和响应web客户端(浏览器)的请求。
先附上servlet家族图谱。
这里写图片描述
以一个简单servlet小程序,讲述servlet的实现方式:

  • 1 编写java类,实现servlet接口,主要实现service方法。
  • 2 配置web.xml文件,给servlet一个可访问的统一资源标识符URI(servlet-mapping)。
类HelloServlet  实现了servlet接口
配置web.xml文件
<servlet>
    <servlet-name>wahaha</servlet-name>
    <servlet-class>cn.ishuai.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>wahaha</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet-name>名字随便取,只是个标识符而已,只要<servlet-mapping><servlet><servlet-name>子元素相同就行。


二 执行过程

  • 1 浏览器输入http://localhost:8080/day01/hello

  • 2 tomcat收到请求后,查询web.xml配置文件。先查<servlet-mapping>,因为该配置属性向浏览器刻意暴露了访问地址hello。然后读取mapping的子元素<servlet-name>,确定servlet名字为wahaha。然后去查询<servlet-name>为wahaha的<servlet>元素,读取<servlet>子元素<servlet-class>的值,确定要访问的类名及路径为cn.ishuai.HelloServlet。

  • 3 到tomcat安装目录/webapps/day01/WEB-INF/classes/cn/ishuai目录下查找到HelloServlet.class文件,执行。

注:看一下web项目目录:

WebRoot   web应用所在目录
|-html css js jsp文件                  这些文件存在根目录下,可被外界直接访问
|-WEB-INF目录                          该目录下文件不能被外界访问,由web服务器负责调用 
    |-class目录 (java 类)
    |-lib   (jar包)
    |-web.xml  (配置文件)

浏览器想要执行的就是服务器中的HelloServlet这个类,可是它如何才能访问到这个类呢?答案就是通过配置文件web.xml,通过<servlet-mapping>这个元素,向外暴露可访问的URL,浏览器输入URL来访问服务器,服务器通过URL找到对应的servlet名字及地址,向浏览器返回结果。<url-pattern>向外暴露的名称需加反斜线,其相当于http://localhost:8080/projectName/Hello中项目名projectName后的hello类,day01就是项目名。如果不加反斜线,表示在8080后找,认为projectName是类,这样就不能执行了。

详细执行过程:
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:

  • 1> Web服务器首先检查是否已经装载(装进内存,包括web配置文件)并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步。

  • 2> 装载并创建该Servlet的一个实例对象 (调用初始化方法)。

  • 3> 调用Servlet实例对象的init()方法。

  • 4> 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。service方法读取请求信息,写入相应信息,然后web容器读取相应信息,通过http协议返回给浏览器。

  • 5> WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet(删除掉项目文件),并在卸载之前调用Servlet的destroy()方法。


三 servlet的生命周期

分为四个阶段,实例化(构造函数)–>初始化(init)–>服务(service)->销毁(destroy)

  1. 出生:(实例化–>初始化)浏览器第一次访问Servlet就出生(默认情况下,如果想在web容器启动时就出生,需要在<servlet>元素中添加<load-on-startup>2</load-on-startup>这个子元素,其值为正整数,越小,优先级越高,表示在多个servlet下会优先被启动)。

  2. 活着:(服务)应用活着,servlet就活着。

  3. 死亡:(销毁)应用卸载了servlet就销毁。(卸载是指通过浏览器的tomcat界面—manage
    app—undeploy,点击undeploy表示卸载应用,即在tomcat的webapps目录下,会把day01这个应用(项目)删掉)

针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。

在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。


四 servlet的三种创建方式

  • 1 实现javax.servlet.Servlet接口.(需要重写servlet里的5个抽象方法)
  • 2 继承javax.servlet.GenericServlet(由于GenericServlet简单实现了Servlet接口,只需你重写service方法即可—适配器模式)
  • 3 继承javax.servlet.http.HttpServlet(HttpServlet继承了GenericServlet类,不再需要重写service方法。原因是HttpServlet重写了service方法,里面调用了自己重载的service方法,而重载的service方法里又调用了doGet和doPost方法,故在使用HttpServlet时,需要重写doGet和doPost方法,以便让web容器调用我们自己的程序–模板方法设计模式)

servlet映射(<servlet-mapping>)细节:

  • 1 同一个servlet可以有多个servlet-mapping(同一个servlet可以被映射到多个URL上),maping的子元素servlet-name必须是相同的,向外暴露的url-pattern不同。

  • 2 URL(url-pattern)中可以使用通配符。 /**: 浏览器输入/day01/haha 、day01/ha 、
    day01/haha/aha/hahd都符合要求

  • 3 *.xx 注:不加斜线,表示任意扩展名,如day01/ha.do 、day01/haha/ha.dododo符合要求 /xx/ * 以任意字符开头,如day01/action/haha、day01/wahaha/ha都是符合要求的

通配符匹配优先级:绝对匹配–> /开头 匹配 –> 扩展名方式匹配。/是可以匹配任何输入的。除了绝对匹配,/* 优先级始终大于*.do


五 servlet获取配置信息

主要通过ServletConfig对象获取配置信息,该对象有四种方法:

这里写图片描述

通过三种方式获得ServletConfig对象,可调用下面这四种方法获取对象信息。

  • 1> 通过(父)接口servlet的init(ServletConfig)方法,得到该对象。
public class ServletGetInfo extends HttpServlet {

    private ServletConfig config;
    @Override
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        this.config=config;
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.print(config.getInitParameter("encoding"));
    }
}
  • 2>通过使用父类(GenericServlet)的getServletConfig方法,获取ServletConfig对象,然后调用getInitParameter获取配置信息。(不要重写init方法)
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String ec=this.getServletConfig().getInitParameter("encoding");
        System.out.println(ec);
    }
  • 3>使用父类(GenericServlet)的getInitParameter方法.(GenericServlet继承了ServletConfig)。(不要重写init方法,否则Tomcat不会自己创建ServletConfig对象)
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String ec=this.getInitParameter("encoding");
        System.out.println(ec);
    }

六 servletContext

通过ServletConfig可获得ServletContext。

有4个作用:

  • 作为域对象(map集合),在当前应用中使多个servlet共享数据
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext sc=this.getServletContext();
        sc.setAttribute("name", "xiaoqiang");
        //String str=(String)sc.getAttribute("name");
        //System.out.print(str);
    }
  • 获取全局配置信息
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String str=this.getServletContext().getInitParameter("encoding");
        //String str=this.getInitParameter("encoding");
        System.out.println(str);
        String s=(String)this.getServletContext().getAttribute("name");
        System.out.println(s);
    }
  • 获取资源路径
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext sc=this.getServletContext();
        String path=sc.getRealPath("/WEB-INF/a.properties");
        Properties prop=new Properties();
        prop.load(new FileInputStream(path));   //IO操作
        System.out.println(prop.getProperty("key"));
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值