第四章

Servlet概述

  1. 定义:Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序,其主要功能在于交互式浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
  2. Servlet是JavaWeb的核心程序,是JavaWeb三大组件之一。
  3. 在HTTP请求过程中会把请求的参数存放在请求行的ULR中,或者是请求体中,这个参数需要服务器来接受解析并处理,Servlet就是用来处理这个过程的
  4. Servlet的作用:
  • 用来处理客户端发送过来的请求,并对该请求做出响应。
  1. 获取接收客户端发送来的请求数据
  2. 处理请求
  3. 将处理的结果通过响应发送到客户端。

     5.Servlet的版本:

  • 异步处理支持:有了该特性,Servlet线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet线程。在接收到请求之后,Servlet线程可以将耗时的操作委派给另一个线程完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
  • 新增的注解支持:该版本新增了若干注解,用于简化Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得web.xml部署描述文件从该版本开始不再是必选的了
  • 可查性支持:熟悉 Struts2 的开发者一定会对其通过插件的方式与包括Spring在内的各种常用框架的整合特性记忆犹新。将相应的插件封装JAR包并放在类路径下,Struts2运行时便能自动加载这些插件。现在Servlet3.0提供了类似的特性,开发者可以通过插件的方式很方便的扩充了已有的Web应用的功能,而不需要修改原有的应用

编写第一个Servlet

  1. 通常是继承javax.servlet.http.HttpServlet
  2. 复写doGET(),doPost()方法
  3. 配置web.xml文件:

<servlet>

   <servlet-name>HelloServlet</servlet-name>

   <servlet-class>net.zixue.servlet.HelloServlet</servler-class>

<servlet>

<servlet-mapping>

<servlet-name>HelloServlet</servlet-name>

<url-pattern>/helloServlet<url-pattern>

<servlet-mapping>

其中<servlet>用来注册Servlet的

内部的<servlet-name>是servlet的名称,在当前配置文件中必须唯一

内部的 <servlet-class>是servlet实现类的类名,类名要包含包名

IDEA在Servlet3.0版本下创建Servlet

  1. 创建项目的时候javaEE版本选择6.0以上
  2. 在IDEA的代码目录下直接右键new,选择Servlet
  3. 配置@WebServlet(urlPatterns="/TestServlet"),注解内的访问路径等同于web.xml下的url-parrtener

HttpServletRequest请求对象

    1. HttpServletRequest简介: 在Servlet的API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用于封装HTTP请求,由于HTTP请求包含着请求行,请求头和请求体三部分,因此在HttpServletRequest中分别定义了接收请求行,请求头和请求体的相关方法

     2.获取请求行相关信息和相关方法

        1.getMethod()方法,返回请求方法,请求方法通常是GET或者POST,但也有可能HEAD,PUT或者DELETE

        2.getRequest()方法,返回URI(URI是URL的从主机和端口之后到表单数据之前的那一部分)

        3.getRemoteAddr()方法,该方法用于获取请求客户端的IP地址

        4.getRemoteport()方法,该方法用于获取请求客户端的端口号

        5.getLocalAddr()方法,该方法用于获取服务器当前接收请求的IP地址

        6.getContextPath()方法,该方法用于获取URL中属于web应用程序的路径

        7.getProtocol()方法,该方法用于获取请求行中的协议名和版本

    3. 获取请求头的相关方法

        1.getHeader(String name), 该方法用于获取一个指定头字段的值,如果请求头中不包含该字段则返回null,如果包含多个字段的值则获取第一个值

        2.getIntHeader(String name), 该方法用于获取指定头字段的值,并且将其值转为int类型,如果不存在该字段则返回-1,如果获取到的值不能转换为int,则会发生NumberFormatException异常

        3.getDateHeaders(String name), 该方法用于获取指定头字段的值,并将其按照GMT时间格式转换成一个代表日期/时间的长整数

        4.getHeaderNames(), 该方法用于获取所有包含请求头字段的Enumeration

4.HttpServletRequest获取请求参数

     获取请求参数: 1.getParameter(String name), 用于获取某个指定名称的参数值,如果请求中没有包含指定名称的参数,则返回null,如果有指定参数但是没有给设置值,则返回空串"",如果包含多个该参数的值则返回第一个出现的参数值

        2.getParameterNames(), 该方法用于返回一个包含请求消息中所有参数名的Enemernation

        3.getParaneterMap(), 该方法用于将请求中所有参数和值装入一个map对象然后返回

HttpServletResponse响应对象

    发送响应行:

1.setStatus(int status): 当Servlet向客户端回送响应消息时,需要设置一个状态码,该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中状态的描述直接和状态码相关,而HTTP协议版本有服务器决定,因此只需要设置该方法,就可以发送一个响应行,正常情况下,web服务器会默认发送一个200的状态码

        2.sendError(int code): 该方法用于发送表示错误信息的状态码,例如404找不到访问的资源,它还有一种重载的形式sendError(int code,String errorMessage),errorMessage可以以文本形式显示在客户端浏览器

     发送响应头:

      1. addHeader (String name, String value):该方法用来設置HTTP协议的响应头字段,其中name是响应头字段名, value是响应头字段的值

        2.setHeader (String name, String value): 该方法和addHeader相同,唯一的区別是addHeader可以重复添加一个同名的响应头字段,setHeader会覆盖之前添加的同名的响应头

        3.addIntHeader(String name, int value), set IntHeader (String name, int value) : 这两个方法用于将value值为int的字段加入到响应头中

        4.setContentLength(): 该方法用于设置HTTP响应消息的内容大小,単位是字节

        5.setContentType(): 该方法用于没置Servlet输出内容的类型,也就是HTTP中的Content-Type响应头。例如发送到客户端的内容是jpeg格式的图像数据,就需响应头字段的类型设置为"image/jpeg" ,另外.如果相应的内容是文本,那这个吋候setContentType还可以设置字符编码,例如setContentType还可以设置字符编码,例如text/html:charset=UTF-8

        6.setCharacterEncoding(String charset)

HttpServletResponse-发送请求体

     背景知识: 由于在HTTP响应消息中,大量的数据都是通过响应体传递的,因此ServletRespone遵循以IO流传递大数据的设置理念,定义了两个与输出流相关的方法,具体如下:

        1.getOutputStream()方法: 该方法获取的字节流输出对象为ServletOutputStream类型,它是OutputStream的子类,因此可以直接输出字节数组中的二进制数据

        2.getWrite()方法: 该方法获得的字符输出流对象是PrintWrite类型,由于它可以直接输出文本类型,因此要输出网页文档,需要使用这个方法

4.8验证码切换

     案例: 实现网站登陆中验证码的切换功能

        背景知识: 用户在注册或者登录过程中经常会遇到必须输入验证码的情况,那这个验证码主要是为了防止恶意程序访问服务器而设置的

        实现原理: 浏览器显示文档和图片,是由服务器回送给浏览器的响应完成的,而一个响应要封装成一个HttpServletResponse对象,所以我们只要将验证码的图片封装到HttpServletResponse对象返回给浏览器即可

Servlet的生命周期

定义:     生命周期: 就是一个对象从创建到销毁的过程

              Servlet的生命周期: Servlet从创建到销毁的过程

     Servlet接口以及相关方法

1.Servlet接口: javax,servlet.Servlet接口  int(ServletConfig)方法,初始化方法 servlet(ServletRequest,ServletResponse)方法,每次访问都会调用来处理请求  destory()方法,销毁servlet方法

 2.HttpServlet接口: javax.servlet.http  继承自Servlet接口,并重新实现了service方法,根据不同请求方式调用不同的处理方法   service(HttpServletRequest,HttpServletResponse)方法,获取请求方式,分别调用doGet(),或者doPost()方法

    Servlet生命周期整个过程描述

当服务器关闭或者项目被移除服务器,destory方法会执行,生命周期结束

     Servlet接口下的service方法并不会调用doGet或者doPost处理请求而HttpServlet下的service方法会调用doGet或者doPost方法处理请求

     注意: Servlet势实例是单例的,即无论请求多少次Servlet,最多只有一个Servlet实例,如果是多个客户端并发,同时访问Servlet的时候,服务器会启动多个线程分别执行Servlet的service方法

     原因: 如果我们每次访问都创建一个Servlet实例,会占用和浪费过多的计算机资源

ServletConfig对象

     定义: ServletConfig对象是它所对应的Servlet对象的相关配置信息

     特点: 每一个servlet对象都有一个ServletConfig对象和它相对应

             ServletConfig对象在多个Servlet对象之间是不能共享的

     作用:常见的ServletConfig对象的方法: 1.getInitParameter(String name) 返回一个初始化变量的值

                                                        2.getInitParameterName() 返回servlet初始化参数的所有名称

                                                        3.getServletContext() 获取ServletContext对象

                                                        4.getServletName() 获取Servlet的name配置值

ServletContext对象

     ServletContext定义: 即Servlet上下文对象,该对象表示当前web应用环境信息

     获取ServletContext对象: 1.通过ServletConfig的getServletCintext()方法可以得到ServletContext对象

                                            2.HttpServlet中直接通过this.getServletContext()获取

     域对象: (域对象就是在不同资源之前来共享数据,保存数据,获取数据)ServletContext对象通常称为Context域对象。

      应用:使用ServletContext获取整个Web项目初始化参数

        在web.xml中配置初始化参数:<context-param>

                                                        <param-name>参数名</param-name>

                                                             <param-value>参数值</param-value>

                                                     </context-param>

        String getInitParameter (String name); 根据名称获取初始化参数

        Enumeration getInitparameterNames(); 获取随意初始化参数名称

     使用ServletContext在多个Servlet中共享数据

        void setAttribute(String name,Object object); 存放数据

        Object getAttribute(String name); 获取数据

        void removeAttribute(String name); 删除数据

Servlet之间的跳转

 Servlet之间可以实现跳转,从一个Servlet跳转到另一个Servlet,利用Servlet的跳转技术可以很方便的把一块业务模块分开,比如使用一个Servlet接收用户提交数据,使用另一个Servlet读取数据库,最后跳转到另一个Servlet把处理结果展示出来,这也就是MVC模式。

     MVC: 用一种业务逻辑,数据,界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入,处理和输出功能在一个逻辑的图形化用户界面的结构中。

     转发Forward简介: 在Servlet中如果当前的web资源不想处理请求时,可以通过forward方法将当前请求传递给其他Web资源处理,这种方式称为请求转发。

登录错误时显示错误界面

     请求转发的相关方法: RequestDispatcher对象,可以通过request.getRequestDispatcher()方法获取调用这个对象的forward方法就可以实现请求转发

     转发过程中携带数据: request本身也是一个域对象,request可以携带数据传递给其他web资源

                                     setAttribute方法

                                     getAttribute方法

                                     removeAttribute方法

                                     getAttributeName方法

                                     通过request对象的setAttribute方法

重定向介绍

   1.简介: 重定向是根据服务器返回等我状态码来实现的。客户端浏览器在请求服务器大的时候,服务端会返回一个状态码。服务器通过HttpServletResponse的setStatus(int status)方法来设置状态。如果服务器这个时候返回状态码是301或者是302,则浏览器就会到新的网址重新请求该资源。服务器的响应中会带着这个新资源的地址

     2.请求重定向相关代码:  //设置状态码为302,SC_MOVED_TEMPORAILY就是302的静态常量

                                      response.setStatus(HttpServletResponse.SC_MOVED_TOMPORAILY);

                                      //在请求头中携带新的资源地址

                                      response.setHeader("Location","http://www.baidu.com");

     为了方便HttpServletResponse中将setStstus和setHeader这两种方法合并到一起叫做sendRedirect(String location);

请求转发和重定向的区别

     1.重定向的地址栏会发生变化,转发不会

     2.重定向是两次请求两次响应,转发是一次请求一次响应

     3.重定向路径需要加工程名,转发路径不需要加工程名

    4. 重定向可以跳转到任何网站,转发只能在服务器内部进行

Servlet线程安全

     定义:当多个客户端并发访问一个Servlet的时候,web服务器会为每一个客户端的访问创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内部如果访问了同一个资源的话,就可能引发线程安全问题

     如何解决Servlet线程安全

        1.同步代码块 2.实现SingleThreadModle接口3.尽量不要在Servlet实例内使用共享变量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值