




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java项目开发平台开发规范__________北京东方国信电子有限公司CRM事业部时间:2023-8-27目录Java项目开发平台开发规范 1一、开发平台概述 3二、技术综述 51、Struts框架技术 52、Hibernate数据持久化技术 93、动态bean技术 15三、在BONC-JONE平台上进行开发 191、BONC-JONE平台目录说明 192、如何使用BONC-JONE运营起来 193、开发有关规范性规定及典型环节 19四、重要函数及使用技术方法说明 43如何使用自定义标签库? 43如何使用日记类写日记? 45如何进行资源注册? 48如何进行登陆权限验证? 48如何进行字符转换? 48如何对资源文献进行字符转换? 48如何配置、读取应用配置信息? 48如何打包boncpersistenceobj.jar文献? 48数据操作方法的原理是如何的? 48如何将任意文献上传到数据库中,又如何下载? 48如何保证在页面清空的字段能对的提交到数据库? 48如何使用日期控件? 49如何使用DBQuery类进行数据查询? 49如何自动生成Hibernate持久化beans及map文献? 49如何使用分页技术? 51附录: 54附A:Struts学习精要参考 54附B:Hibernate学习精要参考 54附C:技术备忘 54一、开发平台概述BONC-JONE开发平台是北京东方国信电子技术有限公司遵循“简朴、有效、先进、可扩”的原则,通过整合Struts1.1与Hibernate2.1等优秀的开源技术设计并实现的一个J2EE开发平台。其架构图如下:这个体系架构的主体是MVC架构。MVC是Model/View/Control的缩写。Model/View/Control是软件设计的典型结构。在这种设计结构下,一个应用被分为三个部分:Model、View和Controller,每个部分负责不同的功能。Model是指对业务数据/信息的解决模块,涉及对业务数据的存取、加工、综合等;View是指用户界面,也就是面向用户的数据表达;Controller则负责View和Model之间的流程控制,也就是完毕两个方向的动作:1.将用户界面(View)的操作映射到具体的Model,以完毕具体的业务逻辑;2.将通过Model解决完的业务数据及时反映到用户界面(View)上。其系统组成结构图如下:平台辅助API表达层Struts+Tiles平台辅助API表达层Struts+Tiles业务层业务层业务管理接口+业务管理抽象类+业务管理实现类业务Beans技术业务Beans技术JDBC持久化层JDBC持久化层Hibernate连接池技术连接池技术数据库DataBase数据库DataBaseBONC-JONE开发平台从总体结构上充足体现了分层的系统设计思想。分层的概念起源于操作系统及网络协议设计中,但目前这个概念已在所有面向对象的应用系统中相称流行了。BONC-JONE开发平台重要层次分为:表达层、业务层、持久化层及一些各层公用的工具类库。分层的系统设计思想的重点在于:一个分层的系统在各相关层的实现代码间定义了接口,从而允许一个层的实现代码的变化不会影响到其它的层。分层系统结构还限制隔层依赖的发生,各层的通讯是由顶向下管理的。某一层仅依赖于直接位于它下面的那一层。每一层对其他层的存在都是不知道的,除非那一层紧邻其下。即使是对紧邻其下的层它也仅需要知道如何使用接口与其通讯就可以了,而无需知道其实现细节。BONC-JONE开发平台通过Struts+Tiles技术实现了MVC模式中的表达层和控制层,通过Hibernate技术结合动态Bean技术融合成独特的业务Beans技术构建了数据层。二、技术综述1、Struts框架技术Struts是一个基于J2EE的MVC框架。J2EE体系涉及JSP、Servlet、EJB、WEBSERVICE等多项技术。这些技术的出现给电子商务时代的WEB应用开发提供了一个非常有竞争力的选择。但如何把这些技术组合起来,形成一个适应项目需要的稳定架构对项目开发是非常重要的。设计一个框架,需要考虑的方面很多,不仅要对J2EE体系中的各种技术进行筛选取舍,并要考虑到开发过程中的角色分工、后期的运营维护,以及系统扩展性等诸多因素。因此,一个成功的软件需要有一个成功的架构。MVC架构使得应用程序的结构更加清楚,通过将代码按照层次划分为业务逻辑/数据、用户界面和应用流程控制这三个层次,增强代码稳定性。我们知道,对于Model、View、Controller这三部分功能来讲,View的实现一般是由界面设计人员和界面程序员来完毕,Model则是由业务逻辑程序员来完毕,Controller则一般由负责整体控制的程序员来完毕。Controller部分的代码比较稳定,一般会实现一个通用的架构;而Model则跟随商务流程的变化而变化;View的更改则是随着用户需求的更改而更改。这种模块功能的划分有助于在代码修改过程中进行模块的隔离,而不需要把具有不同功能的代码混杂在一起导致混乱。对于项目开发而言,有助于在项目小组内按照小组成员各自的擅长进行分工,有助于三个部分并行开发、加快项目进度。当前可供选择的较为流行的MVC框架有六种之多:Struts、Maverick、WebWork、Turbine、RealMothods、AOP(aspect-orientedprogramming)。它们应用的领域及实现的侧重点各有不同。但以Struts应用最广,是基于MVC模式的Web应用最经典框架,当推首选。Struts最早是作为ApacheJakarta项目的组成部分问世。项目的创建者希望通过对该项目的研究,改善和提高JavaServerPages(JSPs)、Servlet、标签库以及面向对象的技术水准。Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。因此我们选择Struts。Struts鼓励按照Model2方式构建应用的体系。Model2是MVC基本设计模式的一种变体。MVC设计模式的优点是,它使得Model、View和Controller各个部分之间相对独立。Struts在一个中心位置装配ActionServlet、ActionMapping和各种Action类,解决所有传入的HttpServletRequest。ActionServlet把各个传入的HttpServletRequest分发给Action类,而ActionMapping对象可通过Struts-config.xml配置文献控制,它告诉ActionServlet如何分发请求。本图示意了Struts各个部分之间的通信过程Controller的功能:在客户端、View和Model之间起协调、仲裁的作用。只有Controller才会与Model和View联系,在这中间它就象是一个互换机,而Model和View之间不会直接通信,这样,Model、View和Controller就被分隔开来。这是成功运用Struts的关键所在。说明一下:所有Controller的逻辑应当放入Action类,与应用的其他层的通信可以在这里进行。虽然我们可以把业务逻辑也放入Controller,但一般而言最佳不要这么做。应当改用Model部分的组件,由于这些组件才是真正解决数据的地方。把数据保存到数据库也应当是Model的功能之一。当Controller解决好一个HttpServletRequest,它把请求转发给View。View的唯一任务是表现数据,在Struts中,View一般使用JSP技术。在Struts中,Controller和View之间的所有通信都通过HttpServletRequest、HttpSession和ServletContext间接完毕,对于这些操作来说,首选的技术莫过于Servlet,Struts直接把HttpServletRequest传递给Servlet——或者是JSP,但是Servlet容器会自动把JSP转换成Servlet。Struts框架将其侧重点放在了Controller与View层。View由JSP定制标记库和JSP页面共同构造,其中ActionForm类是一种类似JavaBean的ValueObject对象,带有set和get方法,用来保存客户的状态。按照Struts的MVC概念,ActionForm位于View和Controller之间的中间地带。Struts提供了一组完备的专用标记,用来从JSP访问ActionForm里面的数据。Controller由ActionServlet、ActionMapping和各种Action类互相配合来完毕。其中Action类给开发人员自由发挥的空间比较大,因此,在开发过程中完整地遵从MVC的概念Action类的使用方式是一个关键。对于Struts的解剖。图解说明:其中不同颜色代表MVC的不同部分:红色(控制器)、紫色(模型)和绿色(视图)一方面,控制器(ActionServlet)进行初始化工作,读取配置文献(struts-config.xml),为不同的Struts模块初始化相应的ModuleConfig对象。比如配置文献中的Action映射定义都保存在ActionConfig集合中。相应地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。控制器接受HTTP请求,并从ActionConfig中找出相应于该请求的Action子类,假如没有相应的Action,控制器直接将请求转发给JSP或者静态页面。否则控制器将请求分发至具体Action类进行解决。在控制器调用品体Action的execute方法之前,ActionForm对象将运用HTTP请求中的参数来填充自己(可选环节,需要在配置文献中指定)。具体的ActionForm对象应当是ActionForm的子类对象,它其实就是一个JavaBean。此外,还可以在ActionForm类中调用validate方法来检查请求参数的合法性,并且可以返回一个包含所有错误信息的ActionErrors对象。假如执行成功,ActionForm自动将这些参数信息以JavaBean(一般称之为formbean)的方式保存在ServletContext中,这样它们就可以被其它Action对象或者JSP调用。Struts将这些ActionForm的配置信息都放在FormBeanConfig集合中,通过它们Struts可以知道针对某个客户请求是否需要创建相应的ActionForm实例。Action很简朴,一般只包含一个execute方法,它负责执行相应的业务逻辑,假如需要,它也进行相应的数据检查。执行完毕之后,返回一个ActionForward对象,控制器通过该ActionForward对象来进行转发工作。我们主张将获取数据和执行业务逻辑的功能放到具体的JavaBean当中,而Action只负责完毕与控制有关的功能。遵循该原则,所以在上图中将Action对象归为控制器部分。本图给出了客户端从发出请求到获得响应整个过程的图解说明。以上我们从原理上剖析了Struts,关于具体如何应用Struts框架框,请参看附录A。2、Hibernate数据持久化技术Hibernate是一种object/relationalmapping(ORM)的持久化技术。曾经,涉及现在也有许多J2EE项目在直接使用SQL/JDBC实现持久化。众所周知的DAO模式让我们把复杂的JDBC编码和大量SQL隐藏到业务逻辑和领域模型之后,但这种方式实现的是有限的分离,最致命的是应用由一种数据库向另一种数据库迁移时可移植性非常差。此外它规定开发者对项目中使用的关系数据库管理系统非常熟悉,并且要精通SQL。当前可供选择的较为流行的数据持久化技术也同样有很多:EJB、Hibernate、JDO、OJB、Cayenne、SimpleORM、JAXOR等等。不选用EJB的理由EJB在J2EE应用里是一个重量级的组件,它由容器提供了分布、事务等多种公司级应用需要的特性。我们不选用它重要是由于:兼容性问题。规范一模同样,实现各有不同,当从某一种EJB容器向另一种EJB容器移植时维护的成本会很高。性能问题。不支持动态Query的问题。EntityBean最终的执行代码是在部署编译时生成的,很难实现动态Query。假如一个应用对事务解决规定很高,访问量非常大需要实现分布式集群时EJB才是必须的。选用Hibernate的理由Hibernate是当前最活跃,应用最广,更新最快,文档最完整,功能最齐备的一个数据持久化的开源项目。选用它的理由重要有:Hibernate并不直接反映数据库中的表和列,它通过一些持久化类(JavaBeans)来映射到数据库中的表上。这些持久化类与我们通常使用的JavaBeans没有任何不同,它们即可以由Hibernate来持久化,同样重要的是它们也可以完全与Hibernate无关地被使用。这是它与其它持久化模型(比如EJB)的一个重要的区别即Hibernate的持久化类是纯JavaBeans,它可以在任何地方被使用,而不需要容器。Hibernate提供了一种对象导向的查询语言(HQL)。几乎支持所有的SQL语法,传统数据库可以做的它就可以做。Hibernate提供了数据分段提取控制功能。将Hibernate放在SLSB后,它同样可以实现分布式应用,同样可以运用容器提供的JAT事务服务。因此我们选择Hibernate。Hibernate概要结构图:Hibernate具体结构图:Hibernate使用概要手工创建或使用工具自动生成Hibernate的持久化类;文献示例:packageeg;importjava.util.Set;importjava.util.Date;/***@hibernate.class*table="CATS"*/publicclassCat{privateLongid;//identifierprivateDatebirthdate;privateCatmate;privateSetkittensprivateColorcolor;privatecharsex;privatefloatweight;/***@hibernate.id*generator-class="native"*column="CAT_ID"*/publicLonggetId(){returnid;}privatevoidsetId(Longid){this.id=id;}/***@hibernate.many-to-one*column="MATE_ID"*/publicCatgetMate(){returnmate;}voidsetMate(Catmate){this.mate=mate;}/***@perty*column="BIRTH_DATE"*/publicDategetBirthdate(){returnbirthdate;}voidsetBirthdate(Datedate){birthdate=date;}/***@perty*column="WEIGHT"*/publicfloatgetWeight(){returnweight;}voidsetWeight(floatweight){this.weight=weight;}/***@perty*column="COLOR"*not-null="true"*/publicColorgetColor(){returncolor;}voidsetColor(Colorcolor){this.color=color;}/***@hibernate.set*lazy="true"*order-by="BIRTH_DATE"*@hibernate.collection-key*column="PARENT_ID"*@hibernate.collection-one-to-many*/publicSetgetKittens(){returnkittens;}voidsetKittens(Setkittens){this.kittens=kittens;}//addKittennotneededbyHibernatepublicvoidaddKitten(Catkitten){kittens.add(kitten);}/***@perty*column="SEX"*not-null="true"*update="false"*/publicchargetSex(){returnsex;}voidsetSex(charsex){this.sex=sex;}}手工创建或使用工具自动生成Hibernate的xml映射文献;文献示例:<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD2.0//EN"""><hibernate-mapping><classname="eg.Cat"table="CATS"discriminator-value="C"><idname="id"column="uid"type="long"><generatorclass="hilo"/></id><discriminatorcolumn="subclass"type="character"/><propertyname="birthdate"type="date"/><propertyname="color"not-null="true"/><propertyname="sex"not-null="true"update="false"/><propertyname="weight"/><many-to-onename="mate"column="mate_id"/><setname="kittens"><keycolumn="mother_id"/><one-to-manyclass="eg.Cat"/></set><subclassname="eg.DomesticCat"discriminator-value="D"><propertyname="name"type="string"/></subclass></class><classname="eg.Dog"><!--mappingforDogcouldgohere--></class></hibernate-mapping>初始化ConfigurationConfigurationcfg=newConfiguration().addFile("Cat.hbm.xml").addFile("DomesticCat.hbm.xml");或Configurationcfg=newConfiguration().addClass(eg.Cat.class).addClass(eg.DomesticCat.class)获得SessionFactorySessionFactorysessions=cfg.buildSessionFactory();进行数据存取等操作Sessionsess=sessions.openSession(conn);//startanewtransaction(optional)Transactiontx=sess.beginTransaction();DomesticCatpk=newDomesticCat();pk.setColor(Color.TABBY);pk.setSex('F');pk.setName("PK");pk.setKittens(newHashSet());pk.addKitten(fritz);sess.save(pk,newLong(1234));sess.flush();//forcetheSQLINSERTsess.refresh(cat);//re-readthestate(afterthetriggerexecutes)mit();sess.close();使用HQL语言查询Queryq=s.createQuery("fromfooinclassFoowhere=:nameandfoo.size=:size");q.setProperties(fooBean);//fooBeanhasgetName()andgetSize()Listfoos=q.list();需要说明的是:Hibernate产生的所有SQL是运营时产生的,说的更准确一些是在你系统启动时产生。所有我们需要的只是一个包含映射元数据的xml映射文献。xml映射文献可以你手工来维护,也可以通过植入源代码的注释来产生。以上我们简要介绍了Hibernate的基本特点及使用方法,具体内容请参看附录B。3、动态bean技术使用动态bean技术的理由:我们不只一次抱怨信息系统中数据项变化不定,无法设计和实现JavaBeans。我们也不只一次作过这样的事情:数据项增长或减少了,我需要修改信息系统以求适应。比如我们按照某个公司的规定设计出了2023个Bean来满足该公司对信息系统中业务数据模型的需要,过了一定期间后,他们的业务发生了一定的变化,要对数据模型扩充一部分数据项,可想而知会有多么辛劳。动态beans技术就是为解决此类问题而生,它为解决由于数据项变化带来的设计和实现的变更提供了技术基础。动态bean技术重要概念:一个Bean属性的定义完全取决于有无访问者方法:设立器(setXXX())和获取器(getXXX()),而与在类定义中有无显示说明字段毫无关系。为了使Beans能确认一个属性,其设立器(setXXX())和获取器(getXXX())必须遵循下列命名规则:一个属性名在访问方法中必须以大写字母开头;在其它地方以小写字母开头。扩展javaBean属性机制:定义了五种属性访问策略,使得属性的访问代码像脚本同样在运营时决定,此外一个进步就是它支持List和Map属性的元素属性,也就是扩展javaBean属性机制它不把一个Bean的某个List和Map成员当作一个整体属性,而是动态地把这个List和Map成员的元素当作属性,这样无疑提供了一种无限扩展Bean属性的能力。Common-beanutils1.6中的propertyUtils实用类使用Java语言的内省反射功能实现扩展属性的设立器和获取器。propertyUtils定义了引用一个特定Javabean属性的五种格式:简朴属性,格式beanNpNpName标记了JavaBeanbeanName的一个属性,这个属性的获取器和设立器的方法是通过JavaBean的标准内省功能决定的。假如要改变简朴属性的值,必须要有设立器操作,可以想象成类似调用beanName.[getpropName()|setpropName(value)];嵌套属性,格式beanNpNpNpName3。像简朴属性同样,第一个propName1元素被用来选择一个属性获取器方法,在这个方法返回的对象上使用propName2的获取器方法返回下一个对象,最后这个对象的属性propName3被访问或设立,可以想象成类似调用beanName.getpropName1().getpropName2().[getpropName3()|setpropName3(value)];索引属性,格式beanNpName[index]。属性propName1可以是一个数组,java.util.List或者JavaBeanbeanName有索引属性获取器和设立器操作。bean只需propName的获取器方法,可以想象成类似调用beanName.[getpropName(index)|setpropName(index,value)];映射属性,格式beanNpName(key)。propName是一个java.util.Map实现。bean只需propName的获取器方法,可以想象成类似调用beanName.getpropName().[get("key")|set("key",value);组合属性,格式beanNpNpName2[index].propName3(key)。动态bean:动态bean具有动态属性,也就是说可以由程序运营时构造bean的属性,而不是像标准的javaBean在编译时决定一个bean的属性。定义和访问一个动态bean的环节如下:定义一个动态属性Dynaproperty数组,动态属性Dynaproperty定义了一个属性的名字和对象类型;用定义好的动态属性数组实例化一个动态类;由动态类返回一个动态bean;可以用propertyUtils访问和设立动态bean的属性。下面是定义和访问动态bean的代码://TestDynaBean.javaimportmons.beanutils.*;importjava.util.*;publicclassTestDynaBean{publicstaticvoidmain(String[]args){ TestBeanbean=newTestBean(); Objectvalue=null; try{ Dynaproperty[]px={ newDynaproperty("subordinate",bean.getClass()), newDynaproperty("firstName",Class.forName("java.lang.String")), newDynaproperty("lastName",Class.forName("java.lang.String")) }; DynaClassdynaClass=newBasicDynaClass("employee",null, px); DynaBeanemployee=dynaClass.newInstance(); propertyUtils.setproperty(employee,"subordinate",bean); propertyUtils.setproperty(employee,"subordinate.listIndexed[0]","dybeanset"); propertyUtils.setproperty(employee,"firstName","Fred"); propertyUtils.setproperty(employee,"lastName","Flintstone"); System.out.println("subordinate.listIndexed[0]:"); System.out.println(propertyUtils.getproperty(employee,"subordinate.listIndexed[0]")); System.out.println("firstName:"+propertyUtils.getproperty(employee,"firstName")); System.out.println("lastName:"+propertyUtils.getproperty(employee,"lastName")); }catch(Exceptione){ System.out.println(e.toString()); }}}从配置文献配置动态bean的动态属性好处在于既能固定又能更改动态Bean的属性,这些属性是这个动态Bean对外界的宣布的"访问协议"。动态属性Dynaproperty的重要构造函数接受两个参数:第一个为属性名称,为字符串性,第二个为属性的类型,为Class类型。从配置文献读取的资料普通为字符串型,我们可以用ClassLoader把配置文献中字符串型的属性类型转化成Class类型的属性类型。下面struts1.1中struts-example.war的formbeans.xml中的片断体现了如何在配置文献中定一个动态bean的动态属性:<form-beanname="logonForm"type="org.apache.struts.validator.DynaValidatorForm"><form-propertyname="username"type="java.lang.String"/><form-propertyname="password"type="java.lang.String"/></form-bean>下面RequestUtils的代码片断体现了如何从字符串表达的属性类型转化成Class型的属性类型:publicstaticClassapplicationClass(StringclassName)throwsClassNotFoundException{//LookuptheclassloadertobeusedClassLoaderclassLoader=Thread.currentThread().getContextClassLoader();if(classLoader==null){classLoader=RequestUtils.class.getClassLoader();}//Attempttoloadthespecifiedclassreturn(classLoader.loadClass(className));}这就是关于动态bean的所有奥秘,RequestUtils类代码片断publicstaticActionFormcreateActionForm就是这样创建动态bean的。三、在BONC-JONE平台上进行开发1、BONC-JONE平台目录说明注意:mon、com.bonc.security包属于开发平台基本支持包,其中的文献不允许开发人员改动。2、如何使用BONC-JONE运营起来将开发平台从sourcesafe拉下来后,只需要将src目录下的bonc_perties文献中boncHome=的途径改为你所下载目录的实际途径,如:boncHome=D:\\DevelopWork\\java\\boncCrm\\exampleroot\\WEB-INF,做了这样的设立后,系统启动时就会到这个目录下去找我们的项目配置文献bonc_config.xml。假如你使用的是Jbuilder,还应当将lib目录下的所有包文献,加入到你工程的RequiredLibraries中。做完以上工作bonc-jone应当就可以正常运营了。3、开发有关规范性规定及典型环节应用的包的组织规则客户关系项目中所有与应用模块相关的包均应在com.bonc.crm包下,假如开发的是其他项目则根据项目名称来定义这个包名称,也许是这样的:com.bonc.sample等。在com.bonc.crm包之下,以模块名称来分包,比如:模块名称是“留言模块”,就要定义一个与其相应的包com.bonc.crm.module.leaveword。在各模块包下再分为bean包(存放Formbean及其他本模块也许要用到的bean)action包(存放Action类)与bussinessmanager业务管理包(存放业务管理接口类),比如:com.bonc.crm.module.leaveword.action、com.bonc.crm.module.leaveword.bean与com.bonc.crm.module.leaveword.bussinessmanager包。在各模块的业务管理包下再定义业务管理实现类包(impl包存放业务管理接口的实现类),比如:com.bonc.crm.module.leaveword.bussinessmanager.impl。包定义的规定:所有小写字母定义。应用开发中重要编写的类的作用Formbean类:建议开发中尽量使用动态Formbean(即根据struts的配置文献生成的动态bean),特殊情况下才写Formbean类。该类是一个ValueObject对象,重要的作用是包装客户端请求,将数据从view层传给Action类,由Action类转给业务解决类进行解决;或者由Action类更改或填充其中的数据,然后将其传给view层来显示。Action类:Action类重要完毕三方面的功能,其一是做登陆及权限验证,其二是做数据校验,其三(也是最重要的)负责完毕与控制有关的功能。需要注意的是尽也许不要此类中包含业务解决功能。业务管理接口类:该类是对业务对象进行操作的抽象,是一个接口,对该业务对象的操作均应通过它来进行。业务管理抽象类:这种类实现或部分实现业务管理接口中定义的方法,业务操作的大部分代码均应当写在这个类中。由于这个类是个抽象类,所以它不可以被实例化。业务管理实现类:这种类是业务管理抽象类的继承类,通常情况下其中无实际代码。应用开发中关键的配置文献的意义及功能web.xml文献:是Web应用最基本的部署描述配置文献。部署Web应用一方面要配置web.xml文献。开发人员需要在Web.xml部署描述文献中配置:有效的部署描述文献必须包含DTD声明:<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN""">web-app标记是部署描述文献的根元素,它的子元素涉及:元素描述icon此元素指定在GUI工具中表达此Web应用的大图标和小图标,包含一个small-icon和一个large-icon元素,可使用GIF或JPEG格式的图像display-name此元素提供在GUI工具中此模块的短名字description此元素提供关于父元素的描述性文本distributable假如在Web应用部署描述中使用该元素,就表达该Web应用可以部署到分布式Servlet容器context-param此元素包含Web应用的Servlet环境的初始参数servlet包含一个servlet的声明性数据servlet-mapping在servlet和url模式间进行映射session-config声明此Web应用的Session参数mime-mapping定义扩展名和mimetype间的映射welcome-file-list包含welcome-file子元素的顺序列表error包含一个错误代码或违例类型与web应用中资源的映射taglib用于描述一个JSP标记库resource-ref包含一个对外部资源的引用声明security-constraint用于为一个或多个Web资源集合指定相应的安全约束login-config用于配置身份鉴定的方法,此应用使用域名,以及通过表单登录机制则需要设立此属性security-role包含使用于web应用中<security-constriant>元素的安全角色的声明env-entry包含应用环境变量的声明ejb-ref用于声明对EJB的引用ServletContext初始化参数:context-param标记的子元素涉及:param-name:参数名param-value:参数值description:参数的描述信息例如:
<context-param>
<param-name>my_context_param_name</param-name>
<param-value>ContextParamValue</param-value>
<description>paramdescription</description>
</context-param>Session配置session-config标记的子元素涉及:session-timeout:session超时时间例如:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>Servlet/JSP定义servlet标记的子元素涉及:icon:在GUI工具中的显示图标servlet-name:servlet名称display-name:在GUI工具中的显示名称description:描述信息servlet-class|jsp-file:servlet类名称;jsp文献的完全途径init-param:初始化参数列表load-on-startup:web应用启动时装载security-role-ref:定义安全引用角色servlet-mapping标记的子元素涉及:servlet-name:servlet名称例如:<servlet>
<icon>
<small-icon>small.gif</small-icon>
<large-icon>largel.gif</large-icon>
</icon>
<servlet-name>my_servlet</servlet-name>
<display-name>my_servlet</display-name>
<description>my_servlet</description>
<servlet-class>com.apusic.test.MyServlet</servlet-class>
<init-param><param-name>my_init_param</param-name><param-value>InitParamValue</param-value><description>paramdescripton</description>
</init-param>
<load-on-startup>1</load-on-startup>
<security-role-ref>
<description>roledescription</description>
<role-name>my_security_role_name</role-name>
<role-link>SecurityRoleLink</role-link>
</security-role-ref></servlet>Servlet/JSP映射url-pattern:servlet映射的URL模板<servlet-mapping>
<servlet-name>my_servlet</servlet-name>
<url-pattern>/my_url_pattern</url-pattern></servlet-mapping>MIME类型映射mime-mapping的子元素涉及:extension:扩展名mime-type:MIME类型例如:<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type></mime-mapping>欢迎文献列表welcome-file-list标记的子元素涉及:welcome-file:作为缺省的欢迎文献名例如:<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file></welcome-file-list>错误页面error标记的子元素涉及:error-code|exception-type:HTTP的错误代码;异常类型location:资源在Web应用中的位置例如:<error>
<error-code>404</error-code>
<location>ErrorPage.jsp</location></error><error>
<exception-type>ExceptionType</exception-type>
<location>ErrorPage.jsp</location></error>安全security-constraint标记的子元素涉及:web-resource-collection:用于区分资源子集和web应用内使用安全约束的这类资源的HTTP方法。如HTTP方法未被指定,安全约束将合用于所有的HTTP方法。auth-constraint:指定允许访问此资源集合的用户角色。在此处使用的角色必须在<security-role-ref>元素中进行定义user-data-constraint:于指出客户端和容器间的数据互换的保护方式login-config标记的子元素涉及:auth-method:用于为Web应用配置身份鉴定机制。作为对使用身份鉴定约束保护的任何Web资源取得访问的先决条件,用户必须使用已配置的身份鉴定机制进行鉴定。此元素的合法值为“BASIC”、“DIGEST”、“FORM”或“CLENT-CERT”realm-name:指定在HTTP基础授权中的域名form-login-config:定义Web应用中使用的登陆页面可被找到的位置security-role标记的子元素涉及:description:描述信息role-name:安全角色的名字例如:<security-constraint>
<web-resource-collection>
<web-resource-name>Name</web-resource-name>
<description>descript</description>
<url-pattern>/security/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>default</role-name>
</auth-constraint></security-constraint><login-config>
<auth-method>BASIC</auth-method>
<realm-name>Default</realm-name></login-config><security-role>
<description>roledesc</description>
<role-name>default</role-name></security-role>标签库配置:Taglib标记的子元素涉及:taglib-uri:统一资源标记符(URI)参数,可以自由命名。taglib-location:标签库描述文献的实际位置。例如:<taglib><taglib-uri>/WEB-INF/BoncTagLib.tld</taglib-uri><taglib-location>/WEB-INF/BoncTagLib.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri><taglib-location>/WEB-INF/struts-bean.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-html.tld</taglib-uri><taglib-location>/WEB-INF/struts-html.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri><taglib-location>/WEB-INF/struts-logic.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri><taglib-location>/WEB-INF/struts-tiles.tld</taglib-location></taglib></web-app>看来web.xml的配置是很多的,但在开发中我们需要进行的配置并不多。在bonc-jone开发平台的web.xml中基本不需要开发人员变动已有的配置。唯一需要由开发人员进行的配置是增长各模块的struts配置文献途径,例如:<web-app><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.tiles.ActionComponentServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-yourmoduel.xml,/WEB-INF/struts-config-other.xml</param-value></init-param>…</servlet>…</web-app>Struts配置文献:是Struts框架的中心配置文献,通俗地说是Struts应用的地图。以下是Struts配置文献的基本结构:<?xmlversion="1.0"encoding="ISO-8859-1"?><!--StrutsConfigXML-SampleStrutsApp--><!--=====================================--><!--AutoGeneratedfrom:c:\dev\javaworld\app\sample.vsd--><!--AutoGeneratedon
:02-18-202323:05:47--><!--AutoGeneratedby
:StrutsGUIv2.11
(c)2023Alien-Factory--><!--
:See''fordetails--><!--GETYOURSTICKYFINGERSOFF!i.e.Donotedit.--><!DOCTYPEstruts-configPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.0//EN"
""><struts-config>
<!--======================FormBeanDefinitions===================-->
<form-beans><form-beanname="testForm"type="org.apache.struts.action.DynaActionForm"dynamic="true"><form-propertyname="testproperyt"type="java.lang.String"/> </form-bean>
</form-beans>
<!--=================GlobalForwardDefinitions===================-->
<global-forwards>
</global-forwards>
<!--=======================ActionDefinitions=====================-->
<action-mappings><action
path="/Login"
type="com.agilquest.onboard.presentation.actions.LoginAction"name=”testForm”validate="true"scope="request">
<description>Authenticatesandauthorizesauser.</description><forwardname="success"path="tile.loginPage"/></action>
</action-mappings></struts-config>开发人员进行开发时重要是配置form-beans中的form-bean及action-mappings中的action。注意:在bonc-jone开发平台中,WEB-INF目录下的struts-config.xml配置文献是不允许开发人员更改的。开发人员应当将自己开发的模块独立形成一个struts配置文献,按照struts-config-模块名称.xml的方式来命名,并将其加入web.xml的配置中,具体方法见web.xml的配置。tiles-defs.xml配置文献:是使用tiles框架及其标签库技术需要配置的文献。以下是tiles-defs.xml配置文献的基本结构:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEtiles-definitionsPUBLIC"-//ApacheSoftwareFoundation//DTDTilesConfiguration1.1//EN"""><!--DefinitionsforTiles--><!--Thisfilecontainsdefinitionscommontoallstrutsmodule.Inparticular,itcontainsthemainlayoutandthecommonmenus.Thereisalsothemainpageasaportal.--><tiles-definitions> <!--===================================================--> <!--Masterdefinitions--> <!--==================================================--> <!--Pagelayoutusedasrootforallpages.--> <definitionname="rootLayout"path="/layouts/rootLayout.jsp"> <putname="checkMessage"value="/do/checkMessagenews"/> <putname="titleString"value="CHANGE-ME"/> <putname="topBanner"value="/app/menu/topbar.jsp"/> <putname="firstMenus"value="/do/queryMenus?selfAction=queryFirstMenus"/> <putname="secondMenus"value="/do/queryMenus?selfAction=querySecondMenus"/> <putname="main"value="CHANGE-ME"/> <putname="footer"value="/app/menu/footer.jsp"/> </definition> <!--====================================================--> <!--Pagedefinitions --> <!--===================================================--> <definitionname="tile.SearchVip"extends="rootLayout"> <putname="titleString"value="大客户查询"/> <putname="main"value="/app/InfoManager/VIPInfo/searchvipForm.jsp"/> </definition></tiles-definitions>当开发人员完毕一个重要的功能页面后,想将其按照应用的布局嵌入到工作区中时,使用上述的定义方法即可达成目的。tile.SearchVip相称于是一个应用了tiles模板的一个jsp,但与真正的jsp不同的是必须使用findForward方法来定向到它。bonc-cofig.xml配置文献:是应用使用的参数、业务对象等的真正属于bonc-jone平台自身的配置文献。定义属性名称格式为:.is.blah=value在这个文献中应存为:<prop><name><is><blah>value</blah></is></name></prop>其所有的属性必须在"bonc"元素下。这个文献要在bonc_perties文献所定义的boncHome目录下。bonc_perties文献要在应用的classpath中。开发人员需要在这个文献中做的重要配置举例如下:定义业务管理接口的实现类<BusinessManager><VIPInfoManager>com.bonc.example.module.Infomanager.vipinfo.businessmanager.impl.VIPInfoManager_cnc</VIPInfoManager></BusinessManager>定义业务对象<BusinessObj> <VIPInfo_inx><bean-property-hibernatename="bm_inx_vip"type="com.bonc.hibernate.persistenceobj.BmInxVip"/> </VIPInfo_inx> <VIPInfo><bean-property-hibernatename="bm_info_vip"type="com.bonc.hibernate.persistenceobj.BmInfoVip"/><bean-property-nestingname="inx"type="InfoManager.VIPInfo.BusinessObj.VIPInfo_inx"/> <bean-propertyname="cust_new_name"type="java.lang.String"initial=""/> </VIPInfo></BusinessObj>应用开发中的典型环节、注意事项及规定以下我们通过一个例子来说明应用开发中典型环节、注意事项及规定。假设数据库中已建好一张这样的数据表:表名:bm_Info_Test有三个字段:编码id(varchar)、姓名name(varchar)、年龄age(number(2,0))我们可以使用Hibernate的工具自动生成(生成方法见第四章)BmInfoTest.java文献及BmInfoTest.hbm.xml文献。注意包途径必须为:com.bonc.hibernate.persistenceobj。一方面我们要做一个入口页面,这个页面规定使用者输入age值,也即数据库表bm_Info_Test的age的值。输入项不可认为空。如不为空,就根据这个条件查出所有大于等于输入值的记录;如为空,就在这个页面上显示规定使用者输入条件的提醒信息。在struts-cofig-test.xml文献中,我们定义一个动态formbean(注意bean的动态属性必须所有使用小写字母,要与BmInfoTest.java文献及BmInfoTest.hbm.xml文献取名完全一致):<form-beanname="ageForm"type="org.apache.struts.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年喀什b2货运资格证多少道题
- 劳动合同范本手写
- 单位洗车合同范本
- 六险一金 合同范本
- 个人建筑仓库合同范本
- 劳务中介劳务合同范本
- 东城食堂承包合同范本
- 住宿酒店前台合同范本
- 出售二手房贷款合同范本
- 临沂工厂转让合同范本
- 2025包头青山宾馆有限公司面向社会公开招聘18人笔试参考题库附带答案详解
- 2025年业务员工作总结及工作计划模版(3篇)
- 2025至2030年中国毛绒卡通玩具数据监测研究报告
- 2024年连云港市赣榆区区属国企对外招聘笔试真题
- 海南省海口市2024-2025学年八年级上学期期末考试数学试题(含答案)
- 2025年度智能充电桩场地租赁合同范本3篇
- 2025年注射用赖氮匹林项目可行性研究报告
- 2025江西吉安市新庐陵投资发展限公司招聘11人高频重点提升(共500题)附带答案详解
- 技术推广服务合同模板五篇
- 2025年山东出版集团招聘笔试参考题库含答案解析
- 水泥基自流平地面技术交底
评论
0/150
提交评论