web编程技术.doc_第1页
web编程技术.doc_第2页
web编程技术.doc_第3页
web编程技术.doc_第4页
web编程技术.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、通配符问题 (1)使用通配符可以优化action的配置。(2)约定优于配置。约定的如果好,可以使action配置非常的简洁。 (3)寻找action的路径匹配顺序。 /Student1_success.jsp /1_2_success.jsp 2、动态方法调用DMI如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法。如下: public class HelloWorldActionprivate String message;.public String execute() throws Exceptionthis.message = 我的第一个struts2应用;return success;public String other() throws Exceptionthis.message = 第二个方法;return success;要访问action的other() 方法,可以这样调用: ./helloworld!other 通常不建议大家使用动态方法调用,我们可以通过常量struts.enable.DynamicMethodInvocation 关闭动态方法调用。 3、包含模块配置文件在大部分应用里,随着应用规模的增加,系统中Action数量也大量增加,导致struts.xml 配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。 4、默认action 用于解决地址链接错误问题 /default.jsp /ok.jsp 5、路径问题 在struts2中超级链接通常都采用绝对路径,而不使用相对路径,这样便于链接的实现。6、结果类型struts2中提供了多种结果类型,如: dispatcher(默认值内部转发/服务器跳转)、 redirect(浏览器跳转) 、chain、 redirectAction 、freeMarker等。 /r1.jsp /r2.jsp r1 r2 7、全局结果集当许多action都有共同的结果时,如果每个package都存在一个相同结果,会使得struts.xml比较臃肿,所以使用全局的结果集。一个包内的全局结果集可以通过包的继承而被其它包使用。这样做的好处是:通用的结果集不用多次配置,减少struts.xml的配置量。 /default.jsp .8、动态参数传递参数结果集(向结果集传参数):用在redirect的时候一次request只有一个valueStack。9、用域模型接受参数1、当向action中传递参数时,struts会自动的new一个对象。因此在action中不用new对象。2、Struts2中的MVCM-模型:一些对象的模型V-试图:用来显示的页面C-控制:编写的action10、动态结果集 $用在配置文件struts.xml里从值栈中取数据。11、AOP 简介l AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.l AOP 的主要编程对象是切面(aspect) spkt , 横切关注点抽象(模块化)即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。l 在应用 AOP 编程特点: 仍然需要在定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里.l 为什么用AOP: 每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级 业务模块更简洁, 只包含核心业务代码. AOP的目的是实现与业务逻辑无关的业务编写一个切面类。12、action接收用户参数用于解决地址链接错误问题 /default.jsp 全局action的- /main.jsp - /index.jsp - /user_success.jsp /user_error.jsp - - /admin.jsp /login login Hibernate运行机制13、HQL基础HQL 查询依赖于Query类,每个Query 实例对应一个查询对象。使用HQL 查询可按如下步骤进行:(1)获取HibernateSession对象;(2)编写HQL语句;(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;(4)如果HQL语句包含参数,调用Query 的setXxx方法为参数赋值;(5)调用Query对象的list等方法遍历查询结果。14、ORM简介 对象/关系映射ORM(Object-Relation Mapping) 对象与对象之间的关系对应到数据库表与表之间的关系的一种模式。 简单地说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。 对象和关系数据是业务实现的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在着关联和继承关系。而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。 一般的ORM包括四个部分: 对持久类对象进行CRUD操作的API(CRUD操作API) 用来规定类和类属性相关查询的语言或API(查询语言或API) 规定mapping metadata的工具(映射机制) 让ORM实现同事务对象一起进行脏数据检查(dirty checking)、延迟关联抓取 (lazy association fetching)和其他优化操作的技术(实现技术)15、Query接口Query query=session.createQuery(“from Kcb where kch=100”);例如以下语句:Query query=session.createQuery(from Kcb where kch=?);在后面设置其值:query.setString(0, 要设置的值);上面的方法是通过“?”来设置参数,还可以用“:”后跟变量的方法来设置参数,如上例可以改为:Query query=session.createQuery(from Kcb where kch=:kchValue);query.setString(kchValue,要设置的课程号值);或者:query.setParameter(0, 要设置的值);Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。例如:Query query=session.createQuery(from Kcb where kch=198);List list=query.list();16、实体对象生命周期实体对象的生命周期有以下3种状态。1transient(瞬时态)瞬时态,即实体对象在内存中的存在,与数据库中的记录无关。如下面的代码:2persisent(持久态)在这种状态下,实体对象的引用被纳入Hibernate实体容器中加以管理。处于持久状态的对象,其变更将由Hibernate固化到数据库中。例如下面的代码:Student stu=new Student();Student stu1=new Student();stu.setSnumber(081101);stu.setSname(李方方);stu.setSage(21);stu1.setSnumber(081102);stu1.setSname(程明);stu1.setSage(22);/ 到此为止,stu和stu1均处于瞬时态Transaction tx=session.beginTransaction();/ 通过save()方法,stu对象转换为持久态,由Hibernate纳入实体管理容器,而stu1仍然处于瞬时态session.save(stu);/ 事务提交之后,数据库表中插入一条学生的记录,对于stu1则无任何操作mit();Transaction tx2=session.beginTransaction();stu.setSname(李方);stu1.setSname(程明明);mit();虽然这个事务中没有显示调用session.save()方法保存stu对象,但是由于stu为持久态,将自动被固化到数据库, 因此数据库的学号为“081101” 学生记录的姓名已被更改为“李方”,此时stu1仍然是一个普通Java对象,对数据库未产生任何影响。处于瞬时态的对象,可以通过Session的save()方法转换成持久状态。同样,如果一个实体对象由Hibernate加载,那么,它也处于持久状态。例如下面的代码:/ 由Hibernate返回的持久对象Student stu=(Student)session.load(Student.class,new Integer(1);3Detached(脱管状态)处于持久态的对象,其对应的Session实例关闭之后,此对象就处于脱管状态。Session实例可以看做是持久对象的宿主,一旦此宿主失效,其从属的持久对象进入脱管状态。如下面的代码:/ stu处于瞬时态Student stu=new Student();Student stu1=new Student(); stu.setSnumber(081101); stu.setSname(李方方); stu.setSage(21); stu1.setSnumber(081102); stu1.setSname(程明); stu1.setSage(22); Transaction tx=session.beginTransaction(); / stu对象由Hibernate纳入管理容器,处于持久状态 session.save(stu); mit(); / stu对象状态为脱管态,因为与其关联的session已经关闭 session.close();17、 Hibernate事务管理 1基于JDBC的事务管理 Hibernate是JDBC的轻量级封装,本身并不具备事务管理能力。在事务管理层,Hibernate将其委托给底层的JDBC或JTA,以实现事务管理和调度功能。 在JDBC的数据库操作中,一项事务是由一条或多条表达式组成的不可分割的工作单元,通过提交commit()或回滚rollback()来结束事务的操作。 将事务管理委托给JDBC进行处理是最简单的实现方式,Hibernate对于JDBC事务的封装也比较简单。如下面的代码: Session session=sessionFactory.openSession(); Transaction tx=session.beginTransaction(); session.save(room); mit(); 从JDBC层面而言,上面的代码实际上对应着: Connection cn=getConnection; cn.setAutoCommit(false); / JDBC调用相关的SQL语句 mit(); 下面的代码不会对数据库产生任何效果: session session=session.Factory.openSession(); session.save(room); session.close(); 如果要使代码真正作用到数据库,必须显示地调用Transaction指令: Session session =sessionFactory.openSession(); Transaction tx=sessio.beginTransaction(); session.save(room); mit(); session.close(); 2基于JTA的事务管理概念 JTA(Java Transaction API)是由Java EE Transaction Manager去管理的事务。其最大的特点是调用UserTransaction接口的begin、commit和rollback方法来完成事务范围的界定、事务的提交和回滚。JTA可以实现统一事务对应不同的数据库。 JTA主要用于分布式的多个数据源的两阶段提交的事务,而JDBC的Connection提供单个数据源的事务。后者因为只涉及一个数据源,所以其事务可以由数据库自己单独实现。而JTA事务因为其分布式和多数据源的特性,不可能由任何一个数据源实现事务。因此,JTA中的事务是由“事务管理器”实现的。它会在多个数据源之间统筹事务,具体使用的技术就是所谓的“两阶段提交”。 3锁 业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,希望对某个结算时间点的数据进行处理,而不希望在结算过程中(可能是几秒,也可能是几个小时),数据再发生变化。此时,需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制就是所谓的“锁”,即给选定的目标数据上锁,使其无法被其他程序修改。 Hibernate支持两种锁机制,悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)。 18 DAO模式 DAO是Data Access Object数据访问接口,既然是对数据的访问,顾名思义就是与数据库打交道。 为了建立一个健壮的Java EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储,这就是DAO模式。Struts2 自定义拦截器 截拦器是Struts2中最重要的概念之一,Struts中有80%的功能都通过截拦器实现 截拦器意义: 提供更高层次的解耦,无须侵入框架本身便可以添加新的功能. 截拦器是AOP的一种实现,底层通过动态代理模式完成 将一些功能放到截拦器,可以降低Action的复杂性,提高重用性. 截拦器的典型使用 封装请求参数 文件上传 异常处理 . 拦截器是Action的截拦器是拦截Action动作的! 如果没有为Action指定截拦器,则使用defaultStack作为默认截拦器 下面的功能由默认截拦器提供 请求参数封装 文件上传 类型转换异常处理 一旦为Action指定了截拦器,则默认截拦器不再起作用,必须显示指定默认截拦器. 截拦器是一个继承自AbstractInterceptor抽象类或实现Interceptor接口的类,可以重写的方法: public void init():执行初始化动作 public void destroy():执行销毁动作 String intercept(ActionInvocation invocation):执行截拦动作 参数invocation:包含了Action的引用, invocation.invoke()方法用于将控制权转给下一个截拦器或者调用Action的execute()方法. 返回值为逻辑视图AbstractInterceptor为init和destroy方法提供了默认实现.要自定义拦截器需要实现erceptor.Interceptor接口: public class MyInterceptor implements Interceptor public void destroy() public void init() public String intercept (ActionInvocation invocation) throws Exception System.out.println(进入拦截器);if(session里存在用户)String result = invocation.invoke();elsereturn “logon”;/System.out.println(返回值:+ result);/return result; 如果Action配置了多个截拦器,截拦器的执行顺序与配置顺序相同 截拦器可以注入属性值,在struts.xml文件中通过value实现,作用于interceptor或interceptor-ref. 通过intercept的返回值,可以改变请求的流程控制(*). 一般来说, invocation.invoke()方法总是要调用的. 如果希望包下的所有action都使用自定义的拦截器,可以通过把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。 将多个截拦器组合成一个截拦器栈配置使用19、Struts2 国际化准备资源文件,资源文件的命名格式如下: baseName_language_perties baseName_perties baseNperties 其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如: 中国大陆: baseName_zh_CN.properties 美国: baseName_en_US.properties 对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下: native2ascii 源文件.properties 目标文件.properties5.1 配置全局资源文件与输出国际化信息现在两个资源文件(SRC下): 第一个存放中文:itclass_zh_CN.properties 内容为:user=黎明 第二个存放英语(作为默认语言): itclass_en_US.properties 内容为: user=liming使用上面的资源文件,在struts.xml中使用常量加载全局资源文件如下: itclass为资源文件的基本名。 l 在JSP页面中使用标签输出国际化信息: ,name为属性文件中的keyl 在Action类中,可以继承ActionSupport,使用getText()方法,该方法的第一个参 数用于指定属性文件中的key。 l 在表单标签中,通过key属性指定属性文件中的key,如: 国际化输出带占位符的国际化信息属性文件中的内容如下: welcome=0,你好,欢迎来到1在jsp页面中输出带占位符的国际化信息 zhangsan it课堂在Action类中获取带占位符的国际化信息,可以使用getText(String key, String args)或getText(String aTextName, List a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论