在web服务器运行阶段,每个Servlet都只会创建一个实例对象,然而,每次HTTP请求,web服务器都会调用
所请求Servlet实例的service(HttpServletRequest request,HttpServletReponse reponse)方法,重新创建一
个request对象和一个response对象。
HttpServletResponse接口继承自ServletResponse,专门用于封装HTTP响应消息,且响应消息分为 状态行,响
应消息头,响应消息体三部分。
当Servlet向客户端回送响应消息时需要在响应消息中设置状态码。
setStatus(int status)方法用于设置HTTP响应消息状态码,并生成响应状态行 并且只要通过setStatus(int)
status 方法设置了状态码,即可实现状态行的发送。 正常情况下,web服务器默认会发送一个状态码为200的状
态行。
sendError(int sc)方法用于发送表示错误信息的状态码
addHeader()、setHeader()、addIntHeader()、setIntHeader()、都是用于设置各种头字段的,另外setContentType
()、setLocale()和setCharacterEncoding()方法用于设置字符编码,这些方法可以有效地解决乱码问题。
getOutputStream 方法所获取的字节输出流对象是ServletOutputStream类型
5.2.4 请求重定向
某些情况,针对客户端请求,一个Servlet类可能无法完成全部工作。这时。可以使用请求重定向来完成
。所谓请求重定向,指的是web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求url
所指向的web资源,而是指定了一个新的资源路径,让客户端重新发送请求。
为了实现请求重定向,在HttpServletResponse接口中,定义了一个sendRedirect()方法,该方法用于生成
302响应吗和Location响应头,从而通知客户端重新访问Location响应头中指定的url。
public void sendRedirect(java.lang.String location) throws java.io.IOException
参数Location 可以使用相对url web服务器会自动将相对url翻译成绝对url,再生成location 头字段
5.4.1 获取请求参数
String getParameter(String name) 该方法是用于获取指定名称的参数值,如果请求消息中没有指定名称的
参数,getParameter方法返回null,如果指定名称的参数没有设置值,则返回空子串,否则如果请求消息中包含
多个该指定该名称的参数,则返回String getParaneter(name)方法中第一次出现的参数值
String 【】getParameterValues(String name)Http消息中可以有多个相同名称的参数(通常由一个包含多个同名
字段元素的FORM表单生成),如果要获得HTTP消息中的同一个参数名的多个值,此方法可以返回一个数组来包含所有
返回的参数值。
Enumeration getParameterNames()方法用于返回一个包含请求参数名的Enumeration对象,在此基础上面可以对
参数名进行遍历
Map getParameterMap()该方法用于将请求消息中的参数名和参数值装进一个Map对象中返回
用UTF-8编码 莫名其妙的乱码!!!
5.5 ReuqestDispatcher对象的应用
当一个web资源收到客户端的请求后,如果希望服务器通知另外一个资源去处理请求,这时,除了使用sendRedirect()
方法实现请求重定向外,还可以通过RequestDispatcher借口的实例对象来解决。
getRequestDispatcher(String path)方法 返回封装了某个路径所指定资源的RequestDispatcher对象,其中path必须
以“/”开头,用于表示当前web应用的根目录。需要注意的是,WEB-INF目录中的内容对RequestDispatcher对象也是可见
的,所以,传递给getRequestDispatcher()方法的资源可以是WEB-INF目录中的文件
请求转发:
forward(ServletRequest request,ServletResponse response) 该方法用于将请求从一个Servlet传递给另外的一个
web资源。在Servlet中,可以对请求做一个初步处理,然后通过调用这个方法,将请求传递给其他资源进行响应。需要
注意的是,该方法必须在响应提交给客户端之前被调用,否则将抛出异常。
请求包含:
include(ServletRequest request,ServletResponse response) 该方法用于将其他资源作为当前响应内容包含进来
当客户端访问Servlet时,通过调用include()方法将其他web资源包含进来,这样,当请求处理完毕后回送给客户端的
响应结果既包含当前Servlet的响应结果,也包含了其他web资源的响应结果。
COOKIE对象
服务器向客户端发送cookie时,会在HTTP响应头字段中增加Set-Cookie 响应头字段。Set-Cookie头字段中设置的Cookie
遵循一定的语法格式 set-Cookie:user=itcast;path=/; 其中user表示cookie的名称,itcast表示cookie的值,path
表示 cookie的属性。cookie必须以键值对的形式存在,其属性可以有多个,但是这些属性之间必须用;和空格隔开。
setMaxAge(int expity)和getMaxAge()方法
当设置的值 时正整数的时候表示cookie存活的秒数 值为0的时候表示;立即删除cookie信息,默认情况下,Max-Age
的属性时-1;
setPath(String uri)和getPath方法
这个方法是针对Cookie的Path属性的。如果创建某个cookie对象没有设置path属性,那么该cookie只对当前访问路径所属
的目录以及子目录有效。如果想让某个Cookie项对站点的所有目录下的访问路径都有效,应调用Cookie对象的setPath方法
将其path属性设置为/;
6.4 Session对象
Cookie技术 可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据共享。但是,如果传递的信息系比
较多,使用cookie技术显然会增大服务器端程序处理难度。这时可以使用session实现,session是一种将会话数据保存到
服务器端的技术。
Cookie 案例之实现上次访问时间
首先定义一个变量 LastAccessTime代表上次访问时间默认值设为空
然后再创建cookies数组来获得来自客户端的请求cookie ,根据获得的cookie的长度进行遍历来查询 名称是 LastAccess
的对象,并根据获得的对象来获得对应的值 并将得到的值赋值给LastAccessTime变量代表上次访问时间,若得到的LastAccessTime
的值为空说明,客户端是第一次访问,页面应输出语句 您是第一次访问本站!否则直接输出访问时间
其次创建一个cookie对象,并设置其属性名为 LastAccess 和值 LastAccessTime ,然后向客户端发送 创建的cookie。需要
注意的是 cookie为保存在客户端的缓存数据,相当于去医院看病的号码,而session是保存在服务器的数据相当于去医院按照
卡号看病并保存病例的过程。
Session案例之实现用户登录
首先需要一个处理类IndexServlet ,在类中创建一个Session对象,然后创建保存数据类 user的对象,利用session
对象来获得属性名为 user的对象,如果user为空则代表是第一次登录,此时页面应该提示用户登录,用一个超链接转到Login。html
页面来提供用户登录。若用户已经登录,则应该显示登录的用户名,用user对象的getUsername方法来获得。
然后继续创建cookie对象将session的标识号存到cookie对象当中去。
Session案例之实现购物车
实现此项目需要实现5个类,其中第一个类Book类用来封装图书信息,其中指定了id和name属性来表示图书编号和名称
BookDB:该类用于模拟保存所有图书的数据库。该类实现时,通过map集合存储了5个不同的book对象,提供了获取指定图书
和所有图书的相关方法。
ListBookServlet:该类用于显示所有可购买图书的列表,通过单击购买连接,便可将指定的图书添加到购物车中。
purchaseServlet:该类有两个功能,一个是将用户购买的图书信息保存到Session对象中,一个是在用户购买图书结束后
,将页面重新定向到用户已经购买的图书列表