基类
在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() {
returnentity;
}
执行顺序:Preparable --> ModelDriven --> Action方法
4. 条件查询
对于仓储操作的查询细节不应该暴漏给Service层,更不应该暴漏给Action层,所以条件查询要放在自己Dao的实现类中。
一般列表页面只表示用户特别关注和常用的字段,对于列表查询,不需要把对象所有字段都取出来,这样一是取数据会慢一点、传输数据也会慢、占用不必要的内存,所以采用hibernate中“new map”方式来取得所需字段。
5. 分页
分页所需的变量和行为,封装到基类中。
6. Message
利用Struts2,集中管理Message。
7. 异常处理
让SSH框架来进行异常处理(AOP技术),方法中只保留业务逻辑代码,但在出现异常后,控制台和日志中要输出最接近、详细的异常信息。
(1)在struts2中的defaultStack易做图中配置参数
<interceptor-ref name="defaultStack" >
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">error</param>
</interceptor-ref>
(2)配合log4j中设置
log4j.logger.com.opensymphony.xwork2 = WARN
log4j.logger.com.opensymphony.xwork2 = ERROR
(3)配置struts2全局异常 www.zzzyk.com
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception" ></exception-mapping>
</global-exception-mappings>
<global-results>
<result name="invalidLogin">index.jsp</result>
<result name="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.易做图Name=="NoSuchMethodException")
$!response.setStatus(404)
404! 您请求的内容不存在
#else
出错了:$exception
##${exception.printStackTrace()}
#end
#elseif($result)
#if($result.resultCode)
补充:综合编程 , 其他综合 ,