关闭

框架整合

196人阅读 评论(0) 收藏 举报
分类:

今天老师布置了几个作业都是关于框架的整合的,记录一下其中遇到的问题和后来的解决方法:

框架这个东西多的没什么好讲的   按照步骤来就行了,第一步先加入spring,再加入hibernate,但是因为在加入hibernate的时候多点了spring(与前面的冲突了)  ,然后就各种问题。。。

后来重新弄了一遍后面的步骤没有再加入spring就可以了

另外逆向工程生成bean 和dao之后我向往常一样使用dao  直接new出来的对象,结果调用dao里面的方法的时候老是报空指针的错误,上网查了一下才发现应该使用注入式的方法,(这才是使用spring的原因) 

但是使用spring获取bean的时候又出现了问题 FileSystemXmlApplicationContext("applicationContext.xml")一直找不到文件  但是我是按照老师给的步骤来的,无语,找了很久,最后改用了绝对路径才找到。

6-4找到了别的解决办法,可以在applicationContext.xml里面直接给bean填写ref字段  然后在bean里面写上一个成员变量和一个set函数即可。

整合完毕hibernate和spring之后开始加入struts出现了一个错误:

严重: Exception starting filter struts2 

Caught exception while loading file struts-default.xml - [unknown location] 

在这个链接找到了解决方法:  http://bbs.csdn.net/topics/350193538

这种错误真正原因不是JDK 6和Struts 2冲突, 而是 MyEclipse Hibernate 类库中多了两个包: xml-apis.jar和xerces-2.6.2.jar, 这两个包的功能和JDK的冲突了. 解决办法: 1. 删除发布后目录的 WEB-INF/lib/ 下的这两个文件; 2. 或者使用JDK 1.5来启动Tomcat 6. 

6-2继续整合框架

昨天因为AOP没搞对,切入到了ACTION里面结果导致action里面的对象都成了空,后来只能老老实实将service和action分离到不同的包中

6-4

到今天为止基本上都整合完毕了,遇到了一个问题,做完分页功能后   在页面见进行切换的时候  如果切的次数过多会造成后来无法再连接,这个跟datasource里的配置

<property name="maxActive" value="255"></property>
有关  而且最主要的在于我在DAO里面没有关闭session造成每点一次都新建了一次session


public List<Item> getItemsInPage(int page,int numOfPage)
	{
		log.debug("finding itemsInPage instances");
		Session se = null;
		Query query = null;
		try {
			String queryString = "from Item item order by item.itemId desc";
			se = this.getSession();
			query = se.createQuery(queryString);
			query.setFirstResult(page*numOfPage);
			query.setMaxResults(numOfPage);
			List<Item> list = query.list();
		 	return list;
		} catch (RuntimeException re) {
			log.error("getItemsInPage failed", re);
			throw re;
		} finally{
			if(se != null){
				se.close();
			}
		}
	}

如果没关闭se  会导致session随着操作增加  不断增加,最终导致数据库连接池的数量被占满,无法接受新的请求。


整合dwr的时候需要改成这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
	<allow>
		<create creator="spring" javascript="mytest1">
			<param name="beanName" value="test"/>
		</create>
	</allow>
</dwr>


6-11今天用到了AOP注入的around


@Around("test()")
public String before(ProceedingJoinPoint  pjp) {
	ActionContext ac = ActionContext.getContext();
	Map session = ac.getSession();
	if (session==null)
	{
		session = new HashMap();
	}
	
	try {
		String result = (String) pjp.proceed();
		String username = (String) session.get("username");
		if(username==null||session==null)
		{
			return "input";
		}
		return result;
	} catch (Throwable e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	return "success";
}

如上面的代码  如果把 String username = (String)session.get("username");放在proceed()方法之前  就会导致一些错误,因为around这个方法proceed前面的代码是运行在被拦截方法前面的,之前陷入一个误区,导致一直出错。这样算是实现了一个简单的权限管理(处理游客和会员)


6-16今天用ssh做课程设计

有个一对多的问题,查了半天不知道hql怎么写

最后发现可以在逆向工程的时候勾选被引用的类,比如:

userId是Comment表的外键是User表的主键,可以在逆向工程的时候勾选include referencing tables(A<-B)

这样就可以生成带关联关系的bean

6-17发现一个蛋疼的问题,逆向工程生成bean的时候默认的关联外键竟然是主键  而不是指定的另一个唯一约束字段。

后来只能把数据库表里面的外键关联直接设为两一个表的主键

查询的时候报错。

org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:108) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyI

看了以下网上的说法  是因为延迟加载的原因(hibernate默认延迟加载,如News 中的user会在需要时才往数据库中 查找,但是这时session已经关闭,所以会报错)

解决方法如下  加上lazy="false"即可

 <class name="com.bean.News" table="tb_news" catalog="travel" lazy="false">


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6327次
    • 积分:205
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:6篇
    • 译文:0篇
    • 评论:4条
    最新评论