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。
原文地址:https://www.cnblogs.com/dxllp/p/10725759.html