Sevlet知识

servlet具体的运行过程

浏览器输入地址,与Tomcat建立连接,发送请求,Tomcat中的HTTPRequest解析请求(解析请求行(包括请求方式,请求路径,协议版本),消息头,消息正文,根据路径url部分找到web.xml,反射机制解析servlet请求业务,请求方式有get和post请求,get方式能在消息头解析到,post需要在消息正文中解析),创建servlet业务,通过service()方法,再通过request对象获取数据,写入数据到response对象中(HTTPResponse中响应状态行,响应头,响应正文,状态行设置状态代码,响应头同Httpcontext中的SAXreader解析对应介质类型映射,发送响应正文),发送响应给浏览器,浏览器解析响应数据包,显示页面.

servlet

1.servlet:sun公司制定的一种用来扩展web服务器功能的组件规范
web服务器只能处理静态资源的请求,即需要事先将html文档准备好,并存到web服务器上,不能处理动态资源的请求,需要servlet扩展.

2.组件和容器
组件:符合规范,具有部分功能,且需要部署到相应的容器里面才能运行的软件模块,servlet就是一个组件
容器:符合规范,为组件提供运行环境的程序.
servlet容器为servlet提供了相应的运行环境(即网络相关的服务),Tomcat是一个符合servlet规范的容器

3.http协议:一种网络应用层协议规定浏览器如何与web服务器之间进行通信及响应的数据包的结构
TCP/IP:传输层和网络层协议,将数据包可靠地传递(用socket传递接收数据包会丢包,所以需要一些协议进行进一步解析传递)

4.浏览器与web服务器之间如何通信?
建立连接,发送请求,发送响应,关闭连接,若浏览器要再次发送请求,需要重写建立新的连接,及”一次请求,一次连接”.
优点:web服务器可以利用有限的连接为尽可能多的请求服务

5.数据包的结构
请求数据包:
a.请求行(请求方式,请求资源路径,协议版本)
b.若干消息头(是一个键值对,使用:隔开),浏览器与web服务器,可以通过发送一些消息头来传递一些特定消息,如浏览器可以发送”user-agent”,消息头告诉服务器,浏览器的类型和版本.
c.实体内容(消息正文):只有当请求方式为post时,实体内容才会有数据
响应数据包:
a.状态行(协议版本,状态代码,状态描述),状态码是一个三位数字,描述服务器请求的一个状态.
b.响应头,发送一些响应头,如”Content-Type”告诉浏览器,服务器返回的数据类型和编码.
c.实体内容,程序的处理结果,浏览器解析出来,生成相应的页面

6.两种请求方式 ajax技术
get请求
发get请求情况:在浏览器输入某个地址 点击链接 表单默认的提交方式
特点:将请求参数显示在浏览器地址栏,不安全(一些网络设备会记录请求地址)会将请求参数添加到请求行(请求行只能存放2k左右数据),只能提交少量数据
post请求
发post请求情况:将表单的method属性设置为post
特点:不会将请求参数显示在浏览器地址栏,相对安全(http协议对数据包并不会加密处理,所以需要用http的加密),会将请求参数添加到实体内容里面,可以提交大量数据.

7.重定向
服务器通知浏览器向某个地址发送请求(服务器可以通过302状态和location消息头,该消息头的值是一个地址,为重定向地址),浏览器收到后,会立即向重定向地址发送请求.
如何重定向:response.sendRedirect(String url) url是重定向地址
特点:重定向地址是任意的,重定向之后浏览器地址栏的地址会发生变化

JSP

sun公司制定的一种服务器端的动态页面技术规范,(因为使用servlet虽然也可以生成动态页面,但由于反射,需要使用大量out.println语句,并且不利于页面的维护,若要修改页面,需要修改servlet代码,所以制定了jsp)
jsp是以.jsp为后缀的文件,该文件主要由html和少量的java代码组成,容器会将这个文件自动转成servlet然后执行,本质是一个servlet.

1.写jsp的步骤
(1)写.jsp为后缀的文件
(2)在这个文件中,可以使用如下元素:
html(css,js)直接写即可,java代码片段<%java代码%>,jsp表达式<%=java表达式%>
隐含对象:可以直接使用的对象,如out,request,response,application,session,exception,pageContext,page(jsp实例本身),config
因容器在生成对应的servlet源代码时,会自动添加获得这些对象的代码.
指令:告诉容器将jsp转成一个servlet时,额外做一些从处理,如导包
语法:<%@指令名 属性=值%>
page指令:import属性用于指定要导入的包名
<%@page import=”java.util. , java.text. “%>
a.contentType属性:用于设置response.setContentType方法的内容
b.pageEncoding属性:用来告诉容器在读取jsp文件的内容时使用指定字符集来解码
c.session属性:缺省值是true,若值是false,则容器不再添加获得session对象的代码,即 不能使用session隐含对象.
d.errorPage属性:用来指定一个异常处理页面,当jsp运行发送异常,则容器会调用异常页 面处理
f.isErrorPage属性:缺省值是false,若值是true,就可以使用exception隐含对象 (exception对象用于获得异常的一个简短的描述)

2.include指令
file属性:用于指定被包含的文件名.(容器会将file属性指定的文件的内容插入到该指令所在的位置,被包含的jsp并不会真正执行,没有对应的servlet)

3.jsp执行过程
(1)容器将jsp转换成一个servlet(html–>service方法里面使用out.weite输出)
注:out.println将null直接输出,out.write方法会将null转换成””输出

<% %> --> service方法里,照搬
<%= %> --> service方法中,使用out.print方法输出
<%! %> --> 给servlet增加了新的属性或方法  

(2)容器再调用该servlet,容器会将该servlet先编译,然后实例化,初始化,调用,销毁.

转发

一个web组件将未完成的处理交给另外一个web组件继续做.
web组件是servlet和jsp的总称,通常是一个servlet获得数据之后转交给另外一个jsp来展现.

1.转发过程
(1)将数据绑定到request对象上

request.setAttribute(String name,Object obj);   name:绑定名  obj:绑定值
`

(2)获得转发器
RequestDispatcher rd = request.getRequestDistinct(String url);
RequestDispatch是一个接口,该方法会返回一个符合该接口要求的对象,该对象为转发器
转发的本质是一个web组件通知转发器会调用另外一个web组件,可以将转发器看做一个媒介,通过媒介可以通知容器去调另一个web组件.
url是转发的目的地,通常是一个jsp
(3)转发
rd.forward(request,response);

依据绑定名获得绑定值,若绑定值不在,返回null
request.getAttribute(String name);

2.特点
转发之后,浏览器的地址栏的地址是不变的;
转发的目的地有限制,要求属于同一个web应用.

3.比较转发和重定向
(1)转发可以共享request,重定向不行(容器收到请求之后,会立即创建request和response对象,一旦响应发送完毕,会立即销毁这两个对象,也就是说request和response对象的生成时间是一次请求和响应期间存在;转发是一次请求,重定向是二次请求)
(2)转发的浏览器地址栏的地址没有变化,重定向有变化
(3)转发的目的地有限制(要求同一个应用),重定向没有任何限制

状态管理

1.状态管理
将浏览器与web服务器之间多次交互当做一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来.

2.如何进行状态管理
(1)将状态保存在浏览器端(cookie)
(2)将状态保存在服务器端(session会话)

2.cookie
cookie:服务器临时存放在浏览器端的少量数据,用于跟踪用户状态.
cookie工作原理:当浏览器访问服务器时,服务器将少量数据以set-cookie消息头的形式发给浏览器,浏览器会保存下来;当浏览器再次访问服务器时,会将之前保存的这些数据以cookie消息头的形式发送给服务器.

3.如何添加cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
name–cookie的名称 value–cookie的值

4.如何读取cookie
Cookie[] request.getCookies();
该方法有可能返回null
String cookie.getName();
String cookie.getValue();

5.生存时间问题
(1)默认情况下,浏览器会将cookie保存在内存里面,浏览器如果关闭,则cookie会被删除.
(2)可以调用setMaxAge方法来设置cookie的生存时间.
cookie.setMaxAge(int seconds); 单位是秒
seconds > 0:浏览器会将cookie保存在硬盘上(一般是文件的形式),超过指定的时 间,cookie会被删除.
seconds < 0:默认情况(即保存到内存里面)
seconds = 0:删除cookie
如,要删除一个名称为username的cookie
Cookie c = new Cookie(“username”,””);
c.setMaxAge(0);
response.addCookie(c);//同名的cookie会被覆盖达到修改的目的

servlet的生命周期

生命周期:Servlet容器如何创建servlet实例,如何对其进行初始化操作,如何调用其方法来处理请求,以及如何销毁其实例的整个过程,也可以说即容器时如何管理servlet.

生命周期分成哪几个阶段
1.实例化:容器调用servlet的构造器,创建servlet实例
实例化时间:默认情况下,容器只有收到请求后,才会创建servlet实例(容器只会创建一个servlet实例)
在添加适当配置后,可以让容器启动后,立即创建servlet.

  <!--配置启动加载   参数值是一个大于等于零的整数,值越小越优先被创建-->
  <load-on-startup>1</load-on-startup>

2.初始化
容器在创建好servlet实例后,会调用该实例的init(ServletConfig)方法.
(该方法只会执行1次)
GenricServlet已经提供了init(ServletConfig config)方法的实现.
该方法实现:将容器传递过来的ServletConfig对象保存下来,且提供了getServletConfig方法来获得该对象,另外,该方法还调用了一个init()方法,作为开发人员,若要扩展,只需要重写override init()方法即可.

ServletConfig提供了一些实用方法,如读取初始化参数的方法.

      
      
          company
          码多多
      

3.就绪(调用)
容器在收到请求之后,会调用servlet实例的service方法处理请求.
HttpServlet已经提供了service方法的实现.
该方法实现:依据请求类型调用对应的doXXX方法,如get请求调用doGet方法,post请求调用doPost方法.doXXX方法只是简单的抛出一个异常.
在开发servlet时,有两个选择,一是直接重写Httpservlet的service方法,或者重写HttpServlet的doGet和doPost方法.

4.销毁
容器在删除servlet实例之前,会调用该实例的destory方法.(该方法只会执行一次)
该方法的实现为空(什么都没有做),开发人员可以override的destory方法来扩展.

容器如何处理请求资源路径

如,在浏览器地址栏输入http://ip:port/appname/abc.html,容器如何处理
1.容器默认会认为访问的是一个servlet,所以容器会查看web.xml中有没有匹配的servlet.

有三种匹配方式:
精确匹配:url-pattern的值必须等于请求路径,如对于上述请求,值必须是”abc.html”
通配符匹配:使用”*”匹配任意零个或者多个字符,

<url-pattern>/*</url-pattern>

后缀匹配:使用”*.”开头,后接一个后缀,用来匹配所有以该后缀结尾的请求.

: <url-pattern>*.do</url-pattern>

2.若没有匹配的servlet,则容器会查找对应的文件.

如何让一个servlet处理多种请求
1.使用后缀匹配,

    比如<url-pattern>*.do</url-pattern>

2.分析请求资源路径,进行不同的处理

过滤器

servlet规范当中定义的一种特殊的组件,用于拦截servlet容器的调用过程.(容器收到请求过后,会先调用过滤器,再调用servlet)

1.如何写一个过滤器
(1)写一个java类,实现Filter接口
(2)在接口方法当中,实现拦截处理逻辑
(3)配置过滤器(web.xml)

2.过滤器的优先级
当多个过滤器都满足拦截要求,过滤器先执行前面的过滤器

3.初始化参数

(1)配置初始化参数
    <!-- 配置初始化参数 -->
      <init-param>
          <param-name>illegal</param-name>
          <param-value></param-value>
      </init-param>
(2)使用FilterConfig对象提供的方法来读取
    //读取初始化参数
    String illegal = config.getInitParameter("illegal");

4.过滤器的优点
(1)在不修改原有代码的基础上,添加一些简单的功能
(2)将多个组件相同的功能集中写在一个类里面(即过滤器里面),方便代码的维护

request,session,servlet上下文都可以绑定数据,有什么区别?

1.绑定的数据生存时间不一样,按照生存时间的长短来排序,依次是 request<session<servlet上下文,在满足使用条件的情况下,优先使用声明周期短的.
2.绑定到session对象上的数据,只有与之对应的用户能够看到;绑定到上下文上的数据,所 有用户都可以访问.

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. servlet具体的运行过程
  2. 2. servlet
  3. 3. JSP
  4. 4. 转发
  5. 5. 状态管理
  6. 6. servlet的生命周期
  7. 7. 容器如何处理请求资源路径
  8. 8. 过滤器
    1. 8.1. request,session,servlet上下文都可以绑定数据,有什么区别?
本站总访问量: , 本页阅读量: