在SSH的基础上,再加一套基类,主要用于对象的增、删、改、ID主键查询等。
1.关键成员变量
entity、entityClass、entityClassName
2.泛型、反射
利用泛型和反射技术,生成、保存、和查询实体对象。
3.Preparable、ModelDriven
- Preparable预处理接口
publicvoid prepareInput() {
this.prepareModel();
}
publicvoid prepareShow() {
this.prepareModel();
}
protectedvoid prepareModel() {
if(getSID() !=null) {
entity = getBaseService().get(getSID());
if(entity ==null) {
thrownew IllegalArgumentException("id not exist");
}
}
}
publicvoid prepare()throws Exception {
if(null == entity) {
entity =entityClass.newInstance();
}
}
- ModelDriven模型驱动
在struts2中,提供了一种直接使用领域对象的方式,就是让action实现ModelDriven接口,ModelDriven让你可以直接操作应用程序中的领域对象,允许你在web层和业务层使用相同的对象。
public T getModel() {
return entity;
}
- 执行顺序:Preparable --> ModelDriven --> Action方法
4.条件查询
对于仓储操作的查询细节不应该暴漏给Service层,更不应该暴漏给Action层,所以条件查询要放在自己Dao的实现类中。
一般列表页面只表示用户特别关注和常用的字段,对于列表查询,不需要把对象所有字段都取出来,这样一是取数据会慢一点、传输数据也会慢、占用不必要的内存,所以采用hibernate中“new map”方式来取得所需字段。
5.分页
分页所需的变量和行为,封装到基类中。
6.Message
利用Struts2,集中管理Message。
7.异常处理
让SSH框架来进行异常处理(AOP技术),方法中只保留业务逻辑代码,但在出现异常后,控制台和日志中要输出最接近、详细的异常信息。
(1)在struts2中的defaultStack拦截器中配置参数
<interceptor-refname="defaultStack">
<paramname="exception.logEnabled">true</param>
<paramname="exception.logLevel">error</param>
</interceptor-ref>
(2)配合log4j中设置
log4j.logger.com.opensymphony.xwork2 = WARN
log4j.logger.com.opensymphony.xwork2 = ERROR
(3)配置struts2全局异常
<global-exception-mappings>
<exception-mappingresult="error"exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
<global-results>
<resultname="error">/common/globalerror.vm</result>
</global-results>
(4)全局异常页面(VM中实现)
#* @vtlvariable name="exception" type="java.lang.Exception" *#
#* @vtlvariable name="result" type="com.jd.common.web.result.Result" *#
#if($exception)
#if($!exception.class.simpleName=="NoSuchMethodException")
$!response.setStatus(404)
404! 您请求的内容不存在
#else
出错了:$exception
##${exception.printStackTrace()}
#end
#elseif($result)
#if($result.resultCode)
#showSimpleError()
#else
系统错误
#end
#end