JavaWeb——day33 Servlet 配置响应时机,定义Servlet的三种方式,全局对象,共享数据,获取全路径

今天的知识吸收的还算不错,就是注册码还燃

Servlet

配置响应时机

1.可以配置Servlet 创建的时机 1 -1 是默认值 第一次请求时创建
其他整数0 1 ,是开启服务器的时候创建

 <servlet>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>org.westos.servlet2.ServletDemo1</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>

定义Servlet的三种方式

    * 2.定义Servlet 三种方式
    *   方式1:写一个类 实现 Servlet 重写5个抽象方法
    *   方式2:写一个类 继承 GenericServlet 重写 service()方法
    *   方式3:写一个类 继承HttpSersvlet 重写doGet() 和 doPost()方法 开发常用
方式一

实现 Servlet接口 需要重写5个方法

package rog.westos.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @Description:servlet
 * @Author:@李小白
 * @Date:2019/8/31 15:03
 */
public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException,
            IOException {
        System.out.println("servlet welcome 欢迎请求的到来");
//        //处理请求
//        //响应
//        servletResponse.getWriter().write("<h1 style='colre:red'>this is from server<h1>");

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

 <servlet>
        <!--给servelet起名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--配置servlet全路径-->
        <servlet-class>rog.westos.servlet.MyServlet</servlet-class>
    </servlet>
    <!--配置servlet映射-->
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <!--配置在浏览器里面请求servlet的虚拟路径-->
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
方式二:

继承 GenericServlet 重写一个Servlt方法

package org.westos.servlet2;

import javax.servlet.*;
import java.io.IOException;

/**
 * @Description:TODO
 * @Author:@李小白
 * @Date:2019/9/3 22:22
 */
public class ServletDemo extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        ServletConfig servletConfig = this.getServletConfig();
        String pwd = servletConfig.getInitParameter("pwd");
        ServletConfig servletConfig1 = super.getServletConfig();
        String pwd1 = servletConfig1.getInitParameter("pwd");
        System.out.println(pwd);
        System.out.println(pwd1);

    }
}

  <servlet>
        <servlet-name>MyServlet2</servlet-name>
            <servlet-class>rog.westos.servlet.MyServlet2</servlet-class>
            <!--配置初始化参数-->
            <init-param>
                <param-name>username</param-name>
                <param-value>zhangsan</param-value>
            </init-param>
            <init-param>
                <param-name>password</param-name>
                <param-value>123456</param-value>
            </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet2</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>
方式三

继承 HttpServlet 重写doGet和doPost方法

package org.westos.servlet2;

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;

/**
 * @Description:TODO
 * @Author:@李小白
 * @Date:2019/9/3 22:17
 */
@WebServlet(name = "ServletDemo1")
public class ServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

<servlet>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>org.westos.servlet2.ServletDemo1</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/ser1</url-pattern>
    </servlet-mapping>

全局对象 ServletContext接口

  • 概念:
    由服务器创建,在整个WEB之间的全局域对象,单例

  • JavaWeb中四大域对象:
    * ServletContext:代表整个web应用
    * HttpSession:会话域
    * ServletRequest:请求域
    * PageContext:页面域

怎样获取使用

ServletContext context = this.getServletContext();
String rootpath = context.getRealPath("/");

  1. 存储所有用户共享的数据
    * setAttribute():
    * getAttribute():
    * removeAttribute():
  2. 获取文件运行的真实路径:
    * 真实路径:指服务器路径
    * getRealPath():
    * 1.webRoot下:项目根目录下
    * 2.WEB-INF下: 项目根目录下/WEB-INF
    * 3.src下: 项目根目录下/WEB-INF/classes
    *注意:如果getRealPath("/"),获取的路径是项目的根目录
  3. new FileInputStream
package org.westos.servlet2;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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.FileInputStream;
import java.io.IOException;

/**
 * @Description:TODO
 * @Author:@李小白
 * @Date:2019/9/3 22:17
 */
@WebServlet(name = "ServletDemo1")
public class ServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = this.getServletConfig();
        ServletContext servletContext = servletConfig.getServletContext();
        //或者直接进行getServletContext()
        ServletContext servletContext1 = this.getServletContext();


        //作用1.可以在web内共享数据  2.可以获取真实路径
        //1.可以在web内共享数据
        servletContext1.setAttribute("servlet","123456");//设置对象,以键值的形式
        servletContext1.getAttribute("servlet");//获取对象,由键取值
        servletContext1.removeAttribute("servlet");//移除键值

        //2.可以获取真实路径
        //web 下 有一个 a.txt文件
        // web/WEB-INF 有一个b.txt 文件
        // src 下有一个 c.txt 文件

        //我们要读取这三个不同地方的文件 怎么读?
        //src\c.txt(系统找不到指定的路径。)
        //动态获取路径,先获取服务器的大致路径
        String realPath = servletContext1.getRealPath("/");
        //获取src下的详细路径
        FileInputStream in1 = new FileInputStream(realPath+"/WEB-INT/classes/c.txt");
        //获取web下的详细路径
        FileInputStream in2 = new FileInputStream(realPath + "/classes/b.txt");
        //获取WEB-INF 下的详细路径
        FileInputStream in3 = new FileInputStream(realPath + "a.txt");
        System.out.println(in1);
        System.out.println(in2);
        System.out.println(in3);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

非web环境,如何获取真实路径

ServletContext只能用于web环境。如果是非web环境,则使用ClassLoader来获取真实路径

package org.westos.servlet2;

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.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * @Description:TODO
 * @Author:@李小白
 * @Date:2019/9/3 23:24
 */
@WebServlet(name = "ServletDemo2")
public class ServletDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //方式一
        URL resource = this.getClass().getClassLoader().getResource("a.txt");
        String path = resource.getPath();
        FileInputStream in1 = new FileInputStream(path);
        System.out.println(in1);
       //方式二
        InputStream in2 = this.getClass().getClassLoader().getResourceAsStream("a.txt");
        System.out.println(in2);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值