38 Servlet技术(下)

1 Servlet + JDBC应用

在Servlet中可以使用JDBC技术访问数据库,常见功能如下:

  • 查询DB数据库,然后生成显示页面
  • 接受请求参数,对数据库进行操作

为了方便重用和便于维护等目的,经常会采用DAO模式对数据库操作进行独立封装

DAO工厂(工厂模式)

​ 工厂类:封装了对象的创建细节,为调用者提供符合要求的对象

2 重定向和转发

2.1 重定向

重定向:客户向浏览器发送请求,当服务器接收后发送302状态码响应以及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动在发送一个新的请求,请求的url是新的location地址,服务器根据此请求寻找资源并发送给客户。

重定向的实现:借助HttpServletResponse接口中的以下方法:

方法声明 功能介绍
void sendRedirect(Stirng location) 使用指定的重定向位置URL向客户端发送临时重定向响应

重定向的特点:

  • 重定向后,浏览器地址栏的URL会发生改变
  • 重定向过程中会将前面Request对象销毁,然会创建一个新的Request对象
  • 重定向的URL可以是其他项目工程

2.2 转发

转发:一个Web组件将未完成的处理通过容器转交给另外一个Web组件继续处理,转发的各个组件会共享Request和Response对象。

转发的实现:

  • 绑定数据到Request对象

    方法声明 功能介绍
    Object getAttribute(String name) 将指定属性值作为对象返回,若指定名称属性值不存在,则返回空值
    void setAttribute(String name) 在此请求中存储属性值
  • 获取转发器对象

    方法声明 功能介绍
    RequestDispatcher getRequestDispatcher(String path) 返回一个RequestDispatcher对象,该对象充当位于给定路径上的资源的包装器
  • 转发操作

    方法声明 功能介绍
    void forward(ServletRequest req,ServletResponse res) 将请求从一个servlet转发到服务器上的另一个资源

转发的特点:

  • 转发之后浏览器的地址栏URL不会改变
  • 转发过程中共享Request对象
  • 转发的URL不可以是其他项目工程

重定向和转发的比较:

54.PNG

3 Servlet线程安全

服务器在接受到请求之后,会启动一个线程来进行相应的请求处理

默认情况下,服务器为每个Servlet只创建一个对象实例。当多个请求访问同一个Servlet时,会有多个线程访问同一个Servlet对象,此时就可能发生线程安全问题

多个线程并发逻辑,需要使用synchronized对代码加锁处理,但是要尽量避免使用

4 状态管理

Web程序基于HTTP协议通信,而HTTP协议是无状态协议,一旦服务器响应完客户的请求之后,就断开连接,而同一客户的下一次请求又会重新建立连接。

服务器程序有时需要判断是否为同一客户发出的请求,这时就需要跟踪同一用户发出的一系列请求。而把浏览器和服务器之间多次交互作为一个整体,将多次交互所涉及的数据保存下来,即状态管理。

多次交互的数据状态可以在客户端保存,也可以在服务器端保存。状态管理主要分为两类:

  • 客户端管理:将状态保存在客户端,基于Cookie技术实现
  • 服务器端管理:将状态保存在服务器端,基于Session技术实现

4.1 Cookie技术

Cookie本意为“饼干”含义,在这里表示客户端以“名-值”形式进行保存的一种技术。

浏览器向服务器发送请求时,服务器将数据以Set-Cookie消息头的方式响应给浏览器,然后浏览器会将这些数据以文本文件的形式保存起来。

当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。

相关方法:

使用Cookie类的构造方法实现Cookie的创建

方法声明 功能介绍
Cookie(String name,String value) 根据指定参数构造对象

使用HttpServletResponse接口的成员方法实现Cookie的添加

方法声明 功能介绍
void addCookie(Cookie cookie) 添加参数指定的对象到响应中

使用HttpServletResquest接口的成员方法实现Cookie对象的获取

方法声明 功能介绍
Cookie[] getCookies() 返回此请求对象中包含的所有Cookie对象

使用Cookie类的构造方法实现Cookie对象中属性的获取和修改

方法声明 功能介绍
String getName() 返回此Cookie对象中的名字
String getValue() 返回此Cookie对象的数值
void setValue(String newValue) 设置Cookie的数值

Cookie生命周期

默认情况下,浏览器会将Cookie信息保存在内存中,只要浏览器关闭,Cookie信息就会消失。如果希望关闭浏览器后Cookie信息依然有效,可以通过Cookie类的成员方法实现

方法声明 功能介绍
int getMaxAge() 返回Cookie的最长使用期限(以秒为单位)
void setMaxAge(int expiry) 设置Cookie的最长保留时间(秒)

Cookie的路径信息

浏览器在访问服务器时,会比较Cookie的路径与请求路径是否匹配,只有匹配的Cookie才会发送给服务器。

Cookie的默认路径等于添加这个Cookie信息时的组件路径,例如:/项目名/目录/add请求添加一个Cookie信息,则将该Cookie的路径是:项目名/目录

访问的请求地址必须符合Cookie的路径或者其子路径时,浏览器才会发送Cookie信息

方法声明 功能介绍
void setPath(String url) 设置cookie的路径信息

Cookie的特点

Cookie技术不适合存储所有数据,只适用于存储少量、非敏感信息,原因是:

  • 将状态数据保存在浏览器端,不安全
  • 保存数据量有限,大约4kb左右
  • 只能保存字符串信息
  • 可以通过浏览器设置为禁用

4.2 Session技术

Session本意为“会话”,用来维护一个客户端和服务器关联的一种技术。

浏览器访问服务器时,服务器会为每一个浏览器都在服务端的内存中分配一个空间,用于创建一个Session对象,该对象有一个id属性且该值唯一,我们称为SessionId,并且服务器会将这个SessionId以Cookie方式发送给浏览器存储。

浏览器再次访问服务器时会将SessionId发送给服务器,服务器可以根据SessionId查找对应的Session对象。

相关方法:

使用HttpServletRequest接口的成员方法实现Session的获取

方法声明 功能介绍
HttpSession getSession() 返回此请求关联的当前Session,若此请求没有则创建一个

使用HttpSession接口的成员方法实现判断和获取

方法声明 功能介绍
boolean isNew() 判断是否为新创建的Session
String getId() 获取Session的编号

使用HttpSession接口的成员方法实现属性的管理

方法声明 功能介绍
Object getAttribute(String name) 返回此会话中指定名称绑定的对象,若果没有对象在该名称下绑定,则返回空值
void setAttribute(String name,Object value) 使用指定的名称将对象绑定到此会话
void removeAttribute(String name) 从此会话中删除与指定名称绑定的对象

Session的生命周期

为了节省服务器的内存空间资源,服务器会将空闲时间过长的Session对象自动清理掉,服务器默认的超时限制是30分钟

使用HttpSession接口的成员方法实现失效时间的获取和设置

方法声明 功能介绍
int getMaxInactiveInterval() 获取失效时间
void setMaxInactiveInterval(int interval) 设置失效时间

也可以通过配置web.xml文件修改失效时间

<session-config>
  <session-timeout>30</session-timeout>
</session-config>
复制代码

Session特点:

  • 数据比较安全
  • 能够保存的数据类型丰富,而Cookie只能保存字符串
  • 能够保存更多的数据,而Cookie大约只能保存4KB
  • 数据保存在服务器端会占用服务器的内存空间,如果存储的信息过多、用户量过大,会严重影响服务器的性能。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享