Archive for JAVAEE

温故知新-web应用中的Session机制

目录:

一、术语session

二、HTTP协议与状态保持

三、理解cookie机制

四、理解session机制

五、理解javax.servlet.http.HttpSession

六、HttpSession常见问题

七、跨应用程序的session共享

八、总结

一、术语session

在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相

同的。

Read more

IBATIS中关于iterate和‘$’与‘#’的比较

一个包含List元素的HashMap参数赋给sqlMap
public int getCountById(String id, String title, List ids) throws Exception {
Map paramMap=new HashMap();
paramMap.put(“id”, id);
paramMap.put(“title”, title);
paramMap.put(“ids”,ids);
return (int) this.sqlMapClient.queryForObject(“getCountById”, paramMap);
}
上面的ids元素是一个List,里面包含了一个id列表。id和title都是String。

Read more

JAVA WEB 系统设计开发知识体系

JAVA WEB 系统设计开发知识体系
1.1 Browser
1.1.1 HTML
1.1.2 CSS
1.1.3 JavaScript
1.1.4 AJAX

1) DWR
2) Jquery
1.2 Presentation Layer
1.2.1 Servlet/Filter/Listener/JSP
1.2.2 Struts
1.2.3 JSF

1.3 Business Logic layer
1.3.1 BO/Service/DomainObject
1.3.2 Spring

1.3.2.1 为什么需要Spring?

为什么要用spring,我们可以几个非常常用的方面来分析一下.
Spring是基于j2ee框架. 他站在非常实用的角度帮助程序员解决了很多不需要程序员搞和程序员一直重复搞的问题. 下面我只讲能节省我们工作的地方以使得大家对spring有足够的兴趣.

1, 松耦合问题. loose coupled IOC
这个问题我不费太多笔墨. 因为太多的文章解释这个问题. 大名叫:依赖注入. 说白了就是根据配置文件动态组装复杂对象. 或许有人又问, 我就是用程序组合也很简单啊. 是的, 你程序组装简单业务的是很简单. 如果组装的对象里面包含了Ejb, 包含了JMS, 包含了远程RMI那就没有这样组装简单了. 就说到这里.不说那么多废话.

2, AOP, 面向切面编程. 这个功能我们自己是不好设计的. 这个功能大家也都知道是干什么的, 例如方法的事务管理, 用户安全验证, 日志记录, 等等. 为了避免将更多的代码放进方法中去.spring使用这个AOP来监控符合你配置的正则表达式的方法名字. 并允许在执行这个方法的前后执行你的方法. 这个是建立在spring上下文框架下的一个功能. 原理是映射机制. 如果没有上下文是不好搞的.
虽然spring AOP对于大多程序员就足够了. 但与AspectJ相比, 他只能是功能比较弱的解决方案. AspectJ提供了SpringAOP不可能实现的多种切点类型. 如果不够用,你可以引入AspectJ. 来帮助你做更多的工作.

上面两个是大的方面的一个简单的说明. Spring在更多细节中方便了大家的工作. 下面我继续依次给以说明.

3, Bean工厂节省了.
你不用再自己构造工厂了. 不用再用自己构造单例模式了(原来我用hibernate做项目的时候,就有自己写的构造单例模式 好像是public static sessionFactory…). 不用自己再关心对象的创建了. 不用new对象了. 一切都直接从 上下文的框架中取就行了. 框架会帮助你构造你需要的对象. 你只需要跟上下文打交道就可以了. 当然,你多出了装配的工作. 但这是必须要付出的代价. 因为复杂性被集成在了配置里面. 使得你在开发层面只关心业务. 要是配置有可视化的工具就太好了. 但别着急, 找找, 现在只有想不到,没有找不到.

4, 集成Hibernate使用节省了事务的显式代码.
这个其实还是切面的一个好处应用. 配置进去是很简单. 既然能节省工作, 我就给你说一下.
(额 记得之前用hibernate做项目要加commit 而结合了spring之后就不用了 啥原因捏?是spring的哪个特性所导致的呢?恩 要好好思考下。╮(╯▽╰)╭)

5, Spring 针对不同的数据库访问模式提供了不同的模板. 分别适用于不同的持久机制.
包括: 针对JCA CCI的链接, 针对JDBC的, 支持命名参数的JDBC的链接, Hebernate的,针对iBATIS sqlMap的, Oraclede TopLink的. 这些模板使用方式的统一降低了程序员使用不同数据库的成本.模板的使用让你只关心数据的准备, 而看不到那些样板代码, 其实那些样板代码都还在, 只是被巧妙的隐含到了template中了.
例如: List list = jdbcTemplate.query(“select * from table1”,new Object[]{“a”,”b”},new RowMapper(){…..}); 意思表达到了.
其中对数据源的引用可以配置使用JNDI以从应用服务器中获取数据库的连接. 这样程序就可以集中处理业务逻辑而不必关心数据库的具体情况 .
如果不能从JNDI中取得, 那就必须在spring中配置一个连接池. 可以使用开源的DBCP. 这个支持多种数据库连接.

6, 数据库层面的缓存的使用.
Spring并不提供实际的缓存解决方案, 而是要以来第三方的缓存方案. 包括: EHcache,Gigaspaces, JBoss Bache, JCS, OSCache, Coherence .无论采用哪种缓存方案, 对于spring的配置都是一样的. 但缓存的配置文件都是要分开的. 简化了使用缓存的成本.

7. 安全验证方面节省的工作.
基于多种方式的用户验证. 都节省了很多工作.

8, 访问 RMI , 访问 Http Invoker, 访问Web Service
如果要穿越防火墙最后是后两种. 但httpInvoder局限于spring的对象. webService 可以多种.平台. 不管使用哪种, spring都为他们的配置提供了统一简单的配置. 使用起来非常方便. Xfire协助你访问webService简单易用.

9, JMS的访问. 大量冗余的代码被节省了. 配置好了即可使用. 当然你需要使用activeMQ第三方的队列服务器来接受消息.

10 , 访问EJB.. JNDI都非常简单了. 所有额外的工作,你配置好之后, spring都帮你做了. 你要做的就是: 使用

为什么不选择EJB呢?

打个比方吧,spring就像银行为我们提供很多的服务,以前有个叫ejb的银行,但是服务态度不好,学院派的风格,程序员快疯了。Johnson这位程序员很愤怒,新开了这家spring银行,非常的友善,于是很快地流行起来。感觉中型项目比较适合,几百块钱就不必麻烦去找银行了。大型项目估计还要找Ejb这家大型银行。

1.3.2.2 Spring 简介和使用范围

Spring使用基本的 JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。它是一个基于IoC和AOP(Aspect Oriented Programming 面向方面编程)的构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的MVC,对不同的数据访问技术提供了统一的接口,采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现Transcation Managment,等等。 从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

◆目的:解决企业应用开发的复杂性

◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

◆范围:任何Java应用

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

◆轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

◆控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。

Spring的主要目的是使J2EE易用和促进好编程习惯。

Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如 CommonsLogging用来做所有的日志输出,或CommonsDBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供O/Rmapping层,对此,已有有好的解决办法如Hibernate和JDO。

Spring的目标是使已存在的技术更加易用。例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。

Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,象许多开发人员,我们从来没有为Struts高兴过,并且感到在MVCwebframework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)

1.3.2.3 Spring 带来的好处

◆方便解耦,简化开发

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

◆AOP编程的支持

通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP(Object Oriented Programming 面向对象的程序设计)实现的功能可以通过AOP轻松应付。

◆声明式事务的支持

在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

◆方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。

◆方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hession、Quartz)等的直接支持。

◆降低JavaEEAPI的使用难度

Spring对很多难用的JavaEEAPI(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些JavaEEAPI的使用难度大为降低。

◆Java源码是经典学习范例

Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。

下面的一些描述,可能跟上边有重叠, 列在这里做为参考:

◆Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题,。

◆Spring能消除在许多工程上对Singleton的过多使用。(Singleton的过多使用,会减少系统的可测试性和面向对象特性。)

◆Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。

◆使用Spring构建的应用程序易于单元测试。

◆Spring使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或localEJBs来实现业务接口,却不会影响调用代码。

◆Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。

■Spring为数据存取提供了一致的框架,不论是使用JDBC或O/Rmapping产品(如Hibernate)。

Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。

1.3.2.4 Spring 的一些细节问题?
1) 事务控制的粒度/范围问题:详细信息有待补充
2) … …

1.3.2.5 Spring + Struts + Hibernate 的Sample Project

1.3.3 EJB

1.4 Data Layer
1.4.1 标准 SQL 语言
1.4.2 Hibernate
Hibernate 的设计思想
Hibernate 为我们解决了那些问题?
1.4.3 Oracle
1.4.4 Mysql
1.4.5 H2

1.5 其他

1.5.1 Cache的应用与设计
1.5.1.1 设计原理/原则
1.5.1.2 JCS cache
1.5.1.3 EH cache
1.5.1.4 Jboss cache
1.5.2 SOA
1.5.3 WebService
1.5.4 集群
1.5.5 负载均衡
1.5.6 SAP

hibernate配置文件详解

hibernate.cfg.xml文件详解




"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">



localhost-MySQL

com.mysql.jdbc.Driver

jdbc:mysql://localhost/privatesecretary

root

123456

20

true

50

23

false

true

gbk

org.hibernate.dialect.MySQLDialect


javabean类映射配置文件

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!–hibernate- mapping有几个可选的属性:schema属性指明了这个映射的表所在的schema名称。default-cascade属性指定了默认的级联风格可取值有 none、save、update。auto-import属性默认让我们在查询语言中可以使用非全限定名的类名 可取值有 true、false。package属性指定一个包前缀。–>





生成DAO文件,没有事务处理,在执行完SQL语句时要commit();

Struts Spring Hibernate整合例子

Struts Spring Hibernate

本次配置环境:Myeclipse5.5、MySQL5.0、Struts1.2、Spring2.0、Hibernate3.1

一、建工程

略。。。。。。

二、要使用Struts、Spring、Hibernate必须导入必需的包

1、Struts(和之前没区别)

2、Spring

分别导入Spring 2.0 Core Libraries、Spring 2.0 Web Libraries

选择把*.jar Copy到工程/WebRoot/WEB-INF/lib下; 点击NEXT

选择applicationContext.xml的目录,/WebRoot/WEB-INF;点击finish
(我一般用Myeclipse的 add capability 的功能~相信一般的人也会这么偷懒的吧? :!:
3、Hibernate

在导入Hibernate时,当然先要配置DataSource咯,这里就不再说了

选择导入Hibernate全选上

选上复选框:Hibernate 3.1 Core……、Hibernate 3.1 Advanced……、Spring 2.0 ORM/DAO…….

同样选择把*.jar Copy到工程/WebRoot/WEB-INF/lib下; 点击NEXT

这里我们选择把hibernate交给spring去管理

选中单选按钮 Spring configuration file…… 点击NEXT

选择已存在的applicationContext.xml文件,

填写SessionFactory ID :sessionFactory 点击NEXT

这里我们需要填写Bean Id :dataSource

选择 DB Driver :选择刚才配置的DataSource 点击NEXT

这里不需要创建 SessionFactory Class 点击Finish

注意:查看applicationContext.xml的变化

三、映射VO、数据操作

首先工程的结构建好,比较简单的结构:

org.gstarwd.dao

org.gstarwd.struts

org.gstarwd.struts.action

org.gstarwd.struts.form (我喜欢用动态的表单。。dynaValidateFrom :mrgreen:

org.gstarwd.vo

映射表userinfo创建持久类到org.gstarwd.vo目录

在dao下创建数据库操作类 UserDAO 这里只是对数据库进去插入,代码如下:

private SessionFactory sessionFactory;

public SessionFactory getSessionFactory() …{

return sessionFactory;

}

public void setSessionFactory(SessionFactory sessionFactory) …{

this.sessionFactory = sessionFactory;

}

/**//* 用户注册 */

public boolean regist(Userinfo user) …{

try …{

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

session.save(user); //记得我有次用的是extends了 Spring 提供的 hibernateDaoSupport, 恩用那个//getHibernateTemplate 事务好像被封装了?恩。。

tx.commit();

session.close();

return true;

} catch (Exception ex) …{

ex.printStackTrace();

return false;

}

}

使用依赖注入,setter设值 sessionFactory

到此数据层已经完成

四、配置struts-config.xml

添加action、form、jsp 略……

首先在struts-config.xml添加一个插件

className="org.springframework.web.struts.ContextLoaderPlugIn">

value="/WEB-INF/applicationContext.xml" />

为什么要添回这个插件呢?

因为在后面会在applicationContext.xml下配置action,让action交给spring

去管理,实现了struts的依赖注入机制

接下来添加cuntroller,这里你可以使用DelegatingActionProxy代理

"org.springframework.web.struts.DelegatingRequestProcessor"/>

Controller取代了struts的RequestProcessor,在定义action里,我们可以省略

type属性。(我个人比较喜欢用这个)下面让我们看配置好的struts-config.xml:

type="org.chenwj.struts.form.UserForm" />

"org.springframework.web.struts.DelegatingRequestProcessor"/>

parameter="org.chenwj.struts.ApplicationResources" />

className="org.springframework.web.struts.ContextLoaderPlugIn">

value="/WEB-INF/applicationContext.xml" />

五、在applicationContext.xml配置action

这里我们先在 action类里添加一些业务逻辑,代码如下:

public class UserAction extends Action …{

private UserDAO userDao;

private Userinfo user;

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) …{

UserForm userForm = (UserForm) form;

//封装数据

user.setName(userForm.getName());

user.setPassword(userForm.getPassword());

if(userDao.regist(user))…{

return mapping.findForward(“success”);

}

return mapping.findForward(“error”);

}

public Userinfo getUser() …{

return user;

}

public void setUser(Userinfo user) …{

this.user = user;

}

public UserDAO getUserDao() …{

return userDao;

}

public void setUserDao(UserDAO userDao) …{

this.userDao = userDao;

}}

这里使用setter实现依赖注入了两个bean,接下来配置applicationContext.xml

class="org.apache.commons.dbcp.BasicDataSource">

value="com.mysql.jdbc.Driver">

value="jdbc:mysql://localhost:3306/demo">

"org.springframework.orm.hibernate3.LocalSessionFactoryBean">

org.hibernate.dialect.MySQLDialect

org/chenwj/vo/Userinfo.hbm.xml

对应的 action path属性值相同,斜线也是必需的,通过这个属性scope=

“prototype” 每次获取bean实例时都会产生新的实例,默认是单例

abstract="false" lazy-init="default" autowire="default"

scope="prototype" dependency-check="default">

lazy-init="default" autowire="default"

dependency-check="default">

到此所有的配置已经完成,测试:

HTTP Status 404 – Servlet action is not available

The requested resource (Servlet action is not available) is not available

这个错误是大部初学者整合 SSH 时都会遇到的问题

首先建议你使用测试类进行测试,这样我们可以很快找到错误所在的地方

public static void main(String[] args) …{

ApplicationContext context = new FileSystemXmlApplicationContext(

“/WebRoot/WEB-INF/applicationContext.xml”);

UserDAO dao = (UserDAO)context.getBean(“userDao”);

Userinfo user = new Userinfo();

user.setName(“aaa”);

user.setPassword(“bbb”);

boolean a = dao.regist(user);

if(a)…{

System.out.println(“OK”);

}

}

如果这里没出错,那么请你好好检查你的配置文件,是否写错或少了些什么东东了

这里出的错误也跟使用的版本有关系,这里报的错一般都是说找不到XX类所报的异常

那么请检查lib下有没commons-pool-1.2.jar包,如没请导入,这个问题也有可能是包

之间的****,删除这个包hibernate-annotations.jar

六、.sql文件、.jsp文件

create table userinfo(

id int(10) not null auto_increment,

name varchar(20),

password varchar(20),

PRIMARY KEY (id))

name :

password :

使用Spring、Hibernate、Struts的一些错误个人总结

1.错误: java.lang.NullPointerException
(当然这个错的原因偶很多这里总结的都是在SSH下容易出现的错误 8-O
原因: 发现 dao 实例、 manage 实例等需要注入的东西没有被注入

解决:这个时候,你应该查看日志文件;默认是应用服务器的 log 文件,比如 Tomcat 就是 [Tomcat 安装目录 ]/logs ;你会发现提示你:

可能是:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sf’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml

org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml

……………………….

Caused by: java.io.FileNotFoundException: src”hibernate.cfg.xml

可能是:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found

org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found

然后你就知道原因是因为配置文件的解析出了错误,这个通过 Web 页面是看不出来的。

更多的是持久化映射文件出的错误;导致了没有被解析;当然你需要的功能就无法使用了。

2. 错误:
StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage

或者:type Status report message Servlet action is not available

descrīption The requested resource (Servlet action is not available) is not available.

原因: 同 1

3. 错误StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception

java.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei

界面错误具体描述:

org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei

原因与解决:

<方案一>你的“html:”开头的标签没有放在一个

<方案二>重新启动你的应用服务器,自动就没有这个问题了

4. 错误:Exception in thread “main” org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

原因与解决:

因为Hibernate Tools(或者Eclipse本身的Database Explorer)生成*.hbn.xml工具中包含有catalog=”***”(*表示数据库名称)这样的属性,将该属性删除就可以了(但是很多时候还是不行啊 :(

5. 错误:org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)

原因与解决:
方法1 删除Set方的cascade
方法2 解决关联关系后,再删除
方法3 在many-to-one方增加cascade 但值不能是none
最后一招:
检查一下hashCode equals是否使用了id作为唯一标示的选项了;我用uuid.hex时是没有问题的;但是用了native,就不行了,怎么办?删除啊!

6. 错误:exception javax.servlet.ServletException: BeanUtils.populat root cause

java.lang.IllegalArgumentException:Cannot invoke ***Form.set*** – argument type mismatch

原因

这个问题很奇怪的说,为啥说奇怪呢?

先说问题的原因:问题发生如下两种情况:

* Form中是Date类型

* 上传文件时

为什么说奇怪呢?主要针对Form是日期型的来说的;因为我做过N多系统Form中都是用java.util.Date,界面使用;都是没有问题的。所以第一次遇到这个错误时,捣鼓了一个下午。

解决:

第一个问题:你把Date换成String;在Action中进行转换;当然转换要借助于SimpleDateFormate方法喽

第二个问题:记得在form中增加enctype=”multipart/form-data” 呵呵

7. 问题:

今天用Tomcat5.5.12,发现原来很好用的系统不能用了,反复测试发现页面中不能包含 taglib,否则会出现以下提示:

HTTP Status 500 -type Exception report

Message

descrīption The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD “META-INF/tlds/struts-bean.tld” from JAR file “file:*****/WEB-INF/lib/struts.jar”:

原因:

更新了工程用的lib文件夹下的jar,发布时也发布了servlet.jar和jsp-api.jar。

解决:

把jsp-api.jar删除就解决这个问题了。

8. 问题:Tomcat5.0.20中差错可以通过[Tomcat安装目录]/logs下的localhost_log.2006-07-14.txt类似的文件看具体的错误日志,但是在5.5中就找不到了

原因与解决:

我把[Tomcat安装目录]/bin下的tomcat5w.exe的logging标签捣鼓了一会,然后重起就有了。

原因具体说不准,用非安装版也有这个问题。

最终解决方案:
:lol: 官方文档 http://tomcat.apache.org/tomcat-5.5-doc/logging.html

getSession()与getHibernateTemplate()区别

转自我的javaeye上的blog:gstarwd.javaeye.com 我会慢慢的把精华的文章整理到这里来滴 (*^__^*) 嘻嘻……。

一直都很疑惑在spring框架中getSession与getHibernateTemplate的区别。相同的地方不用说大家都是调用数据库返回结果的。但为什么要这样有二个不同的兄弟呢。认真学习了一下(其实还是很粗略的)

从使用上看

getHibernateTemplate必须继承或实例HibernateDaoSupport当然包括sessionFactory

@SuppressWarnings("unchecked")
 public T get(String id) {
  T ret = (T) getHibernateTemplate().get(type, id);
  if (ret == null) {
   throw new ObjectRetrievalFailureException(type,
     "can't get object with id " + id);
  }
  return ret;
 }
public IResponseDataNPage findPageByCriteria(
   final DetachedCriteria detachedCriteria, final Order order,
   final int pageSize, final int startIndex)  {
  return (IResponseDataNPage) getHibernateTemplate().execute(
    new HibernateCallback() {
     public Object doInHibernate(Session session)
       throws HibernateException {
      Criteria criteria = detachedCriteria
        .getExecutableCriteria(session);
      int totalCount = ((Integer) criteria.setProjection(
        Projections.rowCount()).uniqueResult())
        .intValue();
      criteria.setProjection(null);
      if (order != null)
       criteria.addOrder(order);
      if(pageSize>0 && startIndex>=0)
      {
       criteria.setFirstResult(startIndex).setMaxResults(
         pageSize);
      }

      List items = getHibernateTemplate().findByCriteria(
        detachedCriteria);
      // IResponseDataNPage ps = new IResponseDataNPage(items,
      // totalCount, pageSize, startIndex);
      IResponseDataNPage dataNPage = buildResponseDataNPage(
        null, items, totalCount);
      return dataNPage;
     }
    }, true);
 }
}

getSession只有sessionFactory

public T get(final PK id) {
  return (T) getSession().load(entityClass, id);
 }
 public Page find(Page page, String hql, Object... values) {
  Assert.notNull(page);
  Query q = createQuery(hql, values);
  if (page.isFirstSetted()) {
   q.setFirstResult(page.getFirst());
  }
  if (page.isPageSizeSetted()) {
   q.setMaxResults(page.getPageSize());
  }
  page.setResult(q.list());
  return page;
 }
 

从上面可以看出getSession能实现与getHibernateTemplate完全一样的代码。

但getSession要自己实现一堆的功能。如createQuery等等。

但深入比较发现一下不同处:

getSession() 获得的是原始的sessionFactory,每次你必须自己维护session如结束后你必须关闭session。如果是hibernate中进行数据库操作,你获得是原始的hibernate style和excepttion。

而hibernate template是spring包装过的,它会帮你管理session,并且它会将hibernate exceptions转换成其他的分类后的错误。这点getSession是肯定不行了。例如你用orcle和mysql返回的错误在 getSession中就是不一样的,而在hibernate template中就是一样的。

但我在实际使用中发现,对于基本的操作Hibernate template处理的的确比getSession要好,但到了复杂查询的时候如分页时需要调用 getHibernateTemplate().execute(HibernateCallBack).要产生很多innerClass,调试非常不便。而getSession就相当简单多了。

总之:dao layer的设计五花八门,只能根据需要自己选择了。晕 java 的多态?还是变态?

无觅相关文章插件,快速提升流量