07 2012 档案

摘要:在使用Hibernate的过程我们会遇到多个人对同一数据同时进行修改,这个时候就会发生脏数据,造成数据的不一致性。为了避免更新数据的丢失,Hibernate采用锁机制。 Hibernate提供了两种锁机制:悲观锁和乐观锁。 悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改。 乐观锁:在对数据进行修改的时候,对数据采用版本号或者时间戳等方式来比较,数据是否一致性来实现加锁。一、悲观锁 悲观锁是依靠数据库提供的锁机制。Hibernate是通过使用数据库的forupdate子句实现了悲观锁机制。 Hibernate有如下五种加锁机制 1、LockMode.NONE. 阅读全文
posted @ 2012-07-17 11:40 chenssy 阅读(1194) 评论(0) 推荐(0) 编辑
摘要:Hibernate执行持久化过程中,应用程序无法参与其中。所有的数据持久化操作,对用户都是透明的。 通过事件框架,Hibernate允许应用程能响应特定的内部事件,从而允许实现某些通用的功能或者对Hibernate功能进行扩展。 Hibernate的事件机制框架由两个部分组成: 1、拦截器机制:对于特定动作拦截,回调应用中的特定动作 2、事件系统:重写Hibernate的事件监听器。一、拦截器 Interceptor接口提供了从会话回调应用程序的机制,这种回调机制可以允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其属性。 通过Interceptor接口,可以在数据进. 阅读全文
posted @ 2012-07-17 11:37 chenssy 阅读(562) 评论(0) 推荐(0) 编辑
摘要:缓存的作用主要是用来提高hibernate的性能,可以简单的理解成一个map。使用缓存涉及到三个操作:把数据放入缓存、从缓存中取数据、删除缓存中的无效数据。一、一级缓存一级缓存是Session级共享的。对于一级缓存而言,所有经过Session操作的实体,不管是使用save()、upadate()或者saveOrUpdate保存一个对象,还是使用load()、get()、list()、iterate()、scroll()方法获得一个对象时,该对象都将被放入一级缓存中。1 session = HibernateUtil.getSession();2 ... 阅读全文
posted @ 2012-07-17 11:35 chenssy 阅读(656) 评论(0) 推荐(0) 编辑
摘要:懒加载是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。一、load方法的懒加载先看如下代码段 1 public class UserManager { 2 3 public static void main(String[] args) { 4 Users user = new Users(); 5 user.setBirthday(new Date()); 6 7 Name name = new Name(); 8 name.setFirstName(... 阅读全文
posted @ 2012-07-17 11:32 chenssy 阅读(781) 评论(0) 推荐(0) 编辑
摘要:Hibernate3提供了一种创新的方式来处理具有“显性(visibility)”规则的数据,那就是使用Hibernatefilter。Hibernatefilter是全局有效的、具有名字、可以带参数的过滤器,对于某个特定的Hibernatesession您可以选择是否启用(或禁用)某个过滤器。 一旦启用了数据过滤器,则不管是数据查询,还是数据加载,该过滤器将自动作用于所有数据,只有满足过滤条件的记录才会被选出来。 过滤器条件相当于定义一个非常类似于类和各种集合上的“where”属性的约束子句,但是过滤器条件可以带参数。应用程序可以在运行时决定是否启用给定的过滤器,以及使用什么样的参数值。过. 阅读全文
posted @ 2012-07-17 11:31 chenssy 阅读(563) 评论(0) 推荐(0) 编辑
摘要:条件查询一般是通过以下三个类完成的: 1、Criteria:代表一次查询 2、Criterion:代表一个查询条件 3、Restriction:代表查询条件的工具类 执行条件查询的步骤如下: 1、获得Hibernate的Session对象 2、以Session对象创建Criteria对象3、使用Restriction的静态方法创建Criterion查询条件 4、向Criteria查询中添加Criterion查询条件 5、执行Criterion的list()方法或者uniqueResult()方法返回结果集 示例: 1 public void query(){ 2 Se... 阅读全文
posted @ 2012-07-17 11:29 chenssy 阅读(514) 评论(0) 推荐(0) 编辑
摘要:Hibernate除了支持HQL查询外,还支持原生SQL查询。 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。 执行SQL查询步骤如下: 1、获取HibernateSession对象 2、编写SQL语句 3、通过Session的createSQLQuery方法创建查询对象 4、调用SQLQuery对象的addScalar()或addEntity()方法将选出的结果与标量值或实体进行关联,分别用于进行标量查询或实体查询 5、如果SQL语句包含参数,调用Query的setXxxx方. 阅读全文
posted @ 2012-07-17 11:24 chenssy 阅读(905) 评论(0) 推荐(0) 编辑
摘要:Hibernate提供了强大的查询系统,使用Hibernate有多种查询方法可以选择:可以使用Hibernate的HQL查询,也可以使用条件查询,甚至可以使用原生的SQL查询语句。其中HQL查询时Hibernate配置的功能强大的查询语句。HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。一、HQL查询HQL的语法和SQL很相似,但是HQL是一种面向对象的查询语句,它的操作对象是类、实例、属性等,而SQL的操作对象是数据表、列等数据库对象。由于HQL是完全面向对象的查询语句,因此可以支持继承、多态等特性。HQL查询依赖于Query类,每一个Query实例对 阅读全文
posted @ 2012-07-17 11:20 chenssy 阅读(6407) 评论(0) 推荐(3) 编辑
摘要:Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象,将被自动转换为对数据库的操作。但存在这样一个问题,如果我们想同时更新100000条记录,是不是要逐一加载100000条记录,然后依次调用setter方法。采用这种方法实在是太繁琐了,而且严重影响了数据的访问性能。Hibernate提供的批量处理的方案来解决这个问题。一、批量插入 如果我们需要插入100000条记录,通过hibernate可能会采用如下的方式处理: 1 Session session = HibernateUtil.getSession(); 2 Tran... 阅读全文
posted @ 2012-07-17 11:08 chenssy 阅读(990) 评论(0) 推荐(0) 编辑
摘要:对于面向对象的程序设计语言,继承、多态是两个最基本的概念。Hibernate的继承映射可以理解两个持久化类之间的继承关系。 Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hibernate的多态查询都可以很好的运行。 假设有四个对象:Department、Employee、Skiller、Sales。他们四个对象存在如下关系: 从上面的关系可知:Employee与Department之间存在N-1的关联关系。Skiller和Sales都是Employee的子类。下面是这四个类的代码: Department1 public class Department {2 pri... 阅读全文
posted @ 2012-07-17 11:05 chenssy 阅读(565) 评论(0) 推荐(0) 编辑
摘要:先看User持久化类: 1 public class Users { 2 private int id; 3 private Date birthday; 4 private Name name; 5 6 public int getId() { 7 return id; 8 } 9 10 public void setId(int id) {11 this.id = id;12 }13 14 public Date getBirthday() {15 return birthd... 阅读全文
posted @ 2012-07-17 11:00 chenssy 阅读(339) 评论(0) 推荐(0) 编辑
摘要:四、N—N关联关系1.1单向N-N的关联单向的N-N关联和1-N关联的持久化类完全一样,控制关系的一端需要增加一个set集合属性,被关联的持久化实例以集合的形式存在。 N-N关联必须使用连接表,N-N关联与有连接表的1-N关联非常相似,只需要去掉<many-to-many.../>元素的unique="true"即可。其他的配置和1-N关联一样。 由于与1-N关联非常相似,这里就不演示了。1.2双向N-N的关联 对于双向的N-N关联,我们只需要转换为两个1-N关联模型即可。双向N-N关联两端都需要使用set集合属性,两端都增加对集合属性的访问。双向N-N同样必须 阅读全文
posted @ 2012-07-17 10:59 chenssy 阅读(435) 评论(0) 推荐(0) 编辑
摘要:三、1—N 对于1-N而言,它的持久化类发生了一点改变,持久化类里需要使用集合属性。因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现。1、单向1-N关联 对于单向的1-N关联关系,只需要在1的一端增加Set类型的属性,该属性记录当前实体的关联实体。 同样以员工-部门为例(Employee-->Department)。两个持久化类如下: Department 1 public class Department { 2 private Integer id; 3 private String name; 4 private Set<Employee> e... 阅读全文
posted @ 2012-07-17 10:56 chenssy 阅读(581) 评论(0) 推荐(1) 编辑
摘要:二、1—1 无论是单向1-1映射关联,还是双休1-1映射关联,都有三种映射策略:基于主键、基于外键、采用连接表。 1、单向1-1映射关联 1.1、基于主键的单向1-1映射关联 对于基于主键的单向1-1关联,基于主键关联的持久化类不能拥有自己的主键生成器策略,它的主键由关联实体来负责生成。 是根据他自己的person属性来获得的。即他通过自身的一个getPerson()方法来获得Person对象。然后通过Person对象中的getID()方法获得id,然后赋值给自身id。这样就可以不需要自己来生成id。 采用基于主键的1-1关联时,应使用<one-to-one.../>元素来映射关联 阅读全文
posted @ 2012-07-17 10:52 chenssy 阅读(573) 评论(0) 推荐(1) 编辑
摘要:我们所生活的世界很少有事物是孤立存在的,每个事物必然会存在着与它相关联的事物。在面向对象设计当中,关联关系是非常重要的。关联关系一般可以分为以下两种: 单向关系:只需单向访问关联端 双向关系:关联的两端都可以互相访问 单向关系可分为:1—N、1—1、N—1、N—N 双向关系可分为:1—1、1—N、N—N 下面就上面的每种关联映射分别讲解:一、N—1关联映射1、单向N—1关联 1.1、无连接表的N-1关联(基于外键的N-1关联) 对于单向的N—1关联而言只需要从N的一端可以访问1的一端。为了让这个两个持久化类支持这种关联映射,程序应该在N的一端的持久化类中增加一个熟悉,该属性引用1一端的关联实. 阅读全文
posted @ 2012-07-17 10:46 chenssy 阅读(493) 评论(0) 推荐(2) 编辑
摘要:Hibernate采用低侵入式的设计,它对持久化类几乎不做任何要求。也就是说hibernate操作的持久化类基本都是普通java对象。对于持久化类的要求这里不做说明。只就持久化对象的状态和各个状态之间的转换。 Hibernate持久化对象有如下几种状态: 1、瞬态:对象有new操作符创建,但是并没与HibernateSession关联。处于瞬态的对象是不会被持久化到数据库中的。如果程序中失去了瞬态对象的引用,瞬态对象就会被垃圾回收机制销毁。 2、持久化:持久化实力在数据库中有对应的记录,并且拥有一个持久化标识。对于持久化对象,它必须要与指定的HibernateSession关联起来。 3、托. 阅读全文
posted @ 2012-07-17 10:43 chenssy 阅读(421) 评论(0) 推荐(0) 编辑
摘要:上一篇波博客我部署的第一个hibernate工程,现在就这个工程里面的细节来分析下。 一、POJO类 POJO类即持久化对象。他是完成hibernate持久化操作。说本质点就是简单的java类。但是并不是所有的java类都可以是POJO的。对于这个java类它是有如下几个限制:1、它必须存在默认的构造方法 如果存在带参数的构造方法,那么hibernate就不能管理这个pojo了。2、有无意义的标示符id 这个是可选的。这个id和表里面的主键是相对应的。一般来说hibernate是建议有这个属性id的。因为这样hibernate操作就会更加方便和高效率。3、这个类应该是非final的 如果某个. 阅读全文
posted @ 2012-07-17 10:41 chenssy 阅读(411) 评论(0) 推荐(1) 编辑
摘要:在介绍hibernate之前我们有必要的简单了解一下ORM 目前的主流数据库依然是关系型数据库,但是java则是面向对象的编程语言,当把两者结合在一起使用时非常麻烦。这时便催生了ORM框架的产生。ORM,全称为Object/RelationMapping,即对象/关系数据库映射,我们可以把他理解成一种规范。它完成面向对象的编程语言到关系数据库的映射。因此,我们可以把ORM框架作为面向对象编程语言到数据库之间的桥梁。当我们采用ORM框架之后,应用程序不再直接访问数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转化为底层的SQL操作。所以我们可以把ORM的作用理解. 阅读全文
posted @ 2012-07-17 10:34 chenssy 阅读(698) 评论(0) 推荐(1) 编辑
摘要:在SQL/92标准可以使用USING子句对连接条件进行简化,但是只有在查询满足以下两个条件时才能给使用USING进行简化:1、查询必须是等连接的2、等连接中的列必须是同名如:商品表goods表和商品类型表category表中goods的外键和category的主键相同:categoryid而且是等连接,这里可以使用using1 select goodsname,categoryname2 from goods inner join category3 using(categoryid)在使用using是需要注意以下几个问题1、在select子句中只能指定该列... 阅读全文
posted @ 2012-07-13 12:48 chenssy 阅读(515) 评论(0) 推荐(0) 编辑
摘要:游标是从数据库中提取出来一临时表的形式存放在内存中的数据。可以把游标看作是内存的SQL工作区域,游标名称相当于该区域的句柄。通过该句柄可以有效地控制游标,从而实现对数据的操作。所以对游标的操作实际上就是对数据库库的间接操作。 1.1游标的定义 定义游标的格式如下: CURSOR游标ISSELECT语句; 例如:把数据表中emp中部门号为20的员工定义为游标:1 CURSOR exce_emp is select * from scott.emp where deptno=20; 定义游标后,我们就可以使用游标了。但是要对游标进行操作我们必须先打开游标: Open游标名; 打开游标实际上是从数. 阅读全文
posted @ 2012-07-13 12:47 chenssy 阅读(559) 评论(3) 推荐(1) 编辑
摘要:一、PL/SQL程序流程控制上面的结构与其他的高级语言程序一样,就不做介绍了。下就条件结构和循环结构说明。 1)IF条件控制句 1.1IF...THEN语句 其语法是: IFpTHEN 基本语句段; ENDIF; 例如:declare flag1 integer := 1; flag2 integer := 2;begin if flag1 < flag 2 then dbms_output.put_line('Flag1<flag2'); end if;end;注意:上面的IF与ENDIF必须成对出现 1.2IF...THEN...ELSE语句 该语句用于需要在两 阅读全文
posted @ 2012-07-13 12:44 chenssy 阅读(648) 评论(3) 推荐(3) 编辑
摘要:历时三个星期的时间终于把Struts2给看完了。中间断断续续的学习,在这个过程中学到了很多东西,也真正的明白了时间是挤出来的。大三了课程越来越来多了,有自己学校的课程要学习,又是各种各样的实验,时间的真的是太紧了。这个时间,利用一切的空余时间来学习编程。这个过程的苦和乐真的只有经历了才明白... 不多说了,下面是对这三个星期学习Struts2的知识总结:一、Struts2应用的开发步骤 1、首先要先下载Struts2的jar包,将必须的类库放入到Web应用下的WEB-INF/lib路径下。 2、配置web应用的web.xml配置文件,配置Struts2的核心Filter 3、定义处理用户请求. 阅读全文
posted @ 2012-07-13 12:33 chenssy 阅读(1087) 评论(1) 推荐(3) 编辑
摘要:PL/SQL是一种高效的事物处理语言,它具有如下优点 1、支持SQL 2、支持面向对象的编程方法 3、更好的性能和更高的效率 4、编写方便 5、与Oracle高度集成 6、安全性好一、PL/SQL变量和基本数据类型 1、PL/SQL变量的定义 基本数据类型变量的定义方法如下: 变量名类型标识符[:=值]; 如:Strvarchar2[100]:='中国'; 也可以使用关键字default来代替赋值符。 strvarchar2[100]default'中国'; 注意:赋值符合中的冒号和等号是不能分开的;2、基本数据类型三、PL/SQL程序的结构首先看一个简单的例子 阅读全文
posted @ 2012-07-13 12:23 chenssy 阅读(673) 评论(0) 推荐(0) 编辑
摘要:准备五一开始学习oracle,所以今天就打算把oracle10g安装下。安装完后就来进行测试是否能够正常的工作。 在安装的过程中,配置的全局数据库为tmt。 但是使用SQLPlus登陆的时候,用户名:scott,口令为:tiger,主机字符串为:tmt。但是总是登陆不上,报提示ora-12154tns无法解析指定的连接标识符。百度了下,原来是我的TNSNAMES.ORA文件中并没有tmt的相关配置。于是对TNSNAMES.ORA文件增加如下配置:TMT = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(... 阅读全文
posted @ 2012-07-13 12:22 chenssy 阅读(1138) 评论(0) 推荐(0) 编辑
摘要:在很多情况下我们都需要将一个对象转换为String类型。一般来说有三种方法可以实现:Object.toString()、(String)Object、String.valueOf(Object)。下面对这三种方法一一分析: 一、采用Object.toString() toString方法是java.lang.Object对象的一个public方法。在java中任何对象都会继承Object对象,所以一般来说任何对象都可以调用toString这个方法。这是采用该种方法时,常派生类会覆盖Object里的toString()方法。但是在使用该方法时要注意,必须保证Object不是null值,否则将抛. 阅读全文
posted @ 2012-07-13 12:00 chenssy 阅读(779) 评论(0) 推荐(0) 编辑
摘要:在做java课程设计的时候,需要一个做许多的表格,由于数据量比较,所以决定给JTable增加个Jcollpan滑动窗口。 可是在我给表格设定的大小超过了Jscollpan,它只会出现垂直滑动条。对于这个我很蛋疼很纠结!! 当我查看帮助文档后,发现了一个这样的方法:setAutoResizeMode(JTable.AUTO_RESIZE_OFF);这个方法用于关闭表格的自动调整,也就是表格大小并不会随框架的变化而变化,根据自身的大小来调整。添加这个方法后的效果是依然没有水平滑动条。这又要纠结了!!最后实在是解决不了,在百度上面找了解决方案:最终代码如下:1 JScrollPane jScrol. 阅读全文
posted @ 2012-07-13 11:59 chenssy 阅读(250) 评论(0) 推荐(0) 编辑
摘要:Swing是目前Java中不可缺少的窗口工具组,是建立图形化用户界面(GUI)程序的强大工具。JavaSwing组件自动产生各种事件来响应用户行为。Java将事件封装成事件类,并且为每个事件类定义了一个事件监听器。一个组件注册事件监听器方法,表明该组件要响应指定事件。也就是说我们可以通过注册监听器,监听事件源产生的事件,从而在事件处理程序中处理我们所需要处理的用户行为。 JavaSwing中处理各组件事件的一般步骤是: 1.新建一个组件。 2.将该组件添加到相应的面板。 3.注册监听器以监听事件源产生的事件 4.定义处理事件的方法。 注册事件我们一般采用两种方式:一是:利用一个监听器以及多.. 阅读全文
posted @ 2012-07-13 11:58 chenssy 阅读(886) 评论(0) 推荐(0) 编辑
摘要:静态成员是一组比较特殊的成员,它不属于某个特定的类实例。它独立于该类。也就是说它不依赖类特定的实例,而被类的所有实例共享。 类的静态成员一般可以分为3种:静态成员变量,静态方法,静态代码块。它们都具有以下几个特点: 1、在类加载的时候,就进行创建和初始化或执行代码; 2、它们对于一个类来说,都只有一份; 3、类的所有实例都可以访问到它们; 1)、静态成员变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫做静态变量;另一种是没有被static修饰的变量,叫做实例变量。两者的区别在于: 静态变量在内存中只有一个拷贝,JVM只为静态分配一次内存,在加载类的过程中完. 阅读全文
posted @ 2012-07-13 11:56 chenssy 阅读(693) 评论(0) 推荐(1) 编辑
摘要:equal和“==”都是表示相等的意思,但是它们在进行实际的相等判定的时候,却有着非常大的区别 先看看一个例子 1 public class EqualTest{ 2 public static void main(string[] args){ 3 String str1 = "abcd"; 4 String str2 = "abcd"; 5 String str3 = new String("abcd"); 6 7 System.out.println(str1==str2); 8 System.ou... 阅读全文
posted @ 2012-07-13 11:55 chenssy 阅读(1442) 评论(2) 推荐(3) 编辑
摘要:今天在看javascript的时候,突然发现数组array竟然可以利用字符串做为其下标,这个以前我还真的不知道,在我的印象当中数组用来遍历,怎么可以用字符串呢?哎。。孤陋寡闻啊..... 首先Array是从Object那里继承下。它具备Object所有的功能和特性。下面是Object的情况: 新建: var object = new Object(); 增加: object[strIndex ] = value; (strIndex 为string) 删除: delete object[strIndex ]; 遍历: for ( var strObjIndex in ... 阅读全文
posted @ 2012-07-13 11:52 chenssy 阅读(1149) 评论(1) 推荐(0) 编辑
摘要:1 window.onload = myfunction(); 假如我们希望某个函数在网页加载完毕之后就立即执行。网页加载完毕时会触发一个onload事件,所以我们可以利用onload事件来加载这个函数。Onload事件与window对象相关联。如: 把myfunction函数绑定到这个事件上: 一个函数我们可以利用上面的解决,那两个、三个甚至更多呢?怎么解决?? 假如我们有firstFunction和secondFunction两个函数,是不是就是下面这样写呢:1 window.onload = firstFunction;2 window.onload = seco... 阅读全文
posted @ 2012-07-13 11:46 chenssy 阅读(524) 评论(1) 推荐(0) 编辑
摘要:前面介绍了一些拦截器的配置和基本的使用方法,所以这次将介绍拦截器的实用功能。 实用拦截器完成权限控制 当浏览者需要执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。 本示例要求用户登录且必须为指定用户名才可以查看系统中的某个试图,否则用户直接转入到登录界面。 检查用户是否登录,通常都是跟踪用户的Session来完成的,通过ActionContext即可访问到session的属性,拦截器的interceptor方法的invocation参数可以很轻易地访问到请求相关的ActionContext实例。 权限检查拦截器类代码如下: 1 public class Aut. 阅读全文
posted @ 2012-07-13 11:43 chenssy 阅读(513) 评论(0) 推荐(0) 编辑
摘要:一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截器Action了。拦截器的拦截行为将会在Action的execute方法执行之前执行。一、实现拦截器类 虽然Struts2框架提供了许多拦截器,这些拦截器也实现了Struts2的大部分功能。但是用户仍然可以开发自己的拦截器。 实现自己的拦截器,应该实现com.opensymphoney.xwork2.interceptor.Interceptor接口 该接口包含三个方法:init()、destroy()、interceptor(ActionInvocationinvocation); init():在该拦截器被实例化之后,在该. 阅读全文
posted @ 2012-07-13 11:41 chenssy 阅读(678) 评论(0) 推荐(0) 编辑
摘要:今天打算复习下oracle,本来oracle是以前安装的,重新安装了系统,大概重新装了系统对其有影响吧,在服务表中发现没有了lister该项。于是为了保险起见重新安装了oracle。配置什么都是正确的,但是通过http://localhost:5560/isqlplus时,突然发现http://localhost:5560/isqlplus打不开了。 解决方案: 首先进入CMD 1.用命令:netstat -an 查看端口5560是否打开 2.用isqlplusctl start 启动 3.打开IE 输入http://localhost:5560/isqlplus就可以打开了! 阅读全文
posted @ 2012-07-13 11:38 chenssy 阅读(1031) 评论(0) 推荐(0) 编辑
摘要:拦截器体系是Struts2框架的重要组成部分,我们可以把Struts2理解成一个空容器,而大量的内建拦截器完成了该框架的大部分操作。 Struts2拦截器是可插拔式的设计:如果我们需要使用某个拦截器,只需要在配置文件中应用该拦截器即可;如果不需要使用该拦截器,只需要在配置文件中取消应用拦截器。但是不管是否应用某个拦截器,对于Struts2框架都不会有任何影响。 拦截器与Action的关系以下主要讲一些关于拦截器的配置1、配置拦截器在struts.xml文件中定义拦截器只需要为拦截器类指定一个拦截器名,就可以完成拦截器的定义。定义拦截器使用<interceptor.../>元素,如下 阅读全文
posted @ 2012-07-13 11:11 chenssy 阅读(548) 评论(0) 推荐(0) 编辑
摘要:一般来说,文件下载只需要直接在页面给出一个超级链接,该链接的href属性值等于要下载文件的文件名,就可以实现文件下载,如:<ahref=”checkbox.rar”>checkbox.rar</a>。但是这样下载存在着一些缺陷:如果该文件的文件名是中文文件名时,下载则会导致下载失败;如果在下载时需要对用户的身份进行判断,来验证用户是否有权限来下载该文件时,那么单独的超级链接是不可能实现的。这个时候,我们需要用Struts2来控制文件下载。 Struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的。通过Struts2的文件下载支持,允许系统控制浏 阅读全文
posted @ 2012-07-13 11:03 chenssy 阅读(397) 评论(0) 推荐(0) 编辑
摘要:通常对于Web应用,我们可以云寻浏览者上传图片、上传压缩文件等,但是除此之外,我们必须对浏览者上传的文件大小、类型进行限制。因此必须在文件上传中进行文件过滤。 一、手动实现文件过滤 如果需要手动实现文件过滤,可以按照如下步骤进行 1、在Action中定义一个专用于进行文件过滤的方法。方法名任意,该方法的逻辑判断上传文件的类型是否为允许类型。 1 // 过滤文件类型 2 public String filterType(String[] types) { 3 // 获取希望上传的文件类型 4 String fileType = getUploadCont... 阅读全文
posted @ 2012-07-13 10:59 chenssy 阅读(707) 评论(0) 推荐(0) 编辑
摘要:为了能够上传文件,我们必须将表单的method设置为POST,将entype设置为multipart/form-data,只有在这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。 一旦我们设置了enctype为multipart/form-data,此时浏览器将采用二进制流的方式来处理表单数据。但是Struts2并没有提供自己的请求解析器,也就是说Struts2不会自己去处理multipart/form-data的请求,他需要调用其他上传框架来解析二进制请求数据。 在Struts2的struts.properties配置文件中,我们可以看到如下配置代码,它主要用于配置Struts. 阅读全文
posted @ 2012-07-13 10:57 chenssy 阅读(698) 评论(0) 推荐(1) 编辑
摘要:今天在学习Struts 2文件上传时,在运行例子时,突然发现控制台出现了如下错误:1 INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir 发现原来是'struts.multipart.saveDir' 没有配置。 struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在struts.properties文件中 如果在struts.properties文件加入如下代码 阅读全文
posted @ 2012-07-13 10:55 chenssy 阅读(869) 评论(0) 推荐(0) 编辑
摘要:输入校验是所有的Web应用必须处理的问题。一个健壮的应用系统必须可以阻止一些非法的输入,防止这些非法的输入进入系统。这样才可以保证系统不受到影响。 输入校验可以分为客服端校验和服务器端校验。 服务器校验:服务器校验是整个应用阻止非法数据的最后的防线,主要是通过在应用中编程实现。Struts2提供了基于验证框架的输入校验,在这种校验方式下,所有的输入校验只需要编写简单的配置文件,Struts2的验证框架将会负责进行服务器校验。如下表单:假定在该应用中要求这三个请求参数必须满足如下要求:1、name和password只能是字母和数组,且长度必须在4到16之间。2、年龄必须是1到150之间的整数。. 阅读全文
posted @ 2012-07-13 10:53 chenssy 阅读(526) 评论(0) 推荐(0) 编辑
摘要:大部分时候,我们使用Struts2内建的类型转换器就可以满足大部分类型转换需求了。但是在有些特殊的情况下,如:需要把一个字符串转换成一个复合对象时,这个时候就需要使用自定义类型转换器了。 实现自定义类型转换器一般需要实现以下两步: 1、编写自己的类型转换器 2、注册类型转换器 1、自定义类型转换器 编写自定义类型转换器一般都要实现一个类:DefaultTypeConverter。实现自定义转换器需要重写该类的convertValue方法。 convertValue方法负责完成类型的转换。但是这种转换是双向的,即如当需要把字符串转换成User实例时,是通过该方法实现的;当需要把User实例转换. 阅读全文
posted @ 2012-07-13 10:49 chenssy 阅读(345) 评论(0) 推荐(0) 编辑
摘要:所有的MVC框架,都需要负责解析HTTP请求参数,并将请求参数传给控制器组件。由于HTTP请求参数都是字符串类型,但是java是强类型的语言。,因此MVC框架必须将这些字符串参数转换成相应的数据类型。 Struts2提供了非常强大的类型转换机制。Struts2的类型转换可以基于ONGL表达式,只要把HTTP参数命名为合法的ONGL表达式,就可以充分利用Struts2的类型转换机制。 1、Struts2内建的类型转换器 Struts2可以完成大多数常用的类型转换。这些常用的类型转换时通过Struts2内建的类型转换器完成的。如下: 2、基于ONGL的类型转换 借助于ONGL,Struts2允许. 阅读全文
posted @ 2012-07-13 10:47 chenssy 阅读(307) 评论(0) 推荐(0) 编辑
摘要:当实现Action处理类后,我们就可以在struts.xml文件中配置该Action了。配置Action的目的就是让Struts2知道哪个Action处理哪个请求。也就是完成用户请求和Action之间的对应关系。 在Action映射中可以指定resulttypes、异常处理器及拦截器,但是,只有Action的name属性是必需指定的,该属性石引用该包的唯一标识。其他属性也可以在package范围内进行定义,供该package下配置的所有Action引用 1、包和命名空间 Struts2使用包来组织、管理Action。定义Action通过使用<package.../>下的<ac 阅读全文
posted @ 2012-07-13 10:44 chenssy 阅读(436) 评论(0) 推荐(0) 编辑
摘要:Struts2提供了大量的标签来开发表现层页面。这些标签的大部分,都可以在各种表现层技术中使用。 Struts2将所有标签分为以下三类: UI(用户界面):主要用于生成HTML元素的标签 非UI标签:主要用于数据访问、逻辑控制等的标签 Ajax标签:用于Ajax支持的标签 1、控制标签 1)、if/elseif/else:都是用来进行分支控制的 语法格式为: 1 <s: if test="表达式"> 2 标签体 3 </s:if> 4 <s: elseif test="表达式"> 5 标签体 6 </s:else 阅读全文
posted @ 2012-07-13 10:37 chenssy 阅读(380) 评论(0) 推荐(1) 编辑
摘要:对于MVC框架而言。我们希望:当Action处理用户请求时。如果出现了异常1,则系统就会转入视图资源1,在该视图资源上输入服务器提示;如果出现了异常2,则系统会转入子图资源2,在该视图资源上输入服务器提示;。。。。。 为了满足上述要求,我们可以采用以下的处理方法: 1 Public class XxxxAction{ 2 Public String execute(){ 3 try{ 4 ……. 5 } 6 catch(异常1 e1){ 7 return 结果1; 8 }... 阅读全文
posted @ 2012-07-13 10:32 chenssy 阅读(300) 评论(0) 推荐(0) 编辑
摘要:首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝 也就是说浅拷贝只复制一个对象,传递引用,不能复制实例。而深拷贝对对象内部的引用均复制,它是创建一个新的实例,并且复制实例。 对于浅拷贝当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。但是当对象的成员变量是引用数据类型时,就不能实现对象的复制了。 存在一个对象Person. 阅读全文
posted @ 2012-07-13 10:29 chenssy 阅读(585) 评论(0) 推荐(3) 编辑
摘要:在我们配置Action时,发现struts.xml中的<action…/>的绝大部分都相同。这时我们可以通过使用struts2提供的通配符映射机制来处理这个问题。我们在配置<action…./>时,允许在指定name属性时使用模式字符串(即用“*”来代替一个或多个任意字符),接下来就可以再class、method属性和<result…/>中使用{N}的形式来代表前面第几个*所代表是字符。 1、当我们在Action的name属性中使用通配符后,可以用一个<action../>元素代替多个逻辑Action。1 <action name=&quo 阅读全文
posted @ 2012-07-13 10:22 chenssy 阅读(364) 评论(0) 推荐(0) 编辑
摘要:Convention插件的主要特点是“约定优于配置”。 Action的搜索和映射约定 为了能够使用Convention插件,必须在Struts 2 应用中安装Convention插件,即将Struts2-convention-plugin.jar文件复制到Struts 2应用的WEB-INF/lib路径下。 对于convention插件而言,他会对以下两种java类的Action处理: 1、 所有实现了com.opensymphony.xwork2.Action的java类 2、 所有类名以Action结尾的java类 Struts 2的convention插件还允许设置如下三个常量常量说明. 阅读全文
posted @ 2012-07-13 10:09 chenssy 阅读(436) 评论(0) 推荐(0) 编辑
摘要:PreResultListener是要给监听器接口,他可以在Action完成控制处理之后,系统转入实际的物理视图之间被回调。 Struts 2 可以由ActionInvocation的addPreResultListener()方法来完成。 Struts 2 可以由Action和拦截器添加PreResultListener监听器。当为Action添加了改监听器,该监听器就可以再应用转入到实际物理视图之前回调该监听器的beforeResult()方法;当为拦截器添加监听器后,该监听器会对该拦截器所拦截的所有action都起作用。如: 1 public class LoginRegistActi. 阅读全文
posted @ 2012-07-13 10:05 chenssy 阅读(535) 评论(0) 推荐(0) 编辑
摘要:Action访问Servlet API Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试。对于Web应用的控制器而言,不访问ServletAPI是几乎不可能的。Web应用中通常需要访问的ServletAPI就是HttpServletRequest、HttpSession和ServletContext,这三个接口分别代表JSP中内置对象中的request、session、application。 Struts 2提供了一个ActionContext类,Struts 2的action可以通过该类来访问Servlet API ActionConte. 阅读全文
posted @ 2012-07-13 10:03 chenssy 阅读(828) 评论(0) 推荐(0) 编辑
摘要:struts 2提供了包含处理多个逻辑的Action,从而允许一个Action内包含多个控制处理逻辑。例如一个页面中存在多个按钮,用户通过不同的按钮提交同一个表单时,可以使用Action的不同的方法来处理用户的请求。如下图页面 页面中有两个提交按钮,但分别提交给Action的不同方法处理,“登陆”按钮使用登陆逻辑来处理请求,而“注册”按钮则使用注册逻辑来处理请求。此时,可以采用动态方法调用来处理 这种请求。动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以下面形式来指定表单的action属性action属性为actionName!methodName形式 其中. 阅读全文
posted @ 2012-07-13 09:43 chenssy 阅读(755) 评论(0) 推荐(0) 编辑
摘要:新建一个struts 2项目,命名为struts2按照下面的xml来配置Action1 <package name="hello" namespace="/action" extends="struts-default">2 <action name="helloworld" class="com.struts.action.HelloWorldAction" method="execute">3 <result name="succe 阅读全文
posted @ 2012-07-13 09:40 chenssy 阅读(560) 评论(0) 推荐(0) 编辑
摘要:一、将struts 2的lib文件夹下地commons-fileupload.jar、commons-io.jar、freemarker.jar、javassist.jar、ognl.jar、struts2-core.jar和xwork-core.jar必需类复制到web应用的WEB-INF/lib路径下。如果需要在web应用中使用struts 2的更多特性,则需要将相应的JAR文件复制到web应用的WEB-INF/lib路径下。二、编辑Web应用的web.xml配置文件,配置Struts 2 的核心Filter。在web.xml中定义核心Filter是来拦截用户请求。由于Web应用是基于请. 阅读全文
posted @ 2012-07-13 09:10 chenssy 阅读(1272) 评论(0) 推荐(5) 编辑
摘要:Servlet过滤器简介 Servlet过滤器是通过一个配置文件来灵活声明的模块化的可重用组建。Servlet过滤器截请求和响应,以便查看、提取或操作客服端和服务器之间交换的数据。 Servlet过滤器实际上就是一个标准的java类,这个类通过实现Filter接口获得过滤器的功能。它在jsp容器启动的时候通过web.xml配置文件被系统加载。 Servlet过滤器在接收到用户请求的时候被调用,当服务器接收到用户的请求的时候,依次调用配置好的过滤器,完成后将执行请求所要求的servlet,而servlet执行后的响应,则先通过配置好的过滤器后再发送给用户。 过滤器的用途: 1、用户认证和授... 阅读全文
posted @ 2012-07-13 09:05 chenssy 阅读(853) 评论(0) 推荐(0) 编辑