day48_电力系统框架搭建
来源:互联网 发布:手机淘宝应用未安装 编辑:程序博客网 时间:2024/06/05 15:43
项目第一天(项目框架)
1:项目介绍
参考:《项目分析笔记》和【文档】中的《国家电力系统技术点汇总(简历使用).doc》
2:项目框架(SSH)
第一步:创建数据库(格式:UTF-8)
创建表:
第二步:创建项目(格式:UTF-8)
导入jar包(SSH)
第三步:持久层
(1)在cn.itcast.elec.domain中创建ElecText.java
public class ElecText implements java.io.Serializable { private String textID; //主键ID private String textName; //测试名称 private Date textDate; //测试日期 private String textRemark; //测试备注 public String getTextID() { return textID; } public void setTextID(String textID) { this.textID = textID; } public String getTextName() { return textName; } public void setTextName(String textName) { this.textName = textName; } public Date getTextDate() { return textDate; } public void setTextDate(Date textDate) { this.textDate = textDate; } public String getTextRemark() { return textRemark; } public void setTextRemark(String textRemark) { this.textRemark = textRemark; }}
(2)在cn.itcast.elec.domain目录下,创
建ElecText.java对应的映射文件(ElecText.hbm.xml)
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="cn.itcast.elec.domain.ElecText" table="Elec_Text"> <id name="textID" type="string" column="textID"> <generator class="uuid"></generator> </id> <property name="textName" type="string" column="textName"></property> <property name="textDate" type="date" column="textDate"></property> <property name="textRemark" type="string" column="textRemark"></property> </class></hibernate-mapping>
(3)在src下创建hibernate.cfg.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 连接数据库的信息 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/itcastElec?useUnicode=true&characterEncoding=utf8</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 其他的配置 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> <!-- 加载映射文件 --> <mapping resource="cn/itcast/elec/domain/ElecText.hbm.xml"/> </session-factory></hibernate-configuration>
(4)使用junit在test包中进行测试(并且导入log4j的配置文件)
public class TestHibernate { /**测试保存*/ @Test public void save(){ Configuration configuration = new Configuration(); configuration.configure();//加载类路径hibernate.cfg.xml和映射文件 SessionFactory sf = configuration.buildSessionFactory(); Session s = sf.openSession(); Transaction tr = s.beginTransaction(); //测试操作对象的过程,就是操作数据库表 ElecText elecText = new ElecText(); elecText.setTextName("测试Hibernate名称"); elecText.setTextDate(new Date()); elecText.setTextRemark("测试Hibernate备注"); s.save(elecText); tr.commit(); s.close(); }}
第四步:DAO层
(1)在cn.itcast.elec.dao中创建2个接口(公用接口和业务接口)
公用接口:
public interface ICommonDao<T> { void save(T entity);}
业务接口(需要继承公共接口,并且指定泛型T所对应的对象:
public interface IElecTextDao extends ICommonDao<ElecText> { public static final String SERVICE_NAME = "cn.itcast.elec.dao.impl.ElecTextDaoImpl";}
(2)在cn.itcast.elec.dao.impl中创建2个接口的实现类
公用类(需要继承HibernateDaoSupport,这样可以方便使用HibernateTemplate对象):
public class CommonDaoImpl<T> extends HibernateDaoSupport implements ICommonDao<T> { /**使用@Resource注入SessionFactory*/ @Resource(name="sessionFactory") public final void setSessionFactoryDi(SessionFactory sessionFactory) { this.setSessionFactory(sessionFactory); } /**保存*/ public void save(T entity) { this.getHibernateTemplate().save(entity); }}
业务类(需要继承公用类,
这样可以使用公用类中的定义的方法)
@Repository(IElecTextDao.SERVICE_NAME)public class ElecTextDaoImpl extends CommonDaoImpl<ElecText> implements IElecTextDao {}
(3)在src创建spring的配置文件(beans.xml)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> <!-- 1:开启对注解的支持,组件的自动扫描,扫描在类上定义的@Controller @Service @Repositiry注解,范围是cn.itcast.elec的包 --> <context:component-scan base-package="cn.itcast.elec"/> <!-- 2:? 先不写,大家想想项目中应该添加什么?--> <!-- 3:创建SessionFactory,这是spring整合hibernate的核心 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 加载类路径下的hibernate.cfg.xml --><property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean> <!-- 4:声明事务管理器(切面) --> <bean id="trManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 5:注解,在Service的类或者是Service的方法上,添加@Transcational()注解,用来控制事务 --> <tx:annotation-driven transaction-manager="trManager"/> <!-- 也可以使用spring的配置文件的方式管理事务 <tx:advice id="aa" transaction-manager="trManager"> <tx:attributes> <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut expression="execution(* cn.itcast.elec.service..*.*(..))" id="bb"/> <aop:advisor advice-ref="aa" pointcut-ref="bb"/> </aop:config>--></beans>
4)使用junit完成测试
public class TestDao { /**测试保存*/ @Test public void save(){ //加载类路径下的spring容器 ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); //调用接口 IElecTextDao elecTextDao = (IElecTextDao) ac.getBean(IElecTextDao.SERVICE_NAME); //操作对象 ElecText elecText = new ElecText(); elecText.setTextName("测试Dao名称"); elecText.setTextDate(new Date()); elecText.setTextRemark("测试Dao备注"); elecTextDao.save(elecText); }}
注意:如果数据没有保存,需要设置事务自动提交:在hibernate.cfg.xml中添加:
<!-- 使用hibernate的方式提交事务(自动提交) --><property name="hibernate.connection.autocommit">true</property>
第五步:Service层
(1)在cn.itcast.elec.service中创建接口:
public interface IElecTextService { public static final String SERVICE_NAME = "cn.itcast.elec.service.impl.ElecTextServiceImpl"; void saveElecText(ElecText elecText);}(
2)在cn.itcast.elec.service.impl中创建接口的实现类:
@Service(IElecTextService.SERVICE_NAME)@Transactional(readOnly=true)public class ElecTextServiceImpl implements IElecTextService { @Resource(name=IElecTextDao.SERVICE_NAME) private IElecTextDao elecTextDao; @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false) public void saveElecText(ElecText elecText) { elecTextDao.save(elecText); }}
(3)使用junit测试
public class TestService { /**测试保存*/ @Test public void save(){ ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); IElecTextService elecTextService = (IElecTextService) ac.getBean(IElecTextService.SERVICE_NAME); //操作对象 ElecText elecText = new ElecText(); elecText.setTextName("测试Service名称"); elecText.setTextDate(new Date()); elecText.setTextRemark("测试Service备注"); elecTextService.saveElecText(elecText); }}
由于spring提供的声明式事务处理,进行事务的控制,在业务层的类和方法上定义@Transactional(),同时去掉hibernate.cfg.xml中的配置,由spring统一控制。去掉的代码是:
<!-- 使用hibernate的方式提交事务(自动提交) --><property name="hibernate.connection.autocommit">true</property>
第六步:控制层(MVC)
(1)在cn.itcast.elec.web.action中创建Action(业务Action)类和BaseAction(公用Action)
Action类:(注意:这里要设置成多例,即@Scop(value=prototype),因为struts2的Action是多实例,多线程)
@Controller("elecTextAction")@Scope(value="prototype")public class ElecTextAction extends BaseAction<ElecText>{ ElecText elecText = this.getModel(); @Resource(name=IElecTextService.SERVICE_NAME) private IElecTextService elecTextService; /**执行保存*/ public String save(){ //保存 elecTextService.saveElecText(elecText); return "save"; }}```
BaseAction类(封装模型驱动对象,HttpServletRequest和HttpServletResponse对象):
public class BaseAction<T> extends ActionSupport implements ModelDriven<T>,ServletRequestAware,ServletResponseAware { protected HttpServletRequest request; protected HttpServletResponse response; T entity; public BaseAction(){ /**泛型转换成真实类型(范类转换)*/ Class entityClass = TUtils.getTClass(this.getClass()); try { entity = (T) entityClass.newInstance(); } catch (Exception e) { e.printStackTrace(); } } public T getModel() { return entity; } public void setServletRequest(HttpServletRequest req) { this.request = req; } public void setServletResponse(HttpServletResponse res) { this.response = res; }}
(2)在cn.itcast.elec.util包下创建公用类(泛型转换)。
泛型转换的目的子类传递真实对象类型,在父类中使用泛型转换成真实对象类型。
以后util包下封装的就是公用类。
public class TUtils { /**泛型转换成真实类型(范类转换)*/ public static Class getTClass(Class entity) { ParameterizedType parameterizedType = (ParameterizedType) entity.getGenericSuperclass(); Class entityClass = (Class) parameterizedType.getActualTypeArguments()[0]; return entityClass; }}
(3)在src下创建struts2的配置文件struts.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <!-- 设置开发模式 --> <constant name="struts.devMode" value="true"></constant> <!-- 设置UI标签的主题 --> <constant name="struts.ui.theme" value="simple"></constant> <!-- 配置struts的URL访问的后缀,改成do(此处可以不修改,此时默认是.action) --> <constant name="struts.action.extension" value="do"></constant> <!-- 系统管理 --> <package name="system" namespace="/system" extends="struts-default"> <action name="elecTextAction_*" class="elecTextAction" method="{1}"> <result name="save">/system/textAdd.jsp</result> </action> </package></struts>
(4)在web.xml中添加配置:
<web-app version="2.5" 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_2_5.xsd"> <display-name></display-name> <!-- 配置struts2的过滤器,这是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> <!-- web容器启动的时候,自动加载spring容器(监听器) --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
(5)导入css,script,jsp,images进行测试使用system/textAdd.jsp进行测试:页面如图
点击【保存】完成。测试保存ElecText对象。
SSH整体架构图:
3:底层方法封装(CommonDaoImpl类)
public class CommonDaoImpl<T> extends HibernateDaoSupport implements ICommonDao<T> { /**泛型转换,获取真实对象实体*/ Class entityClass = TUtils.getTClass(this.getClass()); /**使用@Resource注入SessionFactory*/ @Resource(name="sessionFactory") public final void setSessionFactoryDi(SessionFactory sessionFactory) { this.setSessionFactory(sessionFactory); } /**保存*/ public void save(T entity) { this.getHibernateTemplate().save(entity); } /**更新*/ public void update(T entity) { this.getHibernateTemplate().update(entity); } /**使用主键ID,查询对象*/ public T findObjectByID(Serializable id) { return (T) this.getHibernateTemplate().get(entityClass, id); } /**使用主键ID,删除对象(删除一个或者多个对象)*/ public void deleteObjectByIDs(Serializable... ids) { if(ids!=null && ids.length>0){ for(Serializable id:ids){ Object entity = this.findObjectByID(id); this.getHibernateTemplate().delete(entity); } } } /**使用封装对象的集合,批量删除对象*/ public void deleteObjectByCollection(List<T> list) { this.getHibernateTemplate().deleteAll(list); } /**测试指定查询条件,查询结果集(不分页)*/ /** 这里1=1的目的是方便在Service层拼装sql或者hql语句,连接统一使用and * SELECT o FROM ElecText o WHERE 1=1 #Dao层填写 AND o.textName LIKE '%张%' #Service拼装 AND o.textRemark LIKE '%张%' #Service拼装 ORDER BY o.textDate ASC,o.textName desc #Service拼装 */ public List<T> findCollectionByConditionNoPage(String condition, final Object[] params, Map<String, String> orderby) { String hql = "SELECT o FROM "+entityClass.getSimpleName()+" o WHERE 1=1"; String orderByHql = this.initOrderByHql(orderby); final String finalHql = hql + condition + orderByHql; //执行hql语句 /**方式一:直接使用HibernateTemplate的find()方法,find方法支持执行hql语句*/ List<T> list = this.getHibernateTemplate().find(finalHql, params); /**方式二:获取SessionFactory,在获取Session*/ SessionFactory sf = this.getHibernateTemplate().getSessionFactory(); Session s = sf.getCurrentSession(); Query query = s.createQuery(finalHql); query.setParameter(0, params[0]); query.setParameter(1, params[1]); List<T> list = query.list(); /**方式三:使用hibernateTemplate调用回调函数*/ List<T> list = this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(finalHql); if(params!=null && params.length>0){ for(int i=0;i<params.length;i++){ query.setParameter(i, params[i]); } } return query.list(); } }); return list; } /**组织排序语句,将Map集合转换成String类型*/ private String initOrderByHql(Map<String, String> orderby) { StringBuffer buffer = new StringBuffer(""); if(orderby!=null && orderby.size()>0){ buffer.append(" ORDER BY "); for(Map.Entry<String, String> map:orderby.entrySet()){ buffer.append(map.getKey()+" "+map.getValue()+","); } //删除最后一个逗号 buffer.deleteCharAt(buffer.length()-1); } return buffer.toString(); }}
4:使用Maven开发系统
优点:自动从互联网中获取jar包,并实现了一步构建,这里要记住处于联网状态。
pom.xml的配置
依赖管理(导入对应的jar包)
通过坐标(定位到仓库中的包的位置,并将jar包导入到项目中,如果版本升级,只需要改动坐标即可)
详情请见:【技术资料/maven(附加)】
其中:ssh(整合SSH)里是ssh需要的pom.xml。
电力项目(整合电力项目)里是整个项目所有jar包的pom.xml,详情配置可以参考pom.xml文档。
第一步:在eclipse上配置maven
第二步:创建maven工程
新建一个maven工程
点击next【下一步】
结构图:
src/main/java:存放java文件
src/main/resources :存放配置文件
src/test/java:存放测试的java文件
src/test/resource:存放测试的资源文件
src/main/webapp:存放jsp,images,css,javascript页面
核心命令包括(大家记住这些,开发中就可以了):
Clean:清理
Compile:编译
Test:测试
Install:安装
Deploy:部署
详情请见【技术资料\maven(附加)】的《maven课堂.doc》
5:使用Svn版本控制
优点:使得项目组开发代码统一使用svn服务器进行版本控制
常用的命令:
Check out:取得与服务器的连接,并获取服务器上的代码(第一次使用)
Update:更新最新代码(每天早上必做的事情),本地获取服务器上最新的代码
Commit:提交
整合svn的步骤:详情请见【技术资料\svn(附加)】中的《svn.doc》
第一步:要求将开发项目的框架上传到svn的服务器上
(1)
(2)在项目中
选择Share Project
点击下一步
点击下一步
点击【提交】,上传到资源仓库中。
查看svn的资源库。
第二步:让项目组的其他成员,从svn服务器上获取代码,并进行开发
(1)选择项目源码,点击检出为。
点击下一步,完成
Svn的具体操作可以查看【技术资料\svn(附加)】中的《svn课堂.doc》
6:java代码的编码规范
参考【文档】中的《国家电力检测中心项目和设备资源管理系统开发规范.doc》
7:需要掌握的知识总结
重点:SSH框架的代码(struts2+spring+hibernate),底层公用方法的封装。
了解:maven,svn
- day48_电力系统框架搭建
- 电力系统项目学习(2)--框架搭建1-数据持久化
- 电力系统
- 电力系统
- 电力系统名词解释
- 电力系统相关
- 电力系统--杆塔
- 搭建框架
- 框架搭建
- 框架搭建
- 框架搭建
- 框架搭建
- 框架搭建
- 电力系统远动
- 如何学好电力系统!
- 电力系统问题300问
- 电力系统分析大纲
- 电力系统的颜色
- OSI七层模型——物理层
- git安装以及对github上代码托管批处理更新
- c++ 类文件的动态库生成及调用例子
- 基于spring注解切面的简单实现
- HELLO WORLD
- day48_电力系统框架搭建
- 使用Git命令---针对初学者
- Android 之 启动一个activity的最佳方法
- 必须记住这几种庄家洗盘的形态
- sklearn基本用法
- Android Activity生命周期和状态
- Runteim类的绍介
- POJ 1703 Find them, Catch them(种类并查集)
- HashSet