前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaWeb入门之Servlet基础 1

JavaWeb入门之Servlet基础 1

原创
作者头像
黄桂期
修改2018-05-14 00:02:46
9381
修改2018-05-14 00:02:46
举报
文章被收录于专栏:土豆专栏土豆专栏

写给还是小白的我们,一起加油~

首先来简单介绍一下Servlet,它是和平台无关的服务器端组件,运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应的模式”。

简单来说,就是Servlet可以通过浏览器直接访问Java类。

Servlet可完成以下功能:

  • 创建并返回基于客户请求的动态HTML页面
  • 创建可嵌入到现有HTML页面中的部分HTML页面
  • 与其他服务器资源(如数据库或基于Java的应用程序)进行通信

Servlet容器响应客户请求的过程:

再来讲述一下Servlet的生命周期,以下方法都是由Servlet容器负责调用:

  1. 构造器 只有在第一次请求Servlet的时候,创建Servlet的实例,调用构造器,而且Servlet是单实例的。
  2. init 只被调用一次,在创建好实例后会立即被调用,它用于初始化Servlet
  3. service 被多次调用,每次请求都会调用service方法。实际上是用于响应请求的
  4. destroy 只被调用一次,在当前Servlet 所在的web应用被关闭前调用,它用于释放当前Servlet所占有的资源

Servlet容器响应客户请求的过程:

  1. Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则执行第2步
  2. 装载并创建该Servlet的一个实例对象:调用该Servlet的构造器
  3. 调用Servlet实例对象的init()方法
  4. 创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去
  5. web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法

然后就是在ecplise中的配置了:

代码语言:javascript
复制
web.xml:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0">
    <!-- 配置当前WEB应用的初始化参数 -->
    <context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <context-param>
        <param-name>jdbcUrl</param-name>
        <param-value>jdbc:mysql://qwikki</param-value>
    </context-param>
      <!-- 配置和映射Servlet -->
      <servlet>
          <servlet-name>helloServlet</servlet-name><!--servlet名字-->
          <servlet-class>per.huang.pra.HelloServlet</servlet-class><!--servlet对应的Java代码位置-->
          <!-- 配置Servlet的初始化参数 -->
          <init-param>
              <param-name>user</param-name>
          <!-- 参数值 -->
              <param-value>root</param-value>
          </init-param>
          <load-on-startup>5</load-on-startup><!--servlet执行顺序-->
      </servlet>
      <servlet-mapping>
          <servlet-name>helloServlet</servlet-name><!--servlet名字-->
          <url-pattern>/hello</url-pattern><!--地址栏访问路径-->
      </servlet-mapping>
</web-app>

当servlet配置了初始化参数之后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init()方法时,将ServletConfig对象传递给Servlet。所以我们可以通过Servlet对象得到当前servlet的初始化参数信息。

附上第一个Servlet程序,方法的作用已在注释里说明:

代码语言:javascript
复制
package per.huang.pra;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloServlet implements Servlet{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("destroy");
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        System.out.println("getServletConfig");
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        System.out.println("getServletInfo");
        return null;
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("init");
        //获取Servlet的初始化参数和值
        String user=servletConfig.getInitParameter("user");
        System.out.println("user: "+user);
        //获取ServletContext对象
        ServletContext servletContext=servletConfig.getServletContext();
        String driver=servletContext.getInitParameter("driver");
        System.out.println("driver: "+driver);
        Enumeration<String> names2=servletContext.getInitParameterNames();
        while(names2.hasMoreElements()){
            String name=names2.nextElement();
            System.out.println("--> "+name);
        }
        //获取文件的绝对路径(在服务器上的路径,而不是这个文件的绝对物理路径)
        String realPath=servletContext.getRealPath("/webContent里面的文件名");
        System.out.println(realPath);
        //获取当前WEB应用的名称
        String contextPath=servletContext.getContextPath();
        System.out.println("contextPath:"+contextPath);
        //获取当前WEB应用的某一个文件对应的输入流
        try {
            ClassLoader classLoader=getClass().getClassLoader();
            InputStream is=classLoader.getResourceAsStream("jdbc.properties");
            System.out.println("1."+is);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            InputStream is2=servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
            System.out.println("2."+is2);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("service");
    }
    public HelloServlet(){
        System.out.println("constructor");
    }

}

Servlet还有很多东西需要学习,今天就先讲一部分,未完待续~

借用一句话,没有天生的高手,也没有永远的菜鸟!小白们一起加油~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com