zoukankan      html  css  js  c++  java
  • servlet(一)

    1. 什么是Servlet?

    sun(oracle)公司制订的一种用来扩展web服务器功能的组件规范。

    (1)用来扩展web服务器功能

    web服务器(比如apache web server,iis,nginx等)只能够处理静态资源的请求, (即需要事先将html文档准备好,并存放到web服务器上),不能够处理动态资源 的请求(即需要通过一些计算,生成相应的html文档)。所以,需要扩展。 可以使用Servlet来扩展。

    (2)组件和容器

    1)什么是组件?

    符合规范,具有部分功能,并且需要部署到相应的容器里面才能运行的软件模块。 Servlet就是一个组件。

    2)什么是容器?

    符合规范,为组件提供运行环境的程序。 Servlet需要部署到Servlet容器里面才能运行,Servlet容器为 Servlet提供相应的运行环境(即网络相关的服务)。

    注:
        Tomcat是一个符合Servlet规范的容器。

    2.如何写一个Servlet?

    step1.写一个java类,实现Servlet接口或者继承HttpServlet。

    step2.编译。

    step3.打包。

    注:按照Servlet规范,创建一个具有如下结构的文件夹
    
    appname (文件夹的名称可以自定义,一般称之为应用名)
        WEB-INF
            classes (放.class文件)
            lib (放.jar文件 该文件夹可选)
            web.xml (部署描述文件)

    step4.部署。

    将step3创建好的文件夹拷贝到容器相应的位置。
    注:
        也可以将step3创建好的文件夹使用jar命令压缩成".war"为后缀的文件,然后再拷贝。

    step5.运行。

    启动容器,访问Servlet。
    打开浏览器,在地址栏输入 http://ip:port/appname/url-pattern。
    
    注:
        url-pattern是一个字符串,在web.xml中设置。

    3.使用eclipse开发Servlet

    step1.集成tomcat

    注:
        即使得eclipse可以管理tomcat(包括启动、关闭tomcat,自动部署等)

    step2.创建maven工程

      

    step3.添加一个java类

    注:
        继承HttpServlet
        override service方法。

    参考代码:

    public class HelloServlet extends HttpServlet{
    
    public HelloServlet() {
        System.out.println("HelloServlet的构造器");
    }
    
    @Override
    /**
     * Servlet容器(比如Tomcat)在收到请求之后,
     * 会解析请求数据包,将解析到的数据存放到request
     * 对象里面,同时,还会创建一个response对象。
     * 接下来,容器会创建Servlet对象,然后调用该
     * 对象的service方法来处理请求。
     * 注:
     *   作为开发人员,不用再处理网络相关的问题。
     * 比如,要读取请求参数,只需要调用request对象
     * 提供的方法即可;如果要向浏览器发送响应,只需要
     * 调用response对象提供的方法。
     */
    protected void service(
            HttpServletRequest request, 
            HttpServletResponse response) 
                    throws ServletException, 
                    IOException {
        System.out.println(
                "HelloServlet的service方法");
    
        /*
         * 设置content-type消息头的值,告诉浏览器,
         * 服务器返回的数据类型。
         * 注:
         *  浏览器会按照指定的数据类型来解析。
         */
        response.setContentType("text/html");
        /*
         * 通过response对象获得一个输出流。
         */
        PrintWriter out = response.getWriter();
        /*
         * 将数据写到response对象上。
         * 注:
         *  容器会从response对象上提取数据,生成
         * 响应数据包并发送给浏览器。
         */
        out.println("Hello Kitty");
        out.close();
        }
    }

    step4.在web.xml文件中,添加Servlet配置信息。

    参考配置:

     <servlet>
        <servlet-name>helloServlet</servlet-name>
        <!-- 
            类名一定要写完整(注意大小写)
            注:
                容器会使用java反射完成类的加载,
                如果类名写错,则容器会找不到该类的字节码文件。
         -->
        <servlet-class>web.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <!-- 
            url-pattern用来定义访问路径,即
            如何调用该servlet
            (http://ip:port/appname/url-pattern)。
    
            比如:
                http://localhost:8080/day01-lab/hello
         -->
        <url-pattern>/hello</url-pattern>
        </servlet-mapping>

    4.Servlet是如何运行的?

    比如,在浏览器地址栏输入http://ip:port/appname/hello

    step1.浏览器依据ip、port建立与Servlet容器之间的连接。

    step2.浏览器创建请求数据包并发送给容器。

    step3.容器解析请求数据包中的数据,然后将解析到的数据添加到 request对象里面,同时,容器还会创建一个response对象。

    step4.容器依据请求路径,创建对应的Servlet对象,然后调用该对象的 service方法。

    注:
        容器会将request对象和response对象作为参数传递过来。
    开发人员可以通过调用request对象提供的方法来获得请求数据包中
    的数据(比如请求参数),然后将处理结果写到response对象即可。

    step5.容器通过response对象获得处理结果,然后创建响应数据包并发送给浏览器。

    step6.浏览器解析响应数据包中的数据,生成相应的页面。

    5.常见问题

    (1)404

    含义:404是一个状态码,表示服务器依据请求路径找不到对应的资源。

    原因:

    a.请求路径写错。没有严格按照http://ip:port/appname/url-pattern
    来写。
    b.没有部署或者部署失败。

    (2)500

    含义:500也是一个状态码,表示服务器端程序运行出错。

    原因:

    a.没有严格按照Servlet规范来写代码和配置。
    比如,没有继承HttpServlet。
    又比如,<server-class>类名写错。
    
    b.代码不严谨。
    比如,对请求参数值没有做检查就做类型转换。

    (3)405

    含义:405也是一个状态码,表示服务器找不到处理方法。 原因:

    service方法没有正确override。
  • 相关阅读:
    论工作动力的来源是什么?答案是来自于实现自己的梦想
    向梦想者致敬
    内置函数,递归函数,模块与包,开发目录规范
    迭代器,生成器
    闭包函数,装饰器,语法糖
    函数对象,名称空间及查找,作用域
    函数调用与参数
    字符编码
    文件处理
    python 11.5数据类型及常用方法
  • 原文地址:https://www.cnblogs.com/dxllp/p/10725759.html
Copyright © 2011-2022 走看看