十三、请求转发
实现请求转发:请求转发指一个 web 资源受到客户端请求后,通知服务器去调用另一个 web 资源进行处理
HttpServletRequest对象(也叫Request对象)提供了一个getRequestDispatcher,该方法返回一个RequestDispatcher 对象,
调用这个对象的 forward 方法可以实现请求转发
Request.getRequestDispatcher(资源地址).forward(request,response);
资源地址:不需要项目名。因为它只是在WEB服务器内部转发。
实例:由 Servlet1 转发数据到 Servlet2
1)使用 forward不能转发到该web应用外的 url
2)因为 forward是发生在web服务器,所以 Servlet1和 Servlet 2使用的是用一个request和response.
3)使用sendRedirect() 方法不能通过request.setAttribute() 把 属性传递给下一个Servlet,因为两个 Servlet 的 request 不是同一个。
4)Request中的Attribute在一次请求有效
一次请求:只要没有停止,也没有回到浏览器重定向,就算一次(可以是多个 Servlet 之间依次请求,此时任意一个Servlet都是同一个Attribute)
5)sendRedirect() 和forward 的区别
一个web资源收到客户端请求后,通知服务器去调用另外一个 web 资源进行处理,
称为请求转发(因不经过浏览器所以效率比重定向高,推荐使用)(forward)
一个web资源收到客户端请求后,通知浏览器去访问另外一个 web 资源,称之为请求重定向 (sendRedirect())
(1) 叫法不同:sendRedirect() 重定向
forward() 叫转向
(2) 实际发生的位置不一样
sendRedirect发生 浏览器
forward 发生 web服务器
(3) 用法不一样
request.getRequestDispatcher(“/资源URI”).forward(request,response)
response.sendRedirect(“/web应用/资源URI”);
(4) 能够去URL范围不一样
sendRedirect可以去 外边URL
forward 只能去当前的WEB应用的资源
6)如果转发多次,我们的浏览器地址栏,保留的是第一次 转向的那个ServletUrl
十四、会话
1、基本概念
指用户开一个浏览器,访问一个网站,只要不关闭浏览器,不管该用户点击多少个超链接,
访问多少资源,直到用户关闭浏览器,整个过程称为一个会话。
2、Cookie
1)功能举例:
a)保存用户上次登录时间
b)保存用户名密码,下次自动登录
c)显示用户浏览历史
2)特点:
a)Cookie是在服务器端创建的。
b)Cookie是保存在浏览器这一端的。
d)Cookie是可以被多个浏览器共享的。
e)一个浏览器最多放入300个cookie,一个站点最多20个cookie 每个cookie大小限制在4K以内。
f )Cookie存放时是以明文方式存放的,因此安全性比较低。我们可以通过加密后在保存。
3)生命周期:
a) Cookie生命周期是会话级别的
如果不设置,该cookie的生命周期当浏览器关闭时就消亡。
setMaxAge(正数) 即多少秒后该cookie失效
setMaxAge(0) 删除该cookie
setMaxAge(负数),相当于该cookie的生命周期是会话级的
4)Cookie存放中文怎么处理
存放时:
String val =java.net.URLEncoder.encode("服务器","UTF-8");
Cookie cookie =new Cookie("uname",val);
取出时:
String val =java.net.URLEncoder.decode(cookie.getValue(),"UTF-8");
Out.println("uname="+val);
3、Session
1)特点
a)Session是存在服务器的内存中的。
b)一个用户浏览器,独享一个session对象。
c)Session中可以存放多个属性。
d)Session可以存放对象。
e)如果同一个用户浏览器向Session设置属性时名字相同会替换。2)生命周期:
a)Session中的属性的默认生命周期是30min,可以通过修改web.xml来修改。
b)修改的一个地方是:tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
对所有的web应用生效。
c)第二个地方是:在单个web应用下的web.xml文件下添加或修改ession-config
<session-config>
<session-timeout>10</session-timeout>
</session-config>
只对本web应用生效,如果两个配置文件冲突,就以单个web应用的配置为准。
d)第三种方法是:session.setMaxInactiveInterval(600);//以秒为单位
e)session周期是发呆时间,在失效前访问session,则重新计时
f)如果重启 tomcat 或者 reload web 应用,或者关机,session 都会失效
g)可以通过函数让 session 失效
invalidate() 该方法是让 session 中所有的属性失效,通常用于安全退出
如果只希望某个属性失效,使用方法:removeAttribute(name)
3)验证用户登陆
1)封装成一个函数
2)过滤器
4、cookie 与 session 比较
1)存在的位置
Cookie存在客户端的临时文件夹
Session存在在服务器内存中,一个session域对象为一个用户浏览器服务。
2)安全性
Cookie是以明文方式存放在客户端的,所以说安全性相对较弱.可以MD5加密再存放。
Session是存放服务器内存中的,安全性相对较强。
3)网络传输量
Cookie会传递信息给服务器
Session属性值不会传递给客户端。
4)生命周期
Cookie的生命周期是累积时间,即到点就失效。即我们给cookie设置setAge(30);30秒后及失效。
Session 的声明周期间隔时间,即从最后一次访问后开始计时。即我们设置Session为20分钟,如果20分钟内没有访问,Session即失效。
以下情况Session也会失效
A.关闭tomcat
B.重启web应用
C.时间到
D..调用session.invalidate();
5)使用原则
因为Session会占用服务器内存,因此不要往session中存放过多过大的对象。
每个站点最多20个cookie 每个cookie大小限制在4K以内。
十五、ServletContext
1、概念:
1.ServletContext 是在服务器创建
2.ServletContext被所有客户端共享
3.ServletContext 当web应用启动时自动创建,
4.ServletContext 当web应用关闭 重启动或服务器关闭时都会造成ServletContext销毁
对ServletContext的用法小结:
//获取ServletContext的两种方法
this.getServletContext(); 或者 this.getServletConfig().ServletContext();
//添加属性
servletcontext.setAttribute(String , object);
//取出属性
servletcontext.getAttribute("属性名");
//删除
servletcontext.removeAttribute("属性名");
2、ServletContext的应用
1)获取web应用的初始化参数
<!-- 如果希望所有的Servlet都可以访问该配置-->
<context-param>
<param-name>name</param-name>
<param-value>socott</param-value>
</context-param>
如何获取
String val =this.getServletContext().getInitParameter("name");
2) 使用ServletContext实现跳转
目前跳转到页面有几种方法
1 、response.sendRedirect("/web应用名/资源URL");
2 、resquest.getRequestDispatcher("/资源URL").forward(resuest,response);
区别 1: getRequestDispatcher跳转发生在服务器而sendRedirect跳转发生在浏览器
2: 如果resquest.setAttribute("name","gust");希望下个页面可以使用其属性则用getRequestDispatcher
3: 如果session.setAttribute("uname","顺平");希望下个页面可以使用其属性则用两种方法都可以,
建议使用getRequestDispatcher因为效率高些
4: 如果我们要跳转到本应用外的URL则使用sendRedirect
3 、this.getServletContext().getRequestDispatcher("/资源URL").forward(resuest,response);
跟第二种方法一样...
3) 读取文件,和获取文件的路径
//读取文件
InputStream is =this.getServletContext().getResourceAsStream("dbinfo.properties");
//创建properties
Properties pp = new Properties();
pp.load(is);
Out.println("name="+pp.getProperty("username"));
//如果文件在src目录下要用类加载器去读
InputStream is=Servlet类名.class.getClassLoader().getResoureAsStream("dbinfo.properties");
//获取文件全路径
Stringpath=this.getServletContext().getRealPath("/imgs/a.jpg");
Out.println("path="+path);
防刷新: 用response.sendRedirect("/web应用名/资源URL");跳转能防刷新
特别说明:如果某个web应用你不需要,请把该web应用从 webapps目录下移走,否则tomcat启动的速度会越来越慢.
《Head First Servlet JSP》 里对Sevlet 也有很多的讲解,可看网上的博客笔记:http://lavasoft.blog.51cto.com/62575/275590