2 javaweb02-servlet详解

文章目录

      • 1 什么是Servlet
        • 1.1 servlet体系结构
        • 1.2 Servlet接口
        • 1.3 Servlet继承关系
        • 1.4 GenericServlet
      • .2 Servlet访问
        • 2.1 web.xml中配置路径映射(讲解doPost和doGet)(了解)
      • 3 Servlet生命周期
        • 3.1 Servlet工作原理
        • 3.2 Servlet工作流程(重点)
        • 3.3 Servlet生命周期
      • 4 实例化:
      • 5、初始化
        • 5.1:配置初始化参数
        • 5.2:获得初始化参数
      • 6、service方法处理请求响应
        • 6.1、HttpServlet中的service方法:
        • 6.2、HttpServletResquest常用方法:
      • 7、转发和重定向区别
      • 8 ServletContext*

回顾:
B/s 浏览器、服务器
c/s 客户端 服务器
tomcat 默认端口号是:8080
conf/server.xmlservlet 浏览器servlet

1 什么是Servlet

和applet相对应,是运行在服务器端的小程序,用来处理客户端的请求并给予响应的java类,继承了HttpServlet类。

1.1 servlet体系结构

2 javaweb02-servlet详解_第1张图片

1.2 Servlet接口

Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http。在javax.servlet包中定义了所有的Servlet类都必须实现或者扩展的通用接口和类。在javax.servlet.http包中定义了采用Http协议通信的HttpServlet类。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口
2 javaweb02-servlet详解_第2张图片

1.3 Servlet继承关系

2 javaweb02-servlet详解_第3张图片

1.4 GenericServlet

编写Servlet需要通过实现Servlet接口来编写Servlet,但是我们每次都必须为Servlet中的所有方法都提供实现,还需要将ServletConfig对象保存到一个类级别的变量中,GenericServlet抽象类就是为了为我们省略一些模板代码,实现了Servlet和ServletConfig

.2 Servlet访问

无法通过类名直接访问Servlet,需要通过映射的路径去访问:url

2.1 web.xml中配置路径映射(讲解doPost和doGet)(了解)

2 javaweb02-servlet详解_第4张图片
load-on-start标签的作用:
1.load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2.它的值必须是一个整数,表示servlet应该被载入的顺序。;
3.当值为0或者大于0时,表示容器在启动时就加载并初始化这个servlet。
4.当值小于0或者没有指定时,则表示容器在该Servlet被请求时,才会去加载。
5.正数的值越小,该Servlet的优先级就越高,应用启动时就优先加载。
6.当值相同的时候,容器就会自己选择优先加载。 所以,x中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。

3 Servlet生命周期

3.1 Servlet工作原理

2 javaweb02-servlet详解_第5张图片
当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器。此时Servlet容器会找到对应的处理该请求的Servlet实例来处理,结果会送回Web服务器,再由Web服务器传回用户端。针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后启动一个线程(从容器线程池中获取一个)。第二次收到http请求时,Servlet容器无须建立相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程方式不但可以提高Web应用程序的执行效率,也可以降低Web服务器的系统负担。
Servlet是单例的。

3.2 Servlet工作流程(重点)

1、Web Client 向Servlet容器(Tomcat)发出Http请求
2、Servlet容器接收Web Client的请求
3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中
4、Servlet容器创建一个HttpResponse对象
5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象
6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息
7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据
8、Servlet容器把HttpServlet的响应结果传给Web Client

3.3 Servlet生命周期

Servlet生命周期,是指Servlet从加载、初始化、处理请求、返回响应、直到销毁的过程。Servlet中跟生命周期相关的方法:

1 init():初始化

2 service(ServletRequest,ServletResponse):服务方法,用来处理各种请求的方法

3 destroy():销毁

2 javaweb02-servlet详解_第6张图片
生命周期过程
1、实例化(创建对象:调用构造方法)(只实例化一次)
2、初始化(数据的赋初值,或者获取配置信息的过程)(只初始化一次)
3、提供服务(doGet,doPost)(多次)
4、销毁(关闭容器时销毁)(一次)

4 实例化:

创建Servlet对象的时机:
1 默认情况下,在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet对象的service方法;
2 Servlet容器启动时:当web.xml文件中如果元素中指定了子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象;
3 Servlet的类文件被更新后,重新创建Servlet。Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在;

@WebServlet(name = "HelloServlet",urlPatterns = {"/hello","/hello2"},loadOnStartup = 1)

销毁Servlet对象的时机:Servlet容器停止或者重新启动:Servlet容器调用Servlet对象的destroy方法来释放资源。

@WebServlet(value = "/hello",loadOnStartup = 2)
public class SecondServlet extends javax.servlet.http.HttpServlet {
       public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
       System.out.println("你好,这是SecondServlet");       
       response.setContentType("text/html;charset=utf-8");       
       PrintWriter out=response.getWriter();       
       out.println("

你好,SecondServlet

"
); }public void init(){ System.out.println("hello.init()..."); }public void destroy(){ System.out.println("hello.destory()..."); } }

5、初始化

Servlet在初始化的时候可以加载初始化参数,初始化参数是预先配置在web.xml 文件中的或者在@WebServlet注解中设定。

5.1:配置初始化参数

将FirstServlet中的@WebServlet注解去掉,在web.xm文件中配置FirstServlet初始化参数
2 javaweb02-servlet详解_第7张图片

5.2:获得初始化参数

init()代码:
2 javaweb02-servlet详解_第8张图片
2 javaweb02-servlet详解_第9张图片

6、service方法处理请求响应

对于每一个HTTP请求,servlet容器会创建一个封装了HTTP请求的ServletRequest实例传递给servlet的service方法,ServletResponse则表示一个Servlet响应,其隐藏了将响应发给浏览器的复杂性。通过ServletRequest的方法你可以获取一些请求相关的参数,而ServletResponse则可以将设置一些返回参数信息,并且设置返回内容。

6.1、HttpServlet中的service方法:

查看service的源代码:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

6.2、HttpServletResquest常用方法:

getParameter(String); //根据名字获取参数的值:表单中的参数,地址栏中的参数
getParameterValues(String)//根据名字获取一组参数的值(复选框)
getParameterMap()//获得一个Map对象,所有的参数值都放在字符串数组中
getAttribute(String);//根据名字获取属性的值
setAttribute(String,Object);//根据属性设置值
getRequestDispatcher(String);//请求转发
setCharactorEncoding()//设置编码方式

HttpServletResponse常用方法:

sendRirect();//重定向:重新请求指定的地址
setContentType()//设置响应的编码方式;
addCookie(); //添加cookie

7、转发和重定向区别

服务器转发:地址栏不会发生改变,在服务器端完成,效率高。携带数据可以在Servlet之间进行传递

//请求转发,服务器转发
request.setAttribute("msg","欢迎你登陆成功");//request存储数据
request.getRequestDispatcher("/welcomeServlet").forward(request,response);

客户端重定向:客户端重新发送新的请求,无法携带数据。地址栏会发生改变。

//客户端重定向
//服务器会向客户端浏览器发送一个响应:url, 客户端会重新请求该URL
request.setAttribute("msg","欢迎你登陆成功");
//request存储数据
response.sendRedirect("/login.html");

转发:
发出了一次请求,地址栏不发生变化。可以携带数据重定向:发出了两次请求,地址栏发生变化,不可以携带数据

8 ServletContext*

ServletContext是代表了Servlet应用程序。每个Web应用程序只有一个context。在分布式环境中,一个应用程序同时部署到多个容器中,并且每台Java虚拟机都有一个ServletContext对象。有了ServletContext对象后,就可以共享能通过应用程序的所有资源访问的信息,促进Web对象的动态注册,共享的信息通过一个内部Map中的对象保存在ServiceContext中来实现

1、获得ServletContext对象ServletConfigServletConfig封装可以通过@WebServlet或者web.xml传给一个Servlet的配置信息,以这种方式传递的每一条信息都称做初始化信息,初始化信息就是一个个K-V键值对。为了从一个Servlet内部获取某个初始参数的值,init方法中调用ServletConfig的getinitParameter方法或getinitParameterNames方法获取,除此之外,还可以通过getServletContext获取ServletContext对象。
2 javaweb02-servlet详解_第10张图片
2 javaweb02-servlet详解_第11张图片
2 javaweb02-servlet详解_第12张图片

你可能感兴趣的:(java后端开发,服务器,tomcat,java)