文档章节

SSH 注解开发

志强朱
 志强朱
发布于 2016/05/08 17:47
字数 947
阅读 36
收藏 1

一、分层结构


javabean
通用dao 接口(增删改查的方法  方法权限为默认) 使用反射  
通用daoImpl 一个实现通用dao接口的抽象方法     主要实现 dao接口各方法的具体操作   使用反射  注解@Transactional
service    一个继承通用dao接口的接口类(可以添加扩展功能)
serviceImpl 继承通用daoImpl实现service接口的方法 注解@Service       @Transactional
通用action 继承ActionSupport实现ModelDriven<T>接口     方法权限protected  
注解@Resource  注入所有要使用的service业务接口
action  继承通用action   注解@Controller             @Scope("prototype")
通用action代码 如下
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
 ///////////注入所有业务接口/////////
 @Resource
 protected XinZhongSiService xinZhongSiService;
 @Resource
 protected MessageService messageService;
 @Resource
 protected AdminLoginService adminLoginService;
 
 protected T model;
 public BaseAction(){
  try{
   ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
   Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0];
   model = clazz.newInstance();
  }catch(Exception e){
   throw new RuntimeException(e);
  }
 }
 public T getModel(){
  return model;
 }

}

通用DAO

public interface BaseDao<T> {
 void save(T entity);
 void delete(Integer id);
 void update(T entity);
 T getById(Integer id);
 List<T> getByIds(Integer[] ids);
 List<T> findAll();
}

通用daoImpl
@Transactional
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
 @Resource
 private SessionFactory sessionFactory;
 private Class<T> clazz;
 
 public BaseDaoImpl(){
  ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
  this.clazz =(Class<T>) pt.getActualTypeArguments()[0];
 }
 /*获取当前可用session*/
 protected Session getSession() {
  return sessionFactory.getCurrentSession();
 }
 @Override
 public void save(T entity) {
  getSession().save(entity);
 }


 @Override
 public void delete(Integer id) {
  Object obj = getById(id);
  if(obj!=null){
   getSession().delete(obj);
  }
 
 }

 @Override
 public void update(T entity) {
  getSession().update(entity);
 
 }

 @Override
 public T getById(Integer id) {
  if(id==null){
   return null;
  }else{
   return (T) getSession().get(clazz, id);
  }
 
 }

 @Override
 public List<T> getByIds(Integer[] ids) {
  if(ids==null||ids.length==0){
   return Collections.EMPTY_LIST;
  }else{

   return getSession().createQuery(//
     "FROM"+clazz.getSimpleName()+"WHERE id IN (:ids)")//
     .setParameterList("ids", ids)//
     .list();
   
  }
 
 }

 @Override
 public List<T> findAll() {
  return getSession().createQuery(//
    "FROM " + clazz.getSimpleName() +" m order by m.id desc")//
    .list();
 }
}



applicationContext.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=" http://www.springframework.org/schema/beans"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xmlns:context=" http://www.springframework.org/schema/context"
xmlns:aop=" http://www.springframework.org/schema/aop"
       xmlns:tx=" http://www.springframework.org/schema/tx"
xsi:schemaLocation=" http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
       <!-- 自动装配 -->
      <!--  <context:component-scan base-package="com.edu.zzuli.oracle.lesson"></context:component-scan> -->

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url}" />
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

</bean>
<!-- 配置外部数据库连接信息-->
<context:property-placeholder location="classpath:db.properties"/>
 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />

<property name="hibernateProperties">
<value>
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
current_session_context_class=thread
javax.persistence.validation.mode=none
</value>
    
     </property> 
    
        <property name="mappingLocations">
<list>
<value>classpath:blog/zzq/orm/*.hbm.xml</value>
</list>
</property>
</bean>
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--自动扫描  -->
<tx:annotation-driven transaction-manager="txManager"/>
<context:component-scan base-package="blog.zzq"></context:component-scan>
 </beans>


db.properties
jdbc.url=jdbc\:mysql\:///blog?createDatabaseIfNotExist\=true&useUnicode\=true&characterEncoding\=utf8
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=123456



log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

#
log4j.rootLogger=error, stdout

log4j.logger.com.edu.zzuli.oracle.lesson=debug

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
#log4j.logger.org.hibernate.SQL=debug



struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    " http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name="i18n.encoding" value="utf-8"/>
<!-- 配置为开发模式 -->
  <constant name="struts.devMode" value="true"/>
<constant name="struts.locale" value="zh_CN" />
 <constant name="struts.ui.theme" value="simple" />
 <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
  <constant name="struts.multipart.maxSize" value="1048576000"/>
  <constant name="struts.custom.i18n.resources" value="globalMessages" /> 
<package name="test" extends="struts-default" namespace="/">
<action name="XinZhongSi_*" class="blog.zzq.action.view.XinZhongSiAction" method="{1}">
<result name="index">/WEB-INF/jsp/client/XinZhongSi.jsp</result>
</action>
 </package>
  </struts>  

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
xmlns=" http://java.sun.com/xml/ns/javaee
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>
  <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  
  </listener>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value> 
  </context-param>
    <filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>

<!-- 解决懒加载的问题 -->
  
  <!-- struts2的主要拦截器 -->
  <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!-- 清除缓存监听防止内存泄漏 -->
  <listener>
 <listener-class>org.springframework.web.util.IntrospectorCleanupListener
 
 </listener-class> 
  </listener>
  
  <!-- 字符编码过滤器 -->
  <filter>
   <filter-name>encoding</filter-name>
   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
     <param-name>encoding</param-name>
     <param-value>UTF-8</param-value>
   </init-param>
   <init-param>
   <param-name>forceEncoding</param-name>
   <param-value>true</param-value>
   </init-param>
  </filter>
 
 
  </web-app>




© 著作权归作者所有

志强朱
粉丝 5
博文 209
码字总数 108290
作品 0
郑州
程序员
私信 提问
关于SSH整合开发的问题

学习SSH整合的时候,一开始觉得注解很难看懂,xml写起来虽然麻烦但是好理解。现在喜欢上了用注解,因为方便,但是问题又来了,不是挖掘机技术哈,我是发现当注解和xml搞在一起的时候,一团糟...

雨翔河
2014/10/11
186
3
SSH框架架构的问题

我们小组(学生)打算开发一个web系统,用SSH。我想问问 整合SSH的时候有什么需要注意的吗?比如,配置文件用不用新建一个source目录,struts使用配置文件呢还是注解呢?等等希望大家帮帮忙,我...

luger
2012/08/07
231
0
spring+hibernate+struts2零配置整合

  说句实话,很久都没使用SSH开发项目了,但是出于各种原因,再次记录一下整合方式,纯注解零配置。 一。前期准备工作 gradle配置文件: version '1.0-SNAPSHOT' apply plugin: 'war' rep...

java~nick
2018/03/21
0
0
SSH集成时使用注解代替实体映射hbm.xml文件的配置过程

在最原始的ssh开发中Hibernate需要配置hbm.xml实体映射文件,遇到表较多及表关系复杂时极其麻烦; 现在一般都会通过JAR包中的配置好的注解代替原来的这种配置: 在beans.xml配置文件(appli...

ZhangLG
07/02
17
0
深入理解注解(Annotation)

在现在的开发中,注解越来越多地应用到了开发中,无论是Servlet3.0新特性,还是SSH中的全注解,都给开发带来了极大的便利, 直观. 因此需要对注解有深入的理解. 一. 自定义注解 自定义注解的目...

长平狐
2012/09/03
272
0

没有更多内容

加载失败,请刷新页面

加载更多

Experts say the weaker pound is drawing investors to the UK tech sector

UK tech companies secured a record £5.5bn in foreign investment in the first seven months of this year, research shows. This was more than the amount invested per capita in th......

wowloop
25分钟前
5
0
Add support for Android 9-patch images in BorderImage

The 9-patch image implementation in Qt Quick Controls 1 is an internal implementation detail of the Android style. It cannot handle .9.png image files out of the box, but takes ......

shzwork
30分钟前
4
0
c/c++日期时间处理函数小结

日期时间处理函数: 日期时间转为字符串 strftime/std::put_time 字符串解析成日期时间 strptime/std::get_time 时间结构转换:time_t->tm localtime:time_t->tm 时间结构转换:tm->time_t ...

chuqq
34分钟前
5
0
Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处...

大涛学长
35分钟前
4
0
创龙基于Xilinx Artix-7系列FPGA处理器

SOM-TLA7是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板,可配套广州创龙Artix-7开发板使用。核心板尺寸仅70mm*50mm,采用沉金无铅工艺的10层板设计,专业的PCB Layout保证信号...

Tronlong创龙
41分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部