您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第10讲JSP动作-在JSP中使用JavaBean
4.4在JSP页面中使用JavaBeanJSP动作指令4.4.1JavaBean概述Sun公司将JavaBean定义为可以复用的软件组件,它在遵循JavaBean技术规范的基础上提供特定的功能,这些功能模块可以组合成更大规模的应用系统。JavaBean是Java中的一个组件技术,类似于微软的COM组件,其本质是一个封装了一系列属性和方法的类。在JSP中使用JavaBean具有以下好处:可实现代码的重复利用。易编写,易维护,易使用。JavaBean的种类可视化JavaBean:即带有界面的类,如文本框、下拉列表框等。非可视化JavaBean:即没有界面元素的类。这种JavaBean仅仅是在功能上进行封装,从而提供可以重复利用的软件组件,不涉及界面元素的编程。在JSP程序中所用的JavaBean一般以非可视化为主,可视的JavaBean一般用于编写Applet程序或Java应用程序。JavaBean示例publicclassUser{privateStringname;privateintage;privatebooleanisVip;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicbooleanisVip(){returnisVip;}publicvoidsetVip(booleanisVip){this.isVip=isVip;}}作为JavaBean的类中所有属性都应定义为private,以实现封装。每个属性都应定义getXxx()和setXxx()方法来进行操作,其中Xxx是首字母大写的私有属性的名称。如果某个属性的类型为boolean,属性名为isA,则对应的获取方法为isA(),对应的设置方法为setA()。JavaBean类必须有一个无参公共构造器,以便JSP引擎调用来实例化类对象。JavaBean组件可以实现序列化。序列化JavaBean通过将数据库中的表与JavaBean组件形成映射关系可以JavaBean组件的持久化。但由于关系型数据库与面向对象机制不同,为了方便存储JavaBean的某时状态,JavaBean规范提供了序列化机制来通过文件系统存储JavaBean快照。序列化分为:序列化和反序列化。序列化是将对象数据分解成字节流,写入字节流,以便存储在文件中。反序列化是打开字节流,从字节流中读取对象并重构对象。JavaBean组件序列化只需实现java.io.Serializable接口即可,不需要在类中增加任何代码。4.4.2在JSP使用JavaBeanJSP动作指令描述jsp:useBean/声明、实例化和初始化JavaBeanjsp:setProperty/设置JavaBean实例的属性值jsp:getProperty/获取JavaBean实例的属性值在JSP中使用JavaBean的优势1)jsp:useBean/动作jsp:useBean/动作用于在JSP页面中创建一个JavaBean实例,并指定其实名称及作用范围。这个动作首先在指定的作用域中查找是否存在指定的JavaBean实例,如果不存在,则创建一个指定名称的JavaBean实例。jsp:useBean/动作的语法格式如下:jsp:useBeanid=beaninstanceNameclass=classNametype=typeNamebeanName=beanNamescope=page|request|session|application/jsp:useBeanid属性用于指定JavaBean实例变量的名称。该值必须指定,且在指定作用域内必须惟一。该值将被jsp:setProperty和jsp:getProperty动作使用。scope属性表示此JavaBean实例的作用范围。class、type和beanName是类型规范class、type和beanName属性class属性用于指定JavaBean的类名。该属性意味着在创建JavaBean实例时,通过调用指定类的公共无参构造器生成对象实例。因此class属性指定的类不能是一个抽象类,且必须有公共无参构造器。type属性用于指定id属性的变量类型。该属性指JavaBean实例变量的数据类型,可以是JavaBean类本身,也可以是JavaBean类的父类或JavaBean类所实现的接口。如果没有指定该属性,则默认为类变量指定的类型。如果不匹配,就会抛出一个ClassCastException异常。beanName属性取代class属性以创建JavaBean实例,其值被当作参数传递到java.beans.Beans.instantiate()方法中用以创建对象实例。beanName属性即可以用于指定一个序列化JavaBean,也可以指定一个类。示例1:只使用class属性bean.jspbean_jsp.javaorg.nls.Useruser=null;user=(org.nls.User)_jspx_page_context.getAttribute(user,javax.servlet.jsp.PageContext.PAGE_SCOPE);if(user==null){user=neworg.nls.User();_jspx_page_context.setAttribute(user,user,javax.servlet.jsp.PageContext.PAGE_SCOPE);}jsp:useBeanid=userclass=org.nls.User/①声明一个类型为org.nls.User的对象变量,未指定type属性时类型由class属性决定②该变量指向名为user(由id属性指定)的一个对象实例,该对象在默认范围内有效③如果user对象实例不存在,则使用org.nls.User类的公共无参构造器创建一个的实例,并由user变量引用。bean.jspbean_jsp.java如果user对象实例不存在,则会抛出异常。示例2:只使用type属性org.nls.Useruser=null;user=(org.nls.User)_jspx_page_context.getAttribute(user,javax.servlet.jsp.PageContext.PAGE_SCOPE);if(user==null){thrownewjava.lang.InstantiationException(beanusernotfoundwithinscope);}jsp:useBeanid=usertype=org.nls.User/示例3:使用type和class属性org.nls.Useruser=null;user=(org.nls.User)_jspx_page_context.getAttribute(user,javax.servlet.jsp.PageContext.PAGE_SCOPE);if(user==null){user=neworg.nls.User();_jspx_page_context.setAttribute(user,user,javax.servlet.jsp.PageContext.PAGE_SCOPE);}jsp:useBeanid=userclass=org.nls.User/jsp:useBeanid=usertype=org.nls.Userclass=org.nls.User/jsp:useBeanid=usertype=org.nls.Userclass=org.nls.VipUser/org.nls.Useruser=null;user=(org.nls.User)_jspx_page_context.getAttribute(user,javax.servlet.jsp.PageContext.PAGE_SCOPE);if(user==null){user=neworg.nls.VipUser();_jspx_page_context.setAttribute(user,user,javax.servlet.jsp.PageContext.PAGE_SCOPE);}示例4:使用type和beanName属性org.nls.Useruser=null;user=(org.nls.User)_jspx_page_context.getAttribute(user,javax.servlet.jsp.PageContext.PAGE_SCOPE);if(user==null){try{user=(org.nls.User)java.beans.Beans.instantiate(this.getClass().getClassLoader(),org.nls.User);}catch(java.lang.ClassNotFoundExceptionexc){thrownewInstantiationException(exc.getMessage());}catch(java.lang.Exceptionexc){thrownewjavax.servlet.ServletException(Cannotcreatebeanofclass+org.nls.User,exc);}_jspx_page_context.setAttribute(user,user,javax.servlet.jsp.PageContext.PAGE_SCOPE);}jsp:useBeanid=usertype=org.nls.UserbeanName=org.nls.User/注意:不能同时指定class和beanName属性JSP中的四种作用域作用范围对应的对象说明page(默认)pageContextBean只能在使用页面时使用,当加载新页面时,就会立即销毁。requestrequestBean在用户对其发出请求时存在。sessionsessionBean存于整个会话期间。applicationapplicationBean在整个应用程序中均可使用。2)jsp:setProperty/动作此动作用于给指定的JavaBean对象的属性赋值。语法格式如下:name:指JavaBean实例对象的名称。对应jsp:useBean动作中定义的id属性。property:指明要赋值的属性名称。JSP容器会调用与属性相匹配的setXxx()方法来设值。如果值为*,意味着可以对所有属性一次性赋值。value:指要赋于属性的新值。param:用于指定请求参数。【注意】:value和param不能同时使用。jsp:setPropertyname=beanInstanceNameproperty=*|propertyNamevalue|param=propertyValue/formaction=bean2.jspmethod=POST姓名:inputtype=textname=name/br密码:inputtype=passwordname=password/brinputtype=submitvalue=提交//formjsp:useBeanid=user1class=org.nls.User/jsp:setPropertyname=user1property=namevalue=jerry/jsp:setPropertyname=user1property=passwordvalue=456/jsp:useBea
本文标题:第10讲JSP动作-在JSP中使用JavaBean
链接地址:https://www.777doc.com/doc-2241868 .html