转发与重定向的区别
- 转发所涉及的web组件可以共享同一个request和response
而重定向不可以。(注:当请求到达容器时,容器创建request和response,当响应发送完毕,
容器会立即销毁request和response。即request和response生存时间是一次请求与响应期间存在。) - 转发的地址有限制(同一个应用),重定向没有任何限制。
- 转发之后,浏览器地址栏的地址不变,重定向会变。
容器如何处理请求资源路径
http://ip:port/appname/abc.html
默认是一个servlet,不会直接去找abc.html这个静态页面,如果没有这个servlet则会去加载这个静态页面。
处理servlet异常
- 交给容器来处理
- 将异常抛给容器。
- 配置异常(web.xml)。
- 添加异常处理页面。
- 自己处理(编程式处理)
- 捕获异常。
- 编写异常处理代码,通常转发到某个异常处理页面。
- 添加异常处理页面。
注:系统异常一般使用第一种,而对于应用异常(用户的错误引起的异常,比如输入错误的账号密码)一般使用第二种。
路径问题
连接,表单提交,重定向,转发
- 什么是相对路径
- 不以"/"开头的路径。(相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。)
- 什么是绝对路径?
- 以"/"开头的路径。(从盘符开始的路径,这是一个完整的路径。)
优先使用绝对路径,并且,不要将绝对路径写死了,而应该使用request.getContextPath()来获取。
状态管理
- Session
- Cookie
web服务器利用有限的链接提高效率。(及时释放资源)
什么是状态管理?
将浏览器与web服务器之间多次请求当做一个整体来看待,并且将多次交互所涉及的数据保存下来。
注:状态是多次交互所涉及的数据
如何进行状态管理?
- 将状态保存在客户端。(比如Cookie技术。)
- 将状态保存在服务器端。(比如Session技术。)
Cookie
- 什么是Cookie
- 服务器发送给浏览器的少量数据,用于识别客户端用户的身份,属于客户端的管理技术。
- 工作原理
- 当浏览器访问服务器,服务器将少量数据以set-cookie消息头的方式,发送给浏览器,浏览器会将这些数据临时保存下来。
- 当浏览器再次访问服务器时,会将之前保存的数据以cookie消息头的方式发送给服务器。
- 编程
- 添加cookie
- Cookie c = new Cookie(String name,String value);
- response.addCookie©;
- 读取cookie
- Cookie[] request.getCookies();(注:有可能会返回null)
- String cookie.getName()
- String cookie.getValue()
- cookie的生存时间
- 默认情况下,浏览器会将cookie保存在内存里面。(浏览器只要不关闭,cookie就会一直存在。)
- 设置cookie的生成时间(cookie.setMaxAge(int seconds))
- seconds 大于0:浏览器会将cookie保存在硬盘上,以文件的形式。如果超过指定的时间,cookie会被销毁。
- seconds 小于0:(默认值)将cookie保存在内存中。
- seconds 等于0:删除cookie。
比如,要删除一个名称为uname的cookie。
Cookie c = new Cookie("uname","");
c.setMaxAge(0);
response.addCookie(c);
用新的替换老的,新的会在浏览器被删除。
cookie的编码问题
cookie只能保存合法的ascii字符。
中文显示不属于ascii字符,需要将中文转化成相应的ascii字符形式。
String URLEncoder.encode(String str,String charset) 该方法将中文转化为ascii字符。
String URLDecoder.decode(String str,String charset) 该方法将ascii字符转化为中文。
cookie的路径问题
- 默认路径
- cookie的默认路径等于添加该组件的路径:比如 /servlet08/app1/addCookie.jsp,添加了一个cookie,则该cookie的路径是/servlet08/app1。
- 浏览器向服务器上的某个地址发请求时,会比较cookie的路径是否与要访问的地址(路径)匹配,只有符合要求的cookie才会发送给服务器。
- 要访问的路径是cookie的路径或者其子路径,cookie才会发送给服务器。
- 修改路径
- cookie.setPath(String path)
cookie的限制
- cookie可以被浏览器禁止。
- cookie只能保存少量数据(大约是4k)
- cookie的数量也有限制。(大约几百个)
- cookie不安全。对于敏感数据,要加密处理。
session(会话)
- 什么是session
- 服务器端为了保存状态而创建的一个对象(即session对象)。
- 工作原理
- 浏览器访问服务器时,服务器创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),同时服务器会将这个sessionId发送给浏览器。(默认以cookie的方式)
- 当浏览器再次访问服务器时,会将这个sessionId发送给服务器,服务器依据这个sessionId就可以找到对应的session对象。
- 如何获得session对象
- 方式一:HttpSession request.getSession(boolean flag);
- 当flag为true,服务器会查看请求当中是否有sessionId,
- 如果有,则返回对应的session对象(如果session对象因为过期已经被销毁了,则创建一个新的session对象);如果没有则创建一个session对象。
- 当flag为false,服务器会查看请求当中是否有sessionId,如果有,则返回对应的session对象(如果session对象因为过期已经被销毁了,则返回null);没有返回null。
- 方式二:HttpSession request.getSession();(等价于request.getSession(true);)
session对象的使用
绑定数据到session对象上。setAttribute(String name,Object obj);依据绑定名获得绑定值(如果对应值不存在,返回null)
Object getAttribute(String name);
解除绑定:removeAttribute(String name);
session超时
服务器会把空闲时间过长的session对象删除掉。(默认的空闲时间是30分钟。)
可以修改一下配置,来修改默认的空闲时间。()
也可以通过java代码来设置空闲时间setMaxInactiveInterval(int seconds)
删除session对象
session.invalidate();