上一篇博客提到可以使用useBean动作标识来实例化javabean类对象的时候,提到一个scope属性。
<jsp:useBean id="user" class="com.hy.user" scope="page"/>
scope属性即是javabean的作用范围属性。
javabean的作用域范围有四种,由小到大依次为page,request,session,application。
之前讲jsp的九大内置对象的时候涉及到这几个内置对象代表的意思。application作用于全局,session作用于本次会话,request作用于当前链接,page则是当前页面。
将scope属性设置为application时,该对象可以应用于整个web应用。设置成session的时候,在不关闭浏览器的情况下,有一样的效果,除非调用session.invalidate();销毁该session。这是两者的区别。
而当scope属性设置为request,跳转页面的时候就涉及到两种情况,一个是请求重定向,一个是内部转发。
(请求转发是一次请求,地址栏不改变,多个Sevrlet共享一个request;
重定向是两次请求,地址栏改变,两个request对象。)
当跳转页面为请求重定向,即链接发生改变,user随之不可用。当跳转页面为内部转发的时候,地址栏不变,user可以使用。
page因为只能作用于当前页面,所以,只要涉及到页面的跳转,user都不可用了。
-------------------------------------------------------------
早期的jsp虽然可以用来开发网页,但是前段代码和后台逻辑混合在一个页面,混乱而冗余,因而有了javabean来初步进行前后端分离。(以下是本人脑内的写法)
使用jsp+javabean开发web应用,以一个登录功能为例,涉及到login.jsp页面,dologin.jsp,userServlet.java和user.java。以及一个登陆成功页面,一个登录失败页面。
(1)在login.jsp页面写登录表单,里面涉及到两个属性,用户名name和密码password,以post方式action提交到dologin.jsp页面。
(2)在user.java中添加user对象的name属性和password属性,分别创建各自的getter和setter方法。
(3)在userServlet.java中,导入user.jsp类,写public boolean login(User u);方法,使用u.getpassword()和u.getname()获取表单中的password值和name值,将获取的name和password值与预设的账号密码比较是否匹配(创建数据库,然后从数据库中查询数据出来比对更好),返回是否匹配成功的布尔值。
(4)在dologin.jsp中使用jsp的动作标识实例化user和userServlet,使用<jsp:setProperty property="*" name="user"/>自动匹配填充user的属性。判断userServlet.login(user)是true还是false,如果是true则跳转到登陆成功页面,如果失败则跳转到登录失败页面。