1:
出错哈哈!!只知道web-INF中的文件不能直接访问,没想到还有这个!!
web-inf文件夹下的页面的安全性太高了,不过我喜欢,在实现页面的层次加载时候就不能使用../来记载WEB-INF以外的文件了,而需要使用<%=path%>回到根目录来加载!!但是这是不规范的写法,如下:
<link rel="stylesheet" type="text/css" href="<%=path %>/ext4/resources/css/ext-all.css" />
规范的写法是:用el表达式,如果你直接说那简单,就用el表大师,来:${path}(会在page,request,session,application依次找)替换上面就是了,那就错了,因为在jsp页面中,path定义的是局部变量,是pageScope变量吗??测试后明显不是,不是的话我可以放进去嘛是吧,<% pageContext.setAttribute("path",path); %>
详见http://blog.sina.com.cn/s/blog_b98d87830101cteq.html
2:仔细总结一下hibernate等进行事务处理的方法:
1:JPA中使用的是:
需要entityManager对象来进行,怎样在业务层得到?因为我们在spring容器实例化的时候已经有entityManager了在service层中(service层分为Buyerservice接口+BuyerserviceBean实现),在serviceBean使用:@PersistenceContext EntityManager em;//得到的是代理对象
代码:
BuyerserviceBean implements Buyerservice中
e.remove(em.getReference(Buyer.class,username));//getReference对应hibernate的load
em.persist(buyer);//保存
em.merge(buyer);//更新
2:hibernate中的sessionFactory
TUser user=new TUser();
session.flush();//Session.flush方法强制数据库同步,这里既强制Hibernate将user实例立即同步到数据库中。在事物提交的时候和Session关闭的时候,也会自动执行flush方法
find()//这个方法返回一个List
Load() //这个方法返回是一个对象
修改数据:
1. 将要修改的数据从数据库读出,赋值给表对应的持久化类
2. 对得到的持久化对象进行修改
3. 启动事务管理
4. 将赋值后的持久化对象提交给session
5. 结束事务管理并向数据库提交
-------------------------------
public void update(){
3:HibernateTemplate
在HibernateTemplate我们一般是这样用:应该要结合spring的配置式事务。
spring + hibernate 使用spring配置式事务,
你会发觉你的代码会节省很多,而程序的管理,修改 和 扩展方面,
增强了好多。
<bean id="ht" class="org.springframework.orm.hibernate3.HibernateTemplate">
SessionFactory 是Spring专门为Hibernate定制的Session工厂类,
如果我们不用Spring,直接使用Hibernate,我们则需要写一个配置文件
hibernate.cfg.xml 文件,但是既然用了spring,那么直接配置在spring bean容器中了,其中配置,数据库连接,hql的指定数据库翻译器(Dialect),java对象和数据库表的映射文件加载 等。
hibernate3 一般用的是 org.springframework.orm.hibernate3.LocalSessionFactoryBean 这个类。
HibernateTemplate 是Hibernate操作进行封装,我们只要简单的条用HibernateTemplate 对象,传入hql和参数,就获得查询接口,
至于事务的开启,关闭,都交给HibernateTemplate
总之:我们使用HibernateTemplate,有一个很重要的原因就在于我们不想直接控制事务,不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个SessionHibernateTemplate
在使用Spring的时候 DAO类继承了 HibernateDaoSupport 类又因为HibernateDaoSupport 类里面有个属性 hibernateTemplate;所以就可以进行设置注,也就是Spring的一大优点面向切面式编程,进行设置注入,在Tomcat启动的时候由 Tomcat 加载 ApplicationContext.xml,配置文件给 hibernateTemplate赋值,这样的话就实现了,在使用某个对象之前不用给他实例化
介绍HibernateTemplate
getHibernateTemplate().save(entity);
getHibernateTemplate().update(entity);
getHibernateTemplate().delete(entity);
//删除所有
public void deleteAll(Class clazz) throws DaoException {
try {
List result = getHibernateTemplate().loadAll(clazz);
getHibernateTemplate().deleteAll(result);
} catch (DataAccessException e) {
log.error("从数据库删除 " + clazz.getName() + " 的所有记录失败", e);
throw new DaoException("从数据库删除 " + clazz.getName() + " 的所有记录失败", e);
}
}
public void deleteAll(Collection entities) throws DaoException {
try {
getHibernateTemplate().deleteAll(entities);
} catch(DataAccessException e) {
throw new DaoException(e);
}
}
查找:
public Object loadByKey(Class clazz, String keyName, Object keyValue)
throws DaoException {
try {
List result = getHibernateTemplate().find(
"from " + clazz.getName() + " where " + keyName + " = ?",
keyValue);
if (result != null && result.size() > 0) {
return result.get(0);
} else {
return null;
}
} catch (DataAccessException e) {
+ clazz.getName() + " 实例失败", e);
}
}
public List loadAll(Class clazz) throws DaoException {
try {
return getHibernateTemplate().loadAll(clazz);
} catch (DataAccessException e) {
}
}
public List find(String queryString) throws DaoException {
try {
return getHibernateTemplate().find(queryString);
} catch (DataAccessException e) {
}
}
public List find(String queryString, Object param) throws DaoException {
try {
return getHibernateTemplate().find(queryString, param);
} catch (DataAccessException e) {
+ " 失败", e);
}
}
public List find(String queryString, Object[] params) throws DaoException {
try {
return getHibernateTemplate().find(queryString, params);
} catch (DataAccessException e) {
StringBuffer paramString = new StringBuffer("");
for (int i = 0; i < params.length; i++) {
paramString.append(params[i]);
paramString.append(" ");
}
+ queryString + " 失败", e);
}
}
public List findByNamedQuery(String queryName) throws DaoException {
try {
return getHibernateTemplate().findByNamedQuery(queryName);
} catch (DataAccessException e) {
}
}
public List findByNamedQuery(String queryName, Object param)
throws DaoException {
try {
return getHibernateTemplate().findByNamedQuery(queryName, param);
} catch (DataAccessException e) {
+ " 的查询失败");
}
}
public List findByNameQuery(String queryName, Object[] params)
throws DaoException {
try {
return getHibernateTemplate().findByNamedQuery(queryName, params);
} catch (DataAccessException e) {
StringBuffer paramString = new StringBuffer("");
for (int i = 0; i < params.length; i++) {
paramString.append(params[i]);
paramString.append(" ");
}
+ " 的查询失败");
}
}
************************************
xxxxxxxxxxxx
原创:转载须注明作者:@author:huanglei_jmr
ssim maven+tiles的错误体会
---------------------------------------
org.apache.jasper.JasperException: /layout.jsp(1,26) equal symbol expected
这句话的意思是说jsp页面异常:layout.jsp(1,26) 这个jsp页面的第一行出错!!
这里我的头写错了,头就是默认建立一个jsp的头!
-------------------------
在maven构建的时候不要写servlet-api和jsp-api这两个包,当然前提是使用了tomcat作为服务器
因为在tomcat的lib中包含着两个东西,如果加上的话会出现异常:
-----------------------------
在使用tiles的时候,文件的头写错了很多次:
tiles-def.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
tiles.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
这两个文件中东西写都是一样的,我看到别人的项目中写是两个,其实只有一个用上了,就是放在WEB-INF下
的,现在的最新命名都是使用前者!
----------------------------------------------------
*****************************************************
-----------------------------------------------------
struts2整合titles在web.xml文件中加上:
struts2自个的listerner还是要写的!其余地方没有要配的了
----------------------------------------------------
*****************************************************
-----------------------------------------------------
**用maven构建玩后要导入IDE记得修改根目录下的文件:.mymetadata;.classpath;.project文件
用maven建立的项目中最大的一个问题就是我未来部署在服务器中的web-inf/classes文件中的东西是不能被
实时更改的!!这是为什么,我觉得是maven在install的时候的生成的class是放在target,而这些更改仅仅
只是发生在target/classes这个文件中(在classpat中配置这个对应着src/main/java,这两个是同时实时更
新的),所以src中的目录下的class是没有被更改的,但是部署到web中去的恰好是src 中webapp下的的class
文件夹!!
.classpath中的这两个配置完全证明我的猜想:
<classpathentry kind="output" path="src/main/webapp/WEB-INF/classes"/>
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
这里我选择更改.classpath文件中的使其目录相同,<classpathentry kind="output"
path="target/classes"/>
会有什么错误发生呢?不得而知,但是应该么有!
在这个文件中还有一项:
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
这个解决:Eclipse编辑Maven2项目的时候 无法将项目中的子类项目自动导入父项目中依赖的包库Maven
Dependecy!!如果没有的话就加入,我的本来就有!
.projetc怎么修改:给参考!
1 <?xml version="1.0" encoding="UTF-8"?>
2 <projectDescription>
3 <name>ssim</name>
4 <comment>Web application</comment>
5 <projects>
6 </projects>
7 <buildSpec>
8 <buildCommand>
9 <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
10 <arguments>
11 </arguments>
12 </buildCommand>
13 <buildCommand>
14 <name>com.genuitec.eclipse.j2eedt.core.WebClasspathBuilder</name>
15 <arguments>
16 </arguments>
17 </buildCommand>
18 <buildCommand>
19 <name>org.eclipse.jdt.core.javabuilder</name>
20 <arguments>
21 </arguments>
22 </buildCommand>
23 <buildCommand>
24 <name>com.genuitec.eclipse.j2eedt.core.J2EEProjectValidator</name>
25 <arguments>
26 </arguments>
27 </buildCommand>
28 <buildCommand>
29
<name>com.genuitec.eclipse.j2eedt.core.DeploymentDescriptorVali
30 <arguments>
31 </arguments>
32 </buildCommand>
33 <buildCommand>
34 <name>org.eclipse.wst.validation.validationbuilder</name>
35 <arguments>
36 </arguments>
37 </buildCommand>
38 </buildSpec>
39 <natures>
40 <nature>org.maven.ide.eclipse.maven2Nature</nature>
41 <nature>com.genuitec.eclipse.j2eedt.core.webnature</nature>
42 <nature>org.eclipse.jdt.core.javanature</nature>
43 <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
44 </natures>
45 </projectDescription>
46
----------------------------------------------------
*****************************************************
-----------------------------------------------------