Servlet
1简介: Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序。
Sun公司在其API中提供了一个servlet接口,用户若想使用Java程序开发一个动态web资源,只需编写一个servlet接口的实现类,并把这个类部署到web服务器中,就算开发好了一个动态web资源。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet。
2使用方法
1>实现Servlet接口 2>继承GenericServlet抽象类 3>继承HttpServlet抽象类
在web.xml中为Servlet配置URL映射由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成
3部署
同一个Servlet可以被映射到多个URL上
即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:
一种格式是“*.扩展名”,
另一种格式是以正斜杠(/)开头并以“/*”结尾。
4容器处理请求的流程
(1.客户端发出请求
2.Servlet容器接收客户请求并解析
3.Servlet容器创建ServletRequest对象
此对象中包含请求头、正文、客户机的IP等信息
4.容器创建ServletResponse对象
5.容器调用客户端请求Url对应的Servlet的service方法,将请求和响应对象传入
6.Servlet从请求对象中获得客户端的请求信息
7.Servlet完成客户请求的业务操作
8.Servlet利用响应对象输出业务操作处理的结果
9.)Servlet容器将Servlet处理的结果响应给客户端
5Servlet生命周期
实例化 创建实例 (2) 调用init()方法 (3)调用service()方法 (4)销毁调用destroy()方法
初始阶段:
1.servlet容器加载servlet类,把servlet类的.class文件独到内存
2.容器创建ServletConfig对象,该对象包含了servlet的初始化信息
3.容器创建一个servlet对象,调用对象的int方法进行初始化。
运行阶段:
当容器接到客户端的请求的时候,会创建servletRequest和servletResponse对象,然后调用service方法,并把这两个参数传进去。不管是通过doGet(参数放到请求的头,故有长度限制)还是doPost方法处理请求(参数放到请求体中,故无长度限制),都是由service方法来处理的。servletResponse获得请求的信息,servletResponse返回处理后的信息。
销毁阶段:
因为只有一个实例,所以只进行一次销毁,调用的是destroy方法,将servlet对象和相关联的servletConfig对象也一并销毁。我们可以在destroy方法中,添加一些释放资源的方法,这样会提高系统的性能。如,关闭连接,关闭流的输出等
6Servlet线程安全问题
Servlet是单实例多线程。
当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
解决:避免使用实例变量
其他两种方法会引起大量的系统开销被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态
7Servlet处理请求
不管是否基于mvc模式,servlet处理请求主要是基于servletRequest和servletResponse对象的。在mvc模式中,为达到职责单一的目的,采用了转发和重定向的思想。这里是一个重点。转发只发生在服务端,客户端是不知道的,不涉及重新发送请求的问题,所以数据不会被冲刷掉,request数据共享;而重定向,则是将处理到一定程度的数据回发给客户端后,再次建立一次新的请求,上次请求中request对象中的数据信息不会保留。
8ServletContext对象
9cookie和session
Cookie
Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务
Cookie具有不可跨域名性 一个浏览器独占一个session对象
Session和Cookie的主要区别在于:
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
使用session对象存取数据的步骤
使用属性保存数据setAttribute(String key,Object obj)
从属性中读取数据,必要时需要进行数据类型转换getAttribute(String key)
Jsp
1JSP的运行原理: JSP 本质上是一个 Servlet.每个JSP 页面在第一次被访问时, JSP 引擎将它翻译成一个 Servlet 源程序, 接着再把这个Servlet 源程序编译成 Servlet 的 class 类文件. 然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
2、JSP页面一共有 9 个隐含对象.
①. request:HttpServletRequest 的一个对象.
②. response:HttpServletResponse 的一个对象(在 JSP页面中几乎不会调用 response 的任何方法.)
③. pageContext: 页面的上下文, 是 PageContext 的一个对象. 可以从该对象中获取到其他 8 个隐含对象. 也可以从中获取到当前 页面的其他信息.
④. session: 代表浏览器和服务器的一次会话, 是 HttpSession 的一个对象.
⑤. application: 代表当前 WEB 应用. 是ServletContext 对象.
⑥. config: 当前 JSP 对应的 Servlet 的ServletConfig 对象(几乎不使用). 若需要访问当前 JSP 配置的初始化参数, 需要通过映射的地址才可以.
⑦. out: JspWriter 对象. 调用 out.println() 可以直接把字符串打印到浏览器上.
⑧. page: 指向当前 JSP 对应的 Servlet 对象的引用, 但为 Object 类型, 只能调用 Object 类的方法(几乎不使用)
⑨. exception: 在声明了 page 指令的 isErrorPage="true" 时, 才可以使用.
3.和属性相关的方法:
1). 方法
void setAttribute(String name, Object o): 设置属性
Object getAttribute(String name): 获取指定的属性
Enumeration getAttributeNames(): 获取所有的属性的名字组成的 Enumeration 对象
removeAttribute(String name): 移除指定的属性
2). pageContext, request, session, application对象都有这些方法! 这四个对象也称之为域对象.
pageContext: 属性的作用范围仅限于当前 JSP 页面
request: 属性的作用范围仅限于同一个请求.
session: 属性的作用范围限于一次会话: 浏览器打开直到关闭称之为一次会话(在此期间会话不失效)
application: 属性的作用范围限于当前 WEB 应用. 是范围最大的属性作用范围, 只要在一处设置属性, 在其他各处的 JSP 或Servlet 中 都可以获取到.
4:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
5page、include、taglib
a、page指令:定义页面的一些属性,常用属性:
contentType="text/html;charset=utf-8"; 向浏览器端输出数据的编码
pageEncoding="utf-8";JSP编译成java文件时所用的编码
session="true" 是否自动创建session
b、include指令:引入一个静态的JSP页面
c、taglib指令:引入一个标签库
6:Servlet与JSP的区别。
1.JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。
2.JSP编译后是"类servlet"。
3.Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑