servlet初识之创建servlet与tomcat配置

时间:2021-07-31 13:00:15

Servlet初识

简介

Servlet 小服务程序
是个java类 是个接口
注意:在浏览器*问的每一个网页都是一个servlet
每个servlet都需要配置一个网址 在web.xml中配置

apache-tomcat-9.0.0.M26

需要先下载apache-tomcat-9.0.0.M26压缩包,然后解压,解压后的文件如下图所示
tomcat文件夹下:
bin: 可执行的文件(打开关闭服务器的文件)
conf: 服务器的配置信息(文件夹)
lib: 服务器使用的jar包
logs: 服务器日志
temp: 产生临时文件
work: 服务器自己的工作空间
webapps: 默认的存放工程(应用程序)文件夹
wtpwebapps: 跟Eclipse关联后产生的存放工程的文件夹

servlet初识之创建servlet与tomcat配置

控制台启动Tomcat

从控制台启动Tomcat服务器命令
1.先去Tomcat服务器下面的bin文件夹
  cd 文件夹路径
2.获取文件夹权限(读写)
  sudo chmod 755 *.sh
  输入密码
3.执行打开服务器
  sudo sh ./startup.sh
4.访问服务器网址
  url:全球统一资源定位符
  http://localhost:8080
  协议://本地地址:端口号/项目名(应用程序名)/访问的资源
  http://localhost:8080/sh-web-servlet01/1.html
5.执行关闭服务器
  sudo sh ./shutdown.sh
注意清空Log文件中的日志

servlet初识之创建servlet与tomcat配置
servlet初识之创建servlet与tomcat配置
servlet初识之创建servlet与tomcat配置

从浏览器访问到Servlet类

1.用户用网址访问服务器(tomcat)
2.服务器通过网址找到对应项目的web.xml文件
3.通过网址找到对应的servletname
4.通过servletname找到对应的servlet类
5.创建servlet对象
6.执行声明周期的几个方法
  实例化-->初始化-->service服务-->销毁

  实例化方法(无参构造方法)
  public Demo01(){
      System.out.println("我是实例化方法");
  }

  初始化方法
  @Override
  public void init(ServletConfig arg0) throws ServletException {
      // TODO Auto-generated method stub
      System.out.println("初始化方法init");
  }

  service服务
  servlet只创建了一个 多次访问 实际上就是 多次调用服务的方法
  @Override
  public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
      System.out.println("我是服务方法的service");
  }

  销毁方法
  1.删除该应用程序调用
  2.停止服务器
  @Override
  public void destroy() {
      System.out.println("我是销毁方法destroy");
  }

创建servlet方式一

使用implements关键字 实现Servlet接口,同时需要实现里面的抽象方法

public class Demo01 implements Servlet{
    public Demo01() {
        System.out.println("我是实例化方法");
    }   
    @Override
    public void init(ServletConfig arg0) throws ServletException{
        System.out.println("初始化方法init");
    }
    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("我是服务方法的service");
    }   
    @Override
    public void destroy() {
        System.out.println("我是销毁方法destroy");
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public String getServletInfo() {
        return null;
    }   
}

创建servlet方式二

适配器模式创建:使用哪个方法就重写哪个方法 用不上的方法可以不重写
使用extends关键字 继承 GenericServlet类,打开GenericServlet类,看里面的介绍
发现GenericServlet类实现了Servlet类,代码为:
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable{}
可见Servlet类是基础类,GenericServlet通过实现Servlet类,再让我们继承它这个类
可以方便我们写代码

public class Demo02 extends GenericServlet{
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("我是demo02");
    }
}

创建servlet方式三(常用的方式,必会的)

使用extends关键字,继承HttpServlet类,打开HttpServlet类,看里面的介绍发现HttpServlet继承
了GenericServlet类,代码为:
public abstract class HttpServlet extends GenericServlet{}
可见HttpServlet继承了GenericServlet类,而GenericServlet类又继承了Servlet接口,底层的
两个类都
实现了Servlet接口中的方法,我们可以用通过实现Servlet接口来创建Servlet,也可以通过继承GenericServlet和HttpServlet类
来创建servlet

public class Demo03 extends HttpServlet{}

获取servlet中的配置信息

1.声明一个ServletConfig当做成员变量
2.重写初始化方法init
  通过该方法的参数 获取ServletConfig对象
  ServletConfig对象中保存的是servlet中的配置信息
3.重写doGet方法和doPost方法接收Get请求和Post请求

注意:重写doGet和doPost方法时,里面会有方法super.doGet(),super.doPost()
HttpServlet中的两个方法:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
{
    String protocol = req.getProtocol();
    String msg = lStrings.getString("http.method_get_not_supported");
    if (protocol.endsWith("1.1")) {
        resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
    } else {
        resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
    }
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
{
    String protocol = req.getProtocol();
    String msg = lStrings.getString("http.method_post_not_supported");
    if (protocol.endsWith("1.1")) {
        resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
    } else {
        resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
    }
}

不管子类中怎么调用这两个方法,都会报错
要么报SC_METHOD_NOT_ALLOWED(404) 要么报SC_BAD_REQUEST(405)
重写完这两个方法后,注意不要调用父类的doGet方法:super.doGet(rep,resp)
servletConfig获取方式一
public class Demo03 extends HttpServlet{
    private ServletConfig config;
    @Override
    public void init(ServletConfig config) throws ServletException {    
        this.config = config;
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        传入参数 配置时的 name(相当于key)
        用key获取对应的value
        String value = this.config.getInitParameter("encoding");
        System.out.println(value);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}
servletConfig获取方式二
通过父类中的方法获取配置信息(获取ServletRequest对象)
public class Demo04 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String config = this.getServletConfig().getInitParameter("encoding");
        System.out.println(config);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

域对象

在一定范围内 存储信息的对象
ServletContext范围 是整个程序中 都可以访问到 并且都只有一个 单例对象
每个Servlet都可以访问到这个域对象
获取ServletContext对象
  方式1:从ServletConfit对象中获取
  方式2:从父类中直接获取
注意:所有的域对象 都有设置/获取/删除的方法
设置域对象属性
public class Demo05 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从ServletConfig对象中获取
        ServletContext application = this.getServletConfig().getServletContext();
        // 添加一个数据到context域中
        // 相当于添加一个键值对 key和value
        application.setAttribute("username", "wanglong");
    }
}
获取域对象属性
public class Demo06 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取域对象
        Object attribute = this.getServletContext().getAttribute("username");
        System.out.println(attribute);
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 下面是xml文件头文件 限制了该xml文件所能书写的内容 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <!-- 工程名字 -->
  <display-name>sh-web-servlet01</display-name>
  <!-- 设置欢迎页面 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <!-- 创建一个servlet -->
  <servlet>
  <!-- 设置servlet的名字 -->
  <servlet-name>demo01</servlet-name>
  <!-- 设置该servlet使用哪个类 全限定类名 -->
  <servlet-class>com.lanou3g.Demo01</servlet-class>
  </servlet>
  <!-- 给该servlet配置一个访问地址(映射地址) -->
  <servlet-mapping>
  <!-- 配置哪个servlet的映射地址-->
    <servlet-name>demo01</servlet-name>
   <!-- 配置映射地址 注意:这里的斜杠代表工程名后面斜杠-->
    <url-pattern>/demo01</url-pattern>
  </servlet-mapping>

  <servlet>
  <servlet-name>demo02</servlet-name>
  <servlet-class>com.lanou3g.Demo02</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo02</servlet-name>
  <!-- 配置访问路径通配 *.action只要是以.action结尾的访问路径 都可以访问到demo02这个servlet /*项目目录下 随便输入网址 都能访问到 demo02 注意:上面两种方式不能连用-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <servlet>
  <servlet-name>demo03</servlet-name>
  <servlet-class>com.lanou3g.Demo03</servlet-class>
    <!-- 添加servlet的配置信息-->
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>demo03</servlet-name>
      <url-pattern>/demo03</url-pattern>
  </servlet-mapping>
 </web-app>

总结

获取servletConfig对象的方式有两种,获取属性值的方式为getinitparameter("属性名")
获取servletContext域对象 可以通过 this.getServletConfig.getServletContext()获取,再通过.getInitParameter("属性名")
来获取web-xml中配置的属性的值
也可以直接通过this.getServletContext()来获取servletContext()域对象,再通过.getInitParameter("属性名")来获取属性值
在获取ServletContext对象之后,如果使用context.getAttribute("属性名")来获取web-xml中设置的属性值,会得到空值null,
要想使用getAttribute方法得到的不是空值,必须先使用setAttribute("属性名","属性值")来设置属性,然后才可以使用getAttribute方法
setAttribute("属性名","属性值")方法与getAttribute("属性名")方法一般成对使用,不要随意的使用getAttribute()方法
用this.getservletconfig().getInitParameter("属性名")获取属性值,如果属性名位context-param中的内容,获取的值为null