第四章 Servlet技术 v1.0
第一部分 Servlet基础
一、Servlet书写
public class TestServlet extends HttpServlet {
@Override // 重写对应请求方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
// ... 具体实现
}
}二、Servlet基本配置
1.基于XML配置文件
<servlet><!--Servlet配置-->
<servlet-name>name</servlet-name><!--Servlet名称(名称必须唯一)-->
<servlet-class>servlet.TestServlet</servlet-class><!--Servlet具体实现类完整路径-->
</servlet>
<servlet-mapping><!--Servlet配置url地址字符串映射,可以配置多个-->
<servlet-name>name</servlet-name><!--Servlet名称(必须和<servlet>中的保持一致)-->
<url-pattern>/url</url-pattern><!--Servlet请求地址字符串-->
</servlet-mapping>优点:集中管理Servlet的配置,便于查找和修改。
缺点:代码较繁琐,可读性不强,不易于理解。
2.基于注解
//直接在Servlet上添加注解
@WebServlet("/url") //配置Servlet请求地址字符串(urlPatterns),可以使用数组
public class Register extends HttpServlet {
@Override // 重写对应请求方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
// ... 具体实现
}
}优点:直接在Servlet类中使用,代码量少,配置简单;且每个类只关注自身逻辑,与其他 Servlet 类互不干扰
缺点:Servlet 较多时,每个 Servlet 的配置分布在各自的类中,不便于查找和修改。
三、控制跳转
1.转发
基本语法:request.getRequestDispatcher("/url").forward(request, response);
2.重定向
基本语法:request.sendRedirect("/url"); ·
3.转发与重定向的区别
- 转发地址栏不变,重定向地址栏会发送改变
- 转发不支持跨域跳转,速度较快;重定向支持跨域跳转,速度较慢
- 转发为服务器行为,进行一次请求获得一次响应;重定向为客户端行为,进行两次请求获得两次响应
- 转发可以在转发请求中再绑定数据,而重定向无法再重定向请求中再绑定数据
四、请求与响应
1.请求相关操作(HttpServletRequest接口)
- 设置请求字符集:
setCharacterEncoding("UTF-8"); - 获取请求参数:
getParameter("参数名"); - 获取请求参数数组:
getParameterValues(String name); - 将请求中的所有参数名和参数值装入一个 Map 对象中返回:
getParameterMap();
2.响应相关操作(HttpServletResponse接口)
- 设置响应类型:
setContentType("text/html;charset=UTF-8"); - 获取字符输出流:
getWriter(); - 获取字节输出流:
getOutputStream(); - 增加响应头字段:
addHeader(String name,String value); - 设置 HTTP 响应消息的状态码:
setStatus(int status); - 发送表示错误信息的状态码:
sendError(int sc);
第二部分 Servlet进阶
一、控制启动优先级
1.配置项
- xml配置(load-on-startup)
- 注解配置(loadOnStartup)
2.配置说明
- 取值必须为整数
- 当值小于0或未指定时,Servlet容器在初次请求时才会被加载
- 当值大于0或等于0时,Servlet容器在启动时就加载并初始化该Servlet,取值越小,优先级越高
二、虚拟路径匹配
1.多重映射实现方式
- xml中配置多个
<servlet-mapping>元素 - xml中配置多个
<url-pattern>元素 - 在 @WebServlet 的
urlPatterns属性中使用字符串数组
2.虚拟路径匹配规则
第三部分 会话技术
一、Cookie
1.简介
Cookie 属于客户端会话技术,它是服务器发送给浏览器的小段文本信息,存储在客户端浏览器的内存中或硬盘上。当浏览器保存了 Cookie 后,每次访问服务器,都会在 HTTP 请求头中将这个 Cookie 回传给服务器。
Cookie默认是会话级别,保存到浏览器的内存中,浏览器关闭则Cookie失效;也可以通过设置是失效时间,使Cookie持久化的以文本文件的形式保存到硬盘上。
2.Cookie对象
创建一个Cookie对象:Cookie cookie = new Cookie("cookieName", "cookieValue");
相关方法:
setMaxAge(int s):设置Cookie最大有效时间,以秒为单位;若为负值则是会话级别getMaxAge():获取Cookie最大有效时间,以秒为单位;默认情况下为-1getName():用于获取Cookie的名称setValue(String value):用于设置Cookie的值getValue():用于获取Cookie的值setSecure(boolean flag):用于设置浏览器是否只能使用安全协议(如HTTPS)发送 Cookie
3.获取与保存Cookie
HttpServletResponse 接口和 HttpServletRequest 接口都定义了与 Cookie 相关的方法
- 添加Cookie:
addCookie(Cookie cookie); - 获取Cookie:
getCookies();
4.缺点
- 在 HTTP 请求中,Cookie 是明文传递的,容易泄露用户信息,安全性不高。
- 浏览器可以禁用 Cookie,一旦被禁用,Cookie 将无法正常工作。
- Cookie 对象中只能设置文本(字符串)信息,且客户端浏览器保存 Cookie 的数量和长度是有限制的。
二、Session
1.简介
Session是服务器端会话技术,当浏览器访问Web服务器的资源时,服务器可以为每个用户浏览器创建一个 Session对象,每个浏览器独占一个Session对象。
由于每个浏览器独占一个 Session,所以用户在访问服务器的资源时,可以把数据保存在各自的 Session 中。当用户再次访问该服务器中的其它资源时,其它资源可以从 Session 中取出数据,为用户服务。
2.原理
- 当客户端第一次请求会话对象时,服务器会创建一个 Session 对象,并为该 Session 对象分配一个唯一的 SessionID
- 服务器将SessionID以 Cookie(名称为:JSESSIONID,值为SessionID)的形式发送给客户端浏览器
- 客户端浏览器再次发送 HTTP 请求时,会将携带 SessionID 的 Cookie 随请求一起发送给服务器
- 服务器从请求中读取 SessionID,然后根据 SessionID 找到对应的 Session 对象。
3.生命周期
创建->绑定数据->销毁
4.HttpSession
5.Session与Cookie对比
三、其他
1.隐藏表单域
<input type="hidden"/>
2.重写URL
url?value=1