资讯专栏INFORMATION COLUMN

Servlet

happen / 2179人阅读

摘要:一个应用程序中可以有很多,这些都共享同一个对象,我们经常将对象叫域对象。常用的的获取对象的向对象绑定数据的从对象取出数据的获取当前应用的初始化参数的获取资源文件,返回流的获取资源文件,返回路径

第一个Servlet开发步骤
 01_创建一个普通Java类,实现Servlet接口
 02_将写好的Servlet类,还得配置到web.xml文件中去
Demo01.java
编写一个简单的Servlet程序输出英文字符串到浏览器【实现Servlet接口】
    public class Demo01 implements Servlet{
    @Override
    public void destroy() {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        OutputStream os = servletResponse.getOutputStream();
        os.write("

Hello Servlet

".getBytes()); os.flush(); os.close(); } }
web.xml


    
        Demo01
    cn.itheima.servlet.Demo01
    
    
        Demo01
        /xxx
    

为什么建议创建Servlet直接继承HttpServlet类呢
 创建Servlet有三种方式,前二种创建的Servlet能处理任意协议的请求,
 但我们做Web开发,大多都是处理Http协议,所有建议直接继承HttpServlet类
 再者,HttpServlet类,也继承与实现了前二种方式的类或接口,且有适合于HTTP协议特点的方法
方式一:编写一个简单的Servlet程序输出英文字符串到浏览器【实现Servlet接口】

编写一个简单的Servlet程序输出英文字符串到浏览器【实现Servlet接口】

public class Demo01 implements Servlet{
    @Override
    public void destroy() {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        OutputStream os = servletResponse.getOutputStream();
        os.write("

Hello Servlet

".getBytes()); os.flush(); os.close(); } } Demo01 cn.itheima.servlet.Demo01 Demo01 /Demo01
方式二:编写一个简单的Servlet程序输出中文字符串到浏览器【继承GenericServlet类】

编写一个简单的Servlet程序输出中文字符串到浏览器【继承GenericServlet类】

public class Demo02 extends GenericServlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletResponse.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = servletResponse.getWriter();
        pw.write("

你好,Servlet,我们今天见面了

"); pw.flush(); pw.close(); } } Demo02 cn.itheima.servlet.Demo02 Demo02 /Demo02
编写一个简单的Servlet程序输出当前时间到浏览器【继承HttpServlet类】

编写一个简单的Servlet程序输出当前时间到浏览器【继承HttpServlet类】

public class Demo03 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        pw.write("

现在时间为:" + new Date().toLocaleString()+"

"); pw.flush(); pw.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } } Demo03 cn.itheima.servlet.Demo03 Demo03 /Demo03 如果在浏览器地址栏输入URL后回车,这种方式属于GET请求
什么是Servlet生命周期
 Servlet是运行于Web服务器中的Servlet引擎/容器中,客户端是不能直接调用Servlet的,必须由Servlet引擎/容器才能调用。因此Servlet在引擎/容器中从创建到销毁的全过程,称之为Servlet生命周期
Servlet生命周期分为四个过程,分别是:
     01——构造器(执行一次)
     02——初始化(执行一次)-----------------------------在默认情况下,首次访问该Servlet时执行
     03——doGet/doPost/service(执行多次)----------------------非首次访问该Servlet时执行
     04——销毁(执行一次)
     Servlet是单例的,被多个客户端线程共享,建议不要用实例变量
Servlet运行过程图解 ServletConfig对象有什么作用
当Servlet配置了初始化参数后,Servlet引擎/容器在创建Servlet对象时,
会自动将这些初始化参数封装到ServletConfig对象中,并在调用Servlet的
init(ServletContext)方法时,将ServletConfig对象传递给Servlet。
从而程序员可以通过ServletConfig对象就可以得到当前Servlet的初始化参数信息
常用的API

ServletContext的getInitParameterNames():获取当前Servlet的所有初始化参数
ServletContext的getInitParameter():获取当前Servlet的一个初始化参数 Demo04.java

public class Demo04 extends HttpServlet {
    private ServletConfig config;
    public Demo04() {
    }
    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        /*
        //获取web.xml文件中的servlet初始化参数
        Enumeration enums = config.getInitParameterNames();
        while(enums.hasMoreElements()){
            String key = enums.nextElement();
            String value = config.getInitParameter(key);
            //在控制台显示
            System.out.println(key+"-"+value);
        }
        */
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter pw = response.getWriter();
    Enumeration enums = config.getInitParameterNames();
        while(enums.hasMoreElements()){
            String key = enums.nextElement();
            String value = config.getInitParameter(key);
            //在浏览器中显示
            pw.write(key+"--"+value+"
"); } pw.flush(); pw.close(); } @Override public void destroy() { } }
Servlet创建时间
    在默认情况下,Servlet是客户端首次访问时,Servlet引擎/容器才创建并对其初始化,
有时我们希望Servlet创建与初始化的时间能够提前到Web服务器启动时,这样客户
端首次访问时,就不用创建与初始化Servlet了,提高了访问速度,我们可以用自动
加载Servlet来完成任务
    配置的数值越小,越先创建与初始化,只限于0,1,2,3等等,负数与没有配置效果一样
如果配置负数,必须用户首次访问时才创建与初始化该Servlet
    web.xml

    Demo04
     cn.itheima.servlet.Demo04
    1


    Demo04
    /Demo04

什么是Servlet虚拟路径
      一个在web.xml文件中,可供外界能访问Web服务器中Servlet的字符串
即/xxx这个就是Servlet虚拟路径
   为什么要配置Servlet虚拟路径
      Servlet位于Servlet引擎/容器中,Servlet引擎/容器又位于Web服务器中,
客户端是不可能知道Servlet的名字的,但Servlet毕竟要处理客户端提交的请求,
就必须让客户端访问,那么要访问Servlet,就必须给客户端一个有效的访问路径,
又不能暴露Servlet真实保存在服务器中的位置,于是就只能配置Servlet虚拟路径
    如何配置Servlet虚拟路径
      Servlet虚拟路径的配置是在web.xml文件中,一个Servlet可以配置在一个或多个虚拟路径上,
也可以使用*.xx或者是/xx通配符形式来配置Servlet路径通配符
      不能出现/*.do的情况,只能分成二个url-pattern来书写
      当一个真正的index.html与一个虚拟路径为index.html同时存在时,
以虚拟路径为主

web.xml

    Demo05 cn.itheima.servlet.Demo05
    1


    Demo05
    /Demo05
    /xx
    /yy
    /index.html
    /*
    *.do

什么是缺省Servlet
  如果某个Servlet的映射的虚拟路径为一个正斜杠(/),那么这个Servlet就成为 当前Web应用程序的默认Servlet

默认Servlet有什么作用 ----专用于处理其它正常Servlet不处理的客户端请求 Servlet读取硬盘中的图片
Tomcat中就有默认Servlet

 在Tomcat/conf/web.xml文件中,注册了一个名称为DefaultServlet的Servlet, 并将这个Servlet设置

为了缺省Servlet,像404,500,等页面,就是由这个DefaultServlet
来响应给客户端的,当程序员有一个缺省Servlet时,Tomcat又有一个缺省Servlet时, 以程序员为主。
项目中,我们以Tomcat中的缺省Servlet为主,即程序员不用写缺省Servlet

 Demo06.java
public class Demo06 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //输入流指向图片
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("../../images/girl1.jpg");
        //输出流指向浏览器
        OutputStream os = response.getOutputStream();
        //读取图片并输出到浏览器
        byte[] buf = new byte[2048];
        int len = 0;
        while((len=is.read(buf))>0){
            os.write(buf,0,len);
        }
        //关闭流
        os.close();
        is.close();
    }
}

    Demo06
    cn.itheima.servlet.Demo06


    Demo06
    /

关于路径问题:
/webapps
        /day11
             /images/girl_1.jpg
                  /WEB-INF/classes/Demo06.class
                                /lib
                                /web.xml       
 
 
ServletContext对象 ServletContext对象有什么作用

Tomcat启动时,会为每个部署在Tomcat中的Web应用程序都创建一个对应的ServletContext对象,
它代表当前Web应用。即一个Web应用程序对应着一个ServletContext对象。
一个Web应用程序中可以有很多Servlet,这些Servlet都共享同一个ServletContext对象,我们经常
将ServletContext对象叫域对象。

常用的API
 ServletConfig的getServletContext():获取ServletContext对象
    ServletContext的setAttribute():向ServletContext对象绑定数据
    ServletContext的getAttribute():从ServletContext对象取出数据
    ServletContext的getInitParameter():获取当前Web应用的初始化参数
    ServletContext的getResourceAsStream():获取资源文件,返回流
    ServletContext的getRealPath():获取资源文件,返回路径
    
Demo07.java
public class Demo07 extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
         System.out.println("Demo07::doGet()");
 
         //InputStream is = this.getServletContext().getResourceAsStream("/images/girl_2.png");
         String filePath = this.getServletContext().getRealPath("/images/girl_3.png");
         System.out.println(filePath);
         InputStream is = new FileInputStream(filePath);
         OutputStream os = response.getOutputStream();
         byte[] buf = new byte[1024*2];
         int len = 0;
         while((len=is.read(buf))>0){
              os.write(buf,0,len);
         }
         os.close();
         is.close();
     }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70007.html

相关文章

  • 浅谈Servlet

    摘要:信息录入输入内容提交同样,我们也需要在下添加一条路由映射规则这样我们在中输入信息后就会跳转到,这样就可以通过对象获取到变量的值。 Servlet(服务端小程序)是使用Java语言编写的服务端小程序,可以用于生成动态的Web页面。 Servlet处理的基本流程 showImg(/img/bVk1Jd); 客户端通过HTTP提出请求。 Web服务器接受该请求并将其发送给Servle...

    wayneli 评论0 收藏0
  • servlet详解

    摘要:初始化的错误处理在初始化期间,实例可能通过抛出或者异常表明它不能进行有效服务。每一个请求由类型的对象代表,而使用回应该请求。在请求的情况下,容器必须提供代表请求和回应的和的具体实现。表明不能对请求进行处理,可能是暂时的,也可能是永久的。 servlet详解 Servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.Serv...

    elva 评论0 收藏0
  • servlet容器

    摘要:,容器的作用是负责处理客户请求,当客户请求来到时,容器获取请求,然后调用某个,并把的执行结果返回给客户。将请求发送给服务器端是的容器。将该请求转换成一个消息,并将其放入一个队列。继承自类,其在中扮演的角色是中心控制器。 容器就是你的程序运行时需要的环境 1,Tomcat是Servlet的运行环境,即一个Servlet容器。 2,Servlet容器的作用是负责处理客户请求,当客户请求来到...

    dcr309duan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<