SSH整合实现简单的crud
SSH整合
参考资料SSH整合主要内容✓SSH整合概述✓应用IoC进行整合✓应用AOP进行整合✓Open Session In View模式1.框架与架构终于,我们学完了Struts、Spring、Hibernate(所谓“SSH”)三大框架,在实际开发中,合理的应用三大框架,才能发挥出各个框架的长处。
我们知道Struts作用于表现层,使表现层符合MVC结构,而Hibernate作用于数据访问层,使DAO能够通过ORM的方式操作数据库。
各个层之间的交互示意图如下:图1 未整合时框架的交互在未使用Spring整合时,这种架构固然能体现出Struts与Hibernate的优点,但也存在以下不足:1.层与层之间耦合性较大。
层之间的耦合主要体现在表现层依赖于业务层,业务层依赖于数据访问层。
在《软件设计与最佳实践》一书中曾介绍过依赖倒转原则,应针对接口编程,而不是实现类,遵照这一原则,我们应该为业务层的建立业务接口,具体的业务类实现接口,同样数据访问层应有数据访问接口。
但即使存在这些接口,在实例化时依然需要指定具体类,当具体类发生变化时会影响到其它层。
2.不能很好的处理事务。
事务的边界应该在业务层确定,但业务层中不应存在实现事务的具体代码,否则会与数据访问层的实现技术紧密耦合在一起(如业务层使用Session.beginTransaction则数据访问层必须用Hiberante技术实现,如果改用JDBC技术实现,则需要改动业务层的代码,违反了分层架构中一层发生变化不影响另一层的初衷),在未使用Spring技术的架构中,事务处理一直是比较头疼的问题。
2.Spring整合概述使用Spring对各个层进行整合可以避免上述不足,使用IoC特性可以有效解除层与层之间的依赖性,每一层不需要选择具体的实现类,而是通过Spring容器注入(图2)。
这样每一层的类可以真正做到只依赖于接口,而不是实现类。
当需要切换实现类时,修改Spring 的配置文件即可以实现,无需改动代码,重新编译。
基于SSH2架构的课程设计实训教学示例项目——《客户关系管理CRM系统》——合同信息的CRUD实现和测试
基于SSH2架构的课程设计实训教学示例项目——《客户关系管理CRM系统》——合同信息的CRUD实现和测试1.1.1合同信息的CRUD功能实现1、在项目中添加一个包装订单信息的PO类(1)类名称为ContractInfoPO,包名称为com.px1987.bluedreamcrm.dao.po(2)在PO类中添加如下的成员private int contract_ID; //合同IDprivate String contract_kindNumber; //合同类型private String contract_titleText; //合同标题private int customer_ID; //甲方签订人IDprivate String contract_secondName; //乙方签订人姓名private String contract_currentState; //合同状态private double contract_totalMoney; //合同总金额private java.sql.Date contract_signDate; //签订日期private java.sql.Date contract_deadLineDate; //截止日期private String contract_instructionText; //合同说明(3)为这些属性提供get/set方法(4)在该类中提供一个显示合同标题名称简称的方法public String getContractInfo_BriefTitleText() {//如果多于12个字符(汉字),则显示合同标题的简称if(contract_titleText.length()>12){return contract_titleText.substring(0, 8)+"...";}else{return contract_titleText;}}(5)在该类中提供如下的获得日期中的“年、月、日”数据的方法public int getContract_signDateYear() {return contract_signDate.getYear()+1900;}public int getContract_signDateMonth() {return contract_signDate.getMonth()+1;}public int getContract_signDateDate() {return contract_signDate.getDate();}public int getContract_deadLineDateYear() {return contract_deadLineDate.getYear()+1900;}public int getContract_deadLineDateMonth() {return contract_deadLineDate.getMonth()+1;}public int getContract_deadLineDateDate() {return contract_deadLineDate.getDate();}2、添加一个对产品信息进行操作的DAO接口(1)接口的名称为ContractInfoCRUDInterface,包名称为com.px1987.bluedreamcrm.dao.inter(2)设计该接口中的CRUD方法package com.px1987.bluedreamcrm.dao.inter;import java.util.List;import com.px1987.bluedreamcrm.dao.po.ContractInfoPO;import com.px1987.bluedreamcrm.dao.po.PageStatePO;import com.px1987.bluedreamcrm.exception.CRMDataAccessException;public interface ContractInfoCRUDInterface {/*** 分页查询所有的合同信息*/public List<ContractInfoPO> selectAllContractInfo(PageStatePO onePageStatePO) throws CRMDataAccessException;/*** 分页查询满足条件的合同信息*/public List<ContractInfoPO> selectSomeContractInfo(String sqlWhereString,PageStatePO onePageStatePO) throws CRMDataAccessException;/*** 查询指定编号的合同信息*/public ContractInfoPO selectOneContractInfo(int contractInfoID) throws CRMDataAccessException;/*** 查询合同信息的总数*/public int selectTotalContractInfoCounter() throws CRMDataAccessException;/*** 添加一条合同信息*/public boolean insertOneContractInfo(ContractInfoPO oneContractInfoPO) throws CRMDataAccessException;/*** 添加一条合同信息,并再次查询出该合同信息*/public ContractInfoPO insertOneContractInfoAndQueryIt(ContractInfoPO oneContractInfoPO) throws CRMDataAccessException;/*** 修改一条合同信息*/public boolean updateOneContractInfo(ContractInfoPO oneUpdatedContractInfoPO) throws CRMDataAccessException;/*** 删除一条合同信息*/public boolean deleteOneContractInfo(int contractInfoID) throws CRMDataAccessException;/*** 批量删除一批合同信息*/public boolean batchDeleteContractInfo(List<Integer> deletedContractInfoIDs) throws CRMDataAccessException;}3、为该ContractInfoCRUDInterface接口提供一个实现类(1)类名称为ContractInfoCRUDImple,包名称为com.px1987.bluedreamcrm.dao.imple,并且实现com.px1987.bluedreamcrm.dao.inter.ContractInfoCRUDInterface接口(2)编程该实现类package com.px1987.bluedreamcrm.dao.imple; import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.logging.Level;import java.util.logging.Logger;import com.px1987.bluedreamcrm.dao.inter.ConnectDBInterface;import com.px1987.bluedreamcrm.dao.inter.ContractInfoCRUDInterface;import com.px1987.bluedreamcrm.dao.po.ContractInfoPO;import com.px1987.bluedreamcrm.dao.po.PageStatePO;import com.px1987.bluedreamcrm.exception.CRMDataAccessException;public class ContractInfoCRUDImple implements ContractInfoCRUDInterface { private ConnectDBInterface oneDBCPConnectDBBean=null;private Connection oneJDBCConnection=null;private Logger logger = Logger.getLogger(this.getClass().getName());public ContractInfoCRUDImple() {oneDBCPConnectDBBean=new MySQLConnectDBBean();}@Overridepublic boolean batchDeleteContractInfo(List<Integer> deletedContractInfoIDs)throws CRMDataAccessException {PreparedStatement onePreparedStatement=null;String deleteContractInfoSql="delete from contract_info where contract_ID=?";boolean returnResult=true;oneJDBCConnection=oneDBCPConnectDBBean.getConnection();try{try {oneJDBCConnection.setAutoCommit(false); //开始事务onePreparedStatement=oneJDBCConnection.prepareStatement(deleteContractInfoSql);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {Iterator<Integer> allDeleteedContractInfoIDs=deletedContractInfoIDs.iterator();while(allDeleteedContractInfoIDs.hasNext()){int contractInfoIDToDeleted=((Integer)allDeleteedContractInfoIDs.next()).intValue();onePreparedStatement.setInt(1, contractInfoIDToDeleted);onePreparedStatement.addBatch();}} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象中的参数赋值,可能是参数不正确!");}try {onePreparedStatement.executeBatch();mit();} catch (SQLException e) {try {oneJDBCConnection.rollback();} catch (SQLException e1) {logger.log(, e.getMessage());throw new CRMDataAccessException("在批处理删除回滚时出现了错误!");}logger.log(, e.getMessage());throw new CRMDataAccessException("在执行批处理删除时出现了错误!");}try {onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}return returnResult;}@Overridepublic boolean deleteOneContractInfo(int contractInfoID)throws CRMDataAccessException {PreparedStatement onePreparedStatement=null;int returnResult=0;oneJDBCConnection=oneDBCPConnectDBBean.getConnection();String sqlDeleteCustomerStatement="delete from contract_info where contract_ID=?";try{try {onePreparedStatement=oneJDBCConnection.prepareStatement(sqlDeleteCustomerStatement);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {onePreparedStatement.setInt(1,contractInfoID);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象中的参数赋值,可能是参数不正确!");}try {returnResult=onePreparedStatement.executeUpdate();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行删除操作,可能是SQL不正确!");}try {onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}if(returnResult==0){return false;}else{return true;}}@Overridepublic boolean insertOneContractInfo(ContractInfoPO oneContractInfoPO)throws CRMDataAccessException {PreparedStatement onePreparedStatement=null;int returnResult=0;oneJDBCConnection=oneDBCPConnectDBBean.getConnection();try{StringBuffer sqlInsertContractInfoStatement=new StringBuffer();sqlInsertContractInfoStatement.append("insert into contract_info(contract_kindNumber,contract_titleText,");sqlInsertContractInfoStatement.append("customer_ID,contract_secondName,contract_curren tState,contract_totalMoney,");sqlInsertContractInfoStatement.append("contract_signDate,contract_deadLineDate,contract_ instructionText,contract_ID)");sqlInsertContractInfoStatement.append(" values(?,?,?,?,?,?,?,?,?,?)");try {onePreparedStatement=oneJDBCConnection.prepareStatement(sqlInsertContractInfoStatement.toString());} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL语句有错误!");}try {setInsertOrUpdateSQLParameterByContractInfoPO(onePreparedStatement,oneContractInfo PO);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象中的参数赋值,可能是参数不正确!");}try {returnResult=onePreparedStatement.executeUpdate();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行插入操作,可能是SQL不正确!");}try {onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}if(returnResult==0){return false;}else{return true;}}@Overridepublic ContractInfoPO insertOneContractInfoAndQueryIt(ContractInfoPO oneContractInfoPO) throws CRMDataAccessException { PreparedStatement onePreparedStatement=null;int returnResult=0;ResultSet oneResultSet=null;ContractInfoPO returnInsertedOneContractInfoPO=null;oneJDBCConnection=oneDBCPConnectDBBean.getConnection();//***************** 下面首先插入数据********************************** try{StringBuffer sqlInsertContractInfoStatement=new StringBuffer();sqlInsertContractInfoStatement.append("insert into contract_info(contract_kindNumber,contract_titleText,");sqlInsertContractInfoStatement.append("customer_ID,contract_secondName,contract_curren tState,contract_totalMoney,");sqlInsertContractInfoStatement.append("contract_signDate,contract_deadLineDate,contract_ instructionText,contract_ID)");sqlInsertContractInfoStatement.append(" values(?,?,?,?,?,?,?,?,?,?)");try {onePreparedStatement=oneJDBCConnection.prepareStatement(sqlInsertContractInfoStatement.toString());} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {setInsertOrUpdateSQLParameterByContractInfoPO(onePreparedStatement,oneContractInfo PO);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象中的参数赋值,可能是参数不正确!");}try {returnResult=onePreparedStatement.executeUpdate();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行插入操作,可能是SQL不正确!");}if(returnResult==0){throw new CRMDataAccessException("该合同信息没有正确地插入到数据库表中,可能是数据库系统出现了异常!");}//******************** 插入成功后再读取该数据*******************String sqlSelectContractInfoStatement="select * from contract_info where contract_ID=?";try {onePreparedStatement=oneJDBCConnection.prepareStatement(sqlSelectContractInfoStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {onePreparedStatement.setInt(1,oneContractInfoPO.getContract_ID());} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象中的参数赋值,可能是参数不正确!");}try {oneResultSet=onePreparedStatement.executeQuery();if(!oneResultSet.next()){return null;}} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行查询操作,可能是SQL不正确!");}returnInsertedOneContractInfoPO=new ContractInfoPO();try {contractInfoPO_ORMapping(returnInsertedOneContractInfoPO,oneResultSet);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能从结果集中获得所需要的数据值,可能是字段名称不正确!");}try {onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}return returnInsertedOneContractInfoPO;}private void setInsertOrUpdateSQLParameterByContractInfoPO(PreparedStatement onePreparedStatement,ContractInfoPO oneContractInfoPO) throws SQLException{onePreparedStatement.setString(1,oneContractInfoPO.getContract_kindNumber());onePreparedStatement.setString(2,oneContractInfoPO.getContract_titleText());onePreparedStatement.setInt(3,oneContractInfoPO.getCustomer_ID());onePreparedStatement.setString(4,oneContractInfoPO.getContract_secondName());onePreparedStatement.setString(5,oneContractInfoPO.getContract_currentState());onePreparedStatement.setDouble(6,oneContractInfoPO.getContract_totalMoney());onePreparedStatement.setDate(7,oneContractInfoPO.getContract_signDate());onePreparedStatement.setDate(8,oneContractInfoPO.getContract_deadLineDate());onePreparedStatement.setString(9,oneContractInfoPO.getContract_instructionText());onePreparedStatement.setInt(10,oneContractInfoPO.getContract_ID());}public void contractInfoPO_ORMapping(ContractInfoPO oneContractInfoPO,ResultSet oneResultSet) throws SQLException{oneContractInfoPO.setContract_ID(oneResultSet.getInt("contract_ID"));oneContractInfoPO.setContract_kindNumber(oneResultSet.getString("contract_kindNumber "));oneContractInfoPO.setContract_titleText(oneResultSet.getString("contract_titleText"));oneContractInfoPO.setCustomer_ID(oneResultSet.getInt("customer_ID"));oneContractInfoPO.setContract_secondName(oneResultSet.getString("contract_secondName "));oneContractInfoPO.setContract_currentState(oneResultSet.getString("contract_currentState" ));oneContractInfoPO.setContract_totalMoney(oneResultSet.getDouble("contract_totalMoney" ));oneContractInfoPO.setContract_signDate(oneResultSet.getDate("contract_signDate"));oneContractInfoPO.setContract_deadLineDate(oneResultSet.getDate("contract_deadLineDat e"));oneContractInfoPO.setContract_instructionText(oneResultSet.getString("contract_instruction Text"));}@Overridepublic List<ContractInfoPO> selectAllContractInfo(PageStatePO onePageStatePO)throws CRMDataAccessException {PreparedStatement onePreparedStatement=null;ResultSet oneResultSet=null;ContractInfoPO oneContractInfoPO=null;int totalNumberOfElements;List<ContractInfoPO> allContractInfoPOs=new ArrayList<ContractInfoPO>();oneJDBCConnection=oneDBCPConnectDBBean.getConnection();try{//***************** 首先获得满足条件的总记录数************************ String getTotalCounterSQLStatement="select count(*) from contract_info";try {onePreparedStatement=oneJDBCConnection.prepareStatement(getTotalCounterSQLStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {oneResultSet=onePreparedStatement.executeQuery();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行查询操作,可能是SQL不正确!");}try {oneResultSet.next();totalNumberOfElements = oneResultSet.getInt(1);} catch (SQLException e) {throw new CRMDataAccessException("不能从结果集中获得所需要的数据值,可能是字段名称不正确!");}onePageStatePO.setPageStatePOMemberProperty(totalNumberOfElements); //获得分页中的其它状态数据//*************** 然后再获得满足条件的具体记录数据******************* StringBuffer sqlSelectContractInfoStatement=new StringBuffer();sqlSelectContractInfoStatement.append("select * from contract_info limit ");sqlSelectContractInfoStatement.append(onePageStatePO.getThisPageFirstElementNumber()) ;sqlSelectContractInfoStatement.append(",");sqlSelectContractInfoStatement.append(onePageStatePO.getOnePageSize());try {onePreparedStatement=oneJDBCConnection.prepareStatement(sqlSelectContractInfoStatement.toString(), ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {oneResultSet=onePreparedStatement.executeQuery();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行查询操作,可能是SQL不正确!");}try{while(oneResultSet.next()){oneContractInfoPO=new ContractInfoPO();contractInfoPO_ORMapping(oneContractInfoPO,oneResultSet);allContractInfoPOs.add(oneContractInfoPO);}}catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能从结果集中获得所需要的数据值,可能是字段名称不正确!");}try {oneResultSet.close();onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}return allContractInfoPOs;}@Overridepublic ContractInfoPO selectOneContractInfo(int contractInfoID)throws CRMDataAccessException {ContractInfoPO oneContractInfoPO=null;PreparedStatement onePreparedStatement=null;ResultSet oneResultSet=null;oneJDBCConnection=oneDBCPConnectDBBean.getConnection();String sqlSelectContractInfoStatement="select * from contract_info where contract_ID=?";try{try {onePreparedStatement=oneJDBCConnection.prepareStatement(sqlSelectContractInfoStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {onePreparedStatement.setInt(1,contractInfoID);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象中的参数赋值,可能是参数不正确!");}try {oneResultSet=onePreparedStatement.executeQuery();if(!oneResultSet.next()){return null;}} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行查询操作,可能是SQL不正确!");}oneContractInfoPO=new ContractInfoPO();try {contractInfoPO_ORMapping(oneContractInfoPO,oneResultSet);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能从结果集中获得所需要的数据值,可能是字段名称不正确!");}try {oneResultSet.close();onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}return oneContractInfoPO;}@Overridepublic List<ContractInfoPO> selectSomeContractInfo(String sqlWhereString,PageStatePO onePageStatePO) throws CRMDataAccessException {PreparedStatement onePreparedStatement=null;ResultSet oneResultSet=null;ContractInfoPO oneContractInfoPO=null;int totalNumberOfElements;List<ContractInfoPO> allContractInfoPOs=new ArrayList<ContractInfoPO>();oneJDBCConnection=oneDBCPConnectDBBean.getConnection();try{//***************** 首先获得满足条件的总记录数*********************String getTotalCounterSQLStatement="select count(*) from contract_info "+sqlWhereString;try {onePreparedStatement=oneJDBCConnection.prepareStatement(getTotalCounterSQLStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {oneResultSet=onePreparedStatement.executeQuery();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行查询操作,可能是SQL不正确!");}try {oneResultSet.next();totalNumberOfElements = oneResultSet.getInt(1);} catch (SQLException e) {throw new CRMDataAccessException("不能从结果集中获得所需要的数据值,可能是字段名称不正确!");}onePageStatePO.setPageStatePOMemberProperty(totalNumberOfElements); //获得分页中的其它状态数据//**************** 然后再获得满足条件的具体记录数据*****************StringBuffer sqlSelectContractInfoStatement=new StringBuffer();sqlSelectContractInfoStatement.append("select * from contract_info ");sqlSelectContractInfoStatement.append(sqlWhereString);sqlSelectContractInfoStatement.append(" limit ");sqlSelectContractInfoStatement.append(onePageStatePO.getThisPageFirstElementNumber()) ;sqlSelectContractInfoStatement.append(",");sqlSelectContractInfoStatement.append(onePageStatePO.getOnePageSize());try {onePreparedStatement=oneJDBCConnection.prepareStatement(sqlSelectContractInfoStatement.toString(), ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能创建SQL语句对象,可能是SQL 语句有错误!");}try {oneResultSet=onePreparedStatement.executeQuery();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象进行查询操作,可能是SQL不正确!");}try{while(oneResultSet.next()){oneContractInfoPO=new ContractInfoPO();contractInfoPO_ORMapping(oneContractInfoPO,oneResultSet);allContractInfoPOs.add(oneContractInfoPO);}}catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能从结果集中获得所需要的数据值,可能是字段名称不正确!");}try {oneResultSet.close();onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}return allContractInfoPOs;}@Overridepublic int selectTotalContractInfoCounter() throws CRMDataAccessException { ResultSet oneResultSet=null;int totalContractInfoCounter;String select_SqlStatement="select count(*) from contract_info";oneJDBCConnection=oneDBCPConnectDBBean.getConnection();java.sql.PreparedStatement onePreparedStatement = null;try{try {onePreparedStatement =oneJDBCConnection.prepareStatement(select_SqlStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("SQL语句可能不正确!");}try {oneResultSet = onePreparedStatement.executeQuery();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("在统计合同信息总数时出现错误!");}try{oneResultSet.next();totalContractInfoCounter = oneResultSet.getInt(1);}catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能从结果集中获得所需要的数据值,可能是字段名称不正确!");}try {oneResultSet.close();onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}return totalContractInfoCounter;}@Overridepublic boolean updateOneContractInfo(ContractInfoPO oneUpdatedContractInfoPO) throws CRMDataAccessException {int returnResult=0;StringBuffer sqlUpdateContractInfoStatement=new StringBuffer();sqlUpdateContractInfoStatement.append("update contract_info set contract_kindNumber=?,contract_titleText=?,customer_ID=?,contract_secondName=?,");sqlUpdateContractInfoStatement.append("contract_currentState=?,contract_totalMoney=?,co ntract_signDate=?,contract_deadLineDate=?,");sqlUpdateContractInfoStatement.append("contract_instructionText=? where contract_ID=?");oneJDBCConnection=oneDBCPConnectDBBean.getConnection();PreparedStatement onePreparedStatement =null;try{try {onePreparedStatement = oneJDBCConnection.prepareStatement(sqlUpdateContractInfoStatement.toString());} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("SQL语句可能不正确!");}try {setInsertOrUpdateSQLParameterByContractInfoPO(onePreparedStatement,oneUpdatedCont ractInfoPO);} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能对SQL语句对象中的参数赋值,可能是参数不正确!");}try {returnResult=onePreparedStatement.executeUpdate();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("在修改合同信息数据库表时出现错误!");}try {onePreparedStatement.close();} catch (SQLException e) {logger.log(, e.getMessage());throw new CRMDataAccessException("不能正确地关闭SQL语句对象!");}}finally{oneDBCPConnectDBBean.closeDBConnection();}if(returnResult==0){return false;}else{return true;}} }。
SSH 整合案例总结
SSH 整合总结(struts、spring、hibernate)--作者:jch 整合SSH其实并不难,但它却是一个困扰我很长一段时间的问题,自从我从事java开发工作以来我都是用的现成的SSH框架、没有去具体了解过。
所以在这之前我还没有去自己实现过SSH框架的整合。
我感觉这样不行的,凡是都要去了解一下,以便在以后的工作中更得心应手。
所以我自己去实现SSH框架的整合,这样也可以让自己更深入理解框架。
在这里我做了一个SSH框架整合的总结。
以下是详细过程。
1、structs框架的搭建,在src下面新建struts.xml文件struts.xml具体配置如下:<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="struts2"extends="struts-default"><action name="login"class="loginAction"method="login"><result name="success">index.jsp</result><result name="input">login.jsp</result><result name="error">login.jsp</result></action></package></struts>注意:具体的package配置由个人需要而定,需要值得注意的是Action的class属性在这里不是com.jch.sshframework.action.LoginAction(这里是我的Action路径),而是和Spring的ApplicationContext.xml文件中的bean的ID相对应的,这样是把Action交给了Spring管理如:ApplicationContext.xml中的配置,具体如下:<bean id="loginAction"class="com.jch.sshframework.action.LoginAction" scope="prototype">2、hibernate框架的搭建A.下面是hibernate.cfg.xml的具体配置<?xml version='1.0'encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/hibernate-configuration-3.0.dtd"> <hibernate-configuration><session-factory><propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</propert y><propertyname="hibernate.connection.url">jdbc:mysql:///test</property><property name="ername">root</property><property name="hibernate.connection.password">root</property><propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto">update</property><property name="show_sql">true</property><mapping resource="User.hbm.xml"/>//mapping是对应的*.hbm.xml,这里不用多说了,我这里是为User建立的</session-factory></hibernate-configuration>说明:hibernate.cfg.xml配置就这么简单,下面看一下*.hbm.xml的配置B. 这里是*.hbm.xml的配置<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.jch.sshframework.entry"> <class name="User"><comment>Users may bid for or sell auction items.</comment><id name="id"><generator class="native"/></id><property name="name"/><property name="age"/></class></hibernate-mapping>注意:我这里为我的User对象创建的hibernate-mapping,只有id,name,age三个属性,如果你有其他对应的数据库的表的对象加进来就对了,到这里我们就把hibernate的配置文件创建完了。
SSH整合
一说起传说中的SSH(Struts+Spring+Hibernate)架构,许多人的心里面就没有底。
依照本人来看,所谓的整合没有什么神秘的,只不过就是让三个框架在一起协同的工作,我们做的主要工作就是让其知道彼此的存在,打成“统一战线联盟”以后,再各自为战,互不干扰。
下面就本人知道的一些整合方法一一叙述。
1 Struts+Spring主要就是让Struts知道Spring的存在,我们可以采用两种办法。
(1)运用Struts的插件方法,添加struts-congif.xml的<plug-in>节点。
示例代码如下:xml 代码<plug-in className="org.springframework.web.struts.ContextL oaderPlugIn"><set-property property="contextConfigLocation" valu e="/WEB-INF/applicationContext.xml" /></plug-in>上段代码意图很简单:把Struts的配置文件和Spring的配置文件联系起来,这样Struts就知道了Spring的存在。
另外,在web.xml里面需要配置一个Spring的监听器,示例代码如下:xml 代码<listener><listener-class>org.springframework.web.context.C ontextLoaderListener</listener-class></listener>第一种方法完毕。
(2)直接在web.xml里面进行加载。
这种方法与上种方法的不同之处在于Spring的配置文件加载的位置不同,上种方法是在struts-cong.xml中声明,而这种方法是在web.xml里面进行声明,示例代码如下:xml 代码<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext-module1.xml, /WEB-INF/applicationContext-module2.xml </param-value></context-param>这样我们就实现了第二种方法的SS整合。
SSH框架组合开发J2EE流程总结
SSH框架组合开发J2EE流程总结1.主要说明SSH各部分的作用:1>Struts,Struts总的来说就是两个字--"动作"全程通过struts-config.xml进行配置动作,配置表单,配置动作以及转发:主要有ActionForm,Action的书写(Action我建议用Struts的DispathAction,后面在Spring 的配置的时候大大减少配置量)和struts-config.xml的配置!2>hibernate,hibernate总的来说就是三个字--"持久层"主要负责持久层:通过hibernate.cfg.xml配置数据库的连接,配置javabean的数据库映射xml文件,书写持久层,这里的持久层Manager,通过spring注入的DAO数据库的实现完成一些方法,其中hibernate 的DAO要通过Spring提供的HibernateDaoSupport类,进行方法的实现与数据库的增删改,更新等操作.3>spring,spring总的来说就是两个字--"管理",管理整个流程,对事务的管理,对hibernate的管理(创建数据库的连接),对Struts的管理(管理Struts 全部的动作),管理hibernate的Manager和Dao(主要是对Manager中的dao进行对象的注入).2.主要的配置和代码:1>.总的配置web.xmlweb.xml是J2EE web方向的心脏,配置如下:<web-app><!--配置struts--><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param><param-name>debug</param-name><param-value>3</param-value></init-param><init-param><param-name>detail</param-name><param-value>3</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><!-- 配置spring --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext-*.xml</param-value><!--这里有三个spring的配置文件applicationContext-actions,applicationContext-beans,applicationContext-commons--> </context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</liste ner-class></listener><!-- 这是Spring中的一个编码过滤器--><filter><filter-name>Spring character encoding filter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-cla ss><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>Spring character encoding filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 这个过滤器是用在一个页面请求时,打来Session,生成完页面生关闭Session,这样就可以解决laze --><filter><filter-name>hibernateFilter</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInView Filter</filter-class></filter><filter-mapping><filter-name>hibernateFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--spring来对hibernate的应用--></web-app>web.xml主要配置基本的动作转发交给struts-config.xml,Spring的监听器listener:org.springframework.web.filter.CharacterEncodingFilter,乱码的处理UTF-8,和hibernate的小配置org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.2>Struts的配置:Struts-config配置(主要介绍Action的配置,这里的Action为DispathAction)<action-mappings><!--这个进行User的全部操作,一般为这种款式的链接/User.do?Action=login--><action path="/User"type="org.springframework.web.struts.DelegatingActionProxy"name="UserActionForm"parameter="Action"scope="request"validate="false"><!-- 登陆转发页面--><forward name="Login_Success" path="/user/ShowMessage.jsp"/><forward name="Login_Failed" path="/login_f.jsp" /></action>Action由操作业务层要用到Spring的注入(构造/设置)的Manager,我代码:XXXAction extemds DispathAction{private VideoManager videoManager;//设置注入public void setVideoManager(VideoManager videoManager) {this.videoManager = videoManager;}//后面就可以直接用videoManager去操作业务层了,}//这里为什么能注入videoManager,是因为这里的XXXAction由Spring管理,而Struts的Action只是通过org.springframework.web.struts.DelegatingActionProxy让Spring来管理,当产生这个动作,Spring就set注入videoManager到XXXAction的类中.所以这里videoManager 有值!!!3>hibernate的配置主要的hibernate.cfg.xml和javabean的映射,DAO的书写问题hibernate.cfg.xml和javabean的映射没有什么变化(单用hibernate的经验就ok),主要是DAO的实现问题:这里可以用Spring提供的类HibernateDaoSupport,很好很强大,这样就不必担心事务(Spring会自动处理),而只是写简短的代码,简化操作,这又体现Spring的管理!!!简短代码展示:XXXDAOImp extends HibernateDaoSupport implements XXXDAO {public void AddMusic(MusicTO music) throws Exception {getHibernateTemplate().save(music);}//这就是添加音乐的代码,够简短吧}这里的XXXDAOImp也要纳入到Spring的管理之中(见后面的Spring配置,主要对Manager里面的DAO进行注入)4>Spring的配置a.applicationContext-actions.xml主要对Struts的动作进行配置(管理全部的Struts 动作)<!-- 对user的全部的Action进行处理,这里用到了DispatchAction,链接形如:NovaMedia/User.do?Action=Login--><bean name="/User" class="erAction"><property name="userManager" ref="userManager"></property><property name="musicManager" ref="musicManager"></property></bean>b.applicationContext-beans.xml主要对hibernate里面的DAO和Manager进行全部的配置(管理hibernate)<!-- GREATWQS说明:这个只是配置一切的DAO和Manager的配置和联系--><bean id="adminDAO" class="greatwqs.hibernate.dao.imp.AdminDAOImp"><property name="sessionFactory" ref="sessionFactory"></property></bean><bean id="adminManager"class="greatwqs.spring.service.imp.AdminManagerImp"><property name="adminDAO" ref="adminDAO"/></bean><!--配置管理员的DAO和Manager完毕-->c.applicationContext-commons.xml主要配置(Spring的基本配置)<beans><!--GREATWQS说明:这个配置文件是针对spring的常用的功能进行的配置:sessionFactory,事务,AOP等的配置--><!-- 配置SessionFactory --><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"><value>classpath:hibernate.cfg.xml</value></property></bean><!-- 配置事务管理--><bean id="TxManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property></bean><!-- 配置事务的传播性--><tx:advice id="txAdvice" transaction-manager="TxManager"><tx:attributes><!--propagation="REQUIRED"有事务则直接用,无事务则直接开启--><tx:method name="Add*" propagation="REQUIRED"/><tx:method name="Delete*" propagation="REQUIRED"/><tx:method name="Modify*" propagation="REQUIRED"/><tx:method name="*" read-only="true"/></tx:attributes></tx:advice><!-- 配置那些类的那些方法参与事务--><aop:config><aop:pointcut id="pointcut" expression="execution(*greatwqs.hibernate.dao.imp.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/><!--这里进行应用上面的配置属性,失误的传播属性等方案--> </aop:config></beans>。
SSH 搭建点滴
SSH 搭建点滴前言初学三大框架,懵懵懂懂,似是而非,云里雾里的,趁着眼下思路还算清晰,赶紧做个笔记,以备不时之需。
开工三大框架,各有利弊,分开来用都是没的说,但是怎么能让它们整合起来发挥出各自的优势,却不是那么容易。
下面先列出我的项目目录图,以便于参照。
第一步:导入相关jar包关于jar包,真的是让人又爱又恨的一个存在。
版本之间不同的话,冲突还是很大的,尤其是大项目,依赖的jar包更是一个难题。
与之相比,Maven的存在在很大程度上解决了这个问题,仓库设置的恰当的话,更是一种享受。
为了更好的锻炼自己的能力,今天我还是按照原始的做法,从Dynamic Web Project开始吧。
一般来说,jar包都是项目经理或者团队之间预先准备好的,一方面可以解决版本问题,另一方面也能很好的管理团队的开发,维护。
然后还可以add to build path.方面后续的操作。
第二步:搭建Strtus2环境我自己对于Struts2的理解,就是一个“前端(这是相对的概念,相对于整个项目而言)”的信使,管理着客户端发来的请求,然后把请求转发给不同的action来处理。
底层必然是使用FilterDispatcher了,这里就不过多讲述这方面的细节吧。
搭建环境也是非常清晰,大致分为以下两步。
创建action和struts.xml刚才也说过了,请求是要经过特定的action来处理的,action相当于咱们的第一道“防线”。
下面在com.hailstudio.action包下创建一个UserAction,继承自ActionSupport类即可。
(这样方便请求的处理操作)。
然后是在src目录下创建一个strtus.xml文件。
注意好里面的schema约束和相对于action的设置,下面我给出我的案例。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="struts2" extends="struts-default" namespace="/"><!-- 为了防止action被spring和strtus2加载两次,class的值写成spring的bean的id 的值即可。
详细的SSH框架的整合与开发
详细的SSH框架的整合与开发开发环境:Struts 2.1 + Spring 3.0 + Hibernate 3.3+SQLServer2005 编程环境:MyEclipse8.6整合步骤与原理分析:一、新建工程:SSHLoginWeb工程创建完毕后,从开发环境中,我们可以看到MyEclipse为我们创建了一个JSP主页面——index.jsp一个Web工程配置文件——web.xml打开配置文件web.xml,可以发现:它只定义了一个欢迎页——index.jsp。
二、增加Struts功能支持如图,选中工程,右单击添加Struts功能支持。
随后,在弹出的窗体上选择struts2.1,选择Struts2核心库(注意:Struts2 Spring Libraries是整合Spring所必须的,但是,现阶段如果不使用Spring,就不要添加这个库,否则,测试可能失败)。
单击“Finish”,完成Struts功能添加。
注意: 添加Struts功能支持时,不要启动Tomcat服务器,以库免添加失败。
另外,Struts2的默认后缀名为*.action,可以根据个人爱好修改。
完成Struts2组件添加后,可以发现:除了新增加了一个Struts2的配置文件struts.xml 外,Struts2在web.xml配置文件中还添加了自己的控制器及HTTP请求的过滤器映射,内容如下:<!——定义控制器名称及实现的类文件——><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFi lter</filter-class></filter><!——定义过滤器映射——><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.action</url-pattern></filter-mapping>完成上述配置修改后,以后发送给该工程的HTTP请求,如果是以*.action结尾,则请求会转发给控制器StrutsPrepareAndExecuteFilter处理。
SSH整合(自己整理)
</property>
###################面试AOP的时候该怎么答################################################################
可以拿出一张纸笔,给他画个箭头,然后中间截断,告诉他这就是AOP。举个例子,某个方法正运行时候,前面加日志,
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
即可完成Template method
(5).使用HibernateDaoSupport
在(4)的步骤上,将所有的实现类继承一个继承了HibernateDaoSupport的超类,将hibernateTemplate通过这个超类注入,在超类中@Resource的方法这样写:
在beans.xml文件中定义Transaction
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
导入数据库相关jar包:mysql-connector-java-5.1.6-bin.jar /ojdbcxxx.jar
导入数据库连接池的相关包:commons-pool.jar common-dbcp-1.4.jar
SSH框架整合
struts 控制用的hibernate 操作数据库的spring 用解耦的Struts 、spring 、Hibernate 在各层的作用1 )struts 负责web 层 .ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forward 到对应的网页。
在struts-config.xml 中定义<action-mapping>, ActionServlet 会加载。
2 )spring 负责业务层管理,即Service (或Manager).1 .service 为action 提供统计的调用接口,封装持久层的DAO.2 .可以写一些自己的业务方法。
3 .统一的javabean 管理方法4 .声明式事务管理5. 集成Hiberante3 )Hiberante ,负责持久化层,完成数据库的crud 操作hibernate 为持久层,提供OR/Mapping 。
它有一组 .hbm.xml 文件和POJO, 是跟数据库中的表相对应的。
然后定义DAO ,这些是跟数据库打交道的类,它们会使用PO 。
在struts+spring+hibernate 的系统中,对象的调用流程是:jsp-> Action -> Service ->DAO ->Hibernate 。
数据的流向是ActionFormBean 接受用户的数据,Action 将数据从ActionFromBean 中取出,封装成VO 或PO,再调用业务层的Bean 类,完成各种业务处理后再forward 。
而业务层Bean 收到这个PO 对象之后,会调用DAO 接口方法,进行持久化操作。
spring:Aop管理事务控制,IoC管理各个组件的耦合,DaoTemplate作为常规持久层的快速开发模板!struts:控制层Action,页面标签和Model数据,调用业务层Hibernate:负责数据库和对象的映射,负责DAO层(Data Access Object:数据访问)spring整合hibernate和struts,只要在配好了applicationContext.xml,在struts的action中直接调用就可以了。
SSH 框架整合步骤详细讲解-8页精选文档
基于myeclipse 8.6M1 的三大框架整合(spring3.0+strut 2.1+hibernate 3.3+mysql)Xiangyun2019-4-9目录1、编写目的 (2)2、搭建环境 (2)3、配置数据源 (2)4、开始创建工程 (3)5、增加Spring框架: (3)6、增加Hibernate框架: (4)7、增加strut2 框架 (5)8、配置Web.xml (5)9、映射实体类 (5)10、编写service和action (6)11、在applicationContext.xml 配置service、action和配置 (7)12、创建index.jsp 和welcome.jsp (7)13、测试(此测试版本如下图) (7)14、总结 (7)1、编写目的最近在学习spring3.0+strut 2.1+hibernate 3.3整合,这期间出现了很多问题,在网上找了若干的实例均有不同程度的问题,为了让想要学习这个整合的人少走弯路,特写下这篇文章,希望对大家有所帮助,如果有很么问题可以与我联系,Email:237567685@qq测试版本代码地址:/detail/goumin1818/5241012(建议先按照此文档自己动手搭建以下,有需要再下载完整的例子)2、搭建环境Myeclipse 8.6M1Tomcat 6.0Mysql 5.2JDK 1.6数据库脚本程序CREATE TABLE `user` (`id` int(20) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(50) DEFAULT NULL,`password` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)insert into `user`(`id`,`username`,`password`) values(1,'admin','admin'),(2,'zhangsan','zhangsan');3、配置数据源在myeclipse 右上角打开Myeclipse Database Explorer 数据库管理视图右键鼠标,弹出框,选择New 新建Database Driver如下图:在Driver Template 中选择:在Driver name :写上名字可以随便写(这里测试写的是:mysql )在Connection URL 填写好链接地址:jdbc:mysql://localhost:3306/text填好自己数据库用户名和密码增加mysql驱动jar包在Driver JARs 点击Add JARs 找到mysql驱动jar 包(此测试使用的驱动jar 包是:mysql-connector-java-5.1.5-bin.jar)需要填写的东西都填写好后,最后进行测试下,是否可以链接成功。
SSH的整合及工作原理
三、这时请求以经到达业务逻辑类,而在业务逻辑类里面我们又会调用dao类,还是那句话,spring是通过接口来松散藕合的,所以我们会定义一个dao类的接口,并设置为业务逻辑类里面的一个属性,生成对应的set方法,主要是为了等会spring的ioc注入,同时我们要在spring配置文件中配置DAO类,并为业务逻辑类里面的dao接口属性设置值,值就是上面在spring中配置的dao类实例,调用方法。
</list>
</property>
</bean>
SSH的工作原理:
一、客户端发送一个请求到服务器,服务器将请求路径转交给spring代理,这时spring容器就解析请求路径,找到对应的action,并实例化。
二、这时请求到达action,而在action里面我们会调用业务逻辑类(biz),同时spring是通过接口来松散藕合的,所以我们会定义一个业务逻辑类的接口定义,并设置为action里面的一个属性,生成对应的set方法,主要是为了等会spring的ioc注入,同时,我们要在spring的配置文件中配置业务逻辑类,并为action类里面的业务逻辑类接口属性设置值,值就是上面在spring中配置的业务逻辑类实例。调用方法。到此,spring与struts合作工作结束。
</props>
</property>
</bean>
<!-- 自动代理 -->
<bean id="autoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
ssh三大框架整合
ssh三⼤框架整合Hibernate框架 1 hibernate核⼼配置⽂件 (0)orm思想 - 对象关系映射 (1)数据库信息 (2)hibernate信息 (3)映射配置 (4)hibernate核⼼配置⽂件 - 如果单纯使⽤hibernate框架,核⼼配置⽂件名称 hibernate.cfg.xml和位置 src下⾯固定的 - hibernate和spring整合时候,hibernate核⼼配置⽂件名称和位置没有固定要求的 2 hibernate映射配置⽂件 (1)实体类和数据库表映射关系—使⽤orm思想 3 hibernate操作的步骤 (1)在spring框架对hibernate框架进⾏封装,使⽤hibernateTemplateStruts2框架 1 Action操作 (1)action创建三种⽅式 - 继承类 ActionSupport (2)配置action访问路径 - 创建struts.xml配置⽂件,这个⽂件名称和位置固定 src下⾯的 (3)配置访问action的多个⽅法 - 使⽤通配符⽅式配置 (4)在action获取表单提交数据 - 获取request对象 ** 使⽤ServletActionContext类获取 - 属性封装 - 模型驱动(重点) - 表达式封装 (5)在action操作域对象 - 使⽤ServletActionContext获取域对象 (6)配置struts2的过滤器 2 值栈 (1)向值栈放数据 - set⽅法 - push⽅法 - 定义变量,⽣成get⽅法 (2)从值栈获取数据 - 在jsp中使⽤struts2标签+ognl获取 - <s:property> - <s:iterator> 3 拦截器 (1)aop和责任链模式 (2)⾃定义拦截器 - 继承MethodFilterInterceptor - 重写类⾥⾯的⽅法 - 配置拦截器和action关联Spring框架 1 spring核⼼配置⽂件 (1)名称和位置没有固定要求 (2)在spring核⼼配置⽂件中引⼊schema约束 2 创建对象 (1)xml配置⽅式:<bean id=”” class=”” scope=””/> (2)注解⽅式:四个注解 3 注⼊属性(对象类型属性) (1)xml配置⽅式: (2)注解⽅式:两个注解 - autowired - resource 3 使⽤ServletContext对象和监听器实现 (1)在服务器启动时候,加载spring配置⽂件,创建对象 (2)配置spring的监听器 (3)指定spring配置⽂件位置 4 jdbcTemplate 5 spring事务配置 (1)xml⽅式 (2)注解⽅式SSH框架整合思想 1 三⼤框架应⽤在javaee三层结构 2 struts2框架和spring整合 (1)struts2的action在spring配置 3 spring框架和hibernate框架整合 (1)hibernate的sessionFactory交给spring配置 (2)把hibernate数据库配置交给spring配置整合struts2和spring框架 1 把struts2的action交给spring管理 2 实现过程 第⼀步导⼊struts2的jar包 (1)导⼊⽤于整合的jar包 (log4j.properties为log4j的⽇志输出格式,放⼊src下⾯) (2)Spring为了整合Struts还需要额外再导⼊⼀个jar包:(该包在struts的lib⽬录下) (3)导⼊Struts2的jar包(struts2版本为2.3.24): (4)创建Actionpublic class UserAction extends ActionSupport {public String execute() throws Exception {System.out.println("Success....");return NONE;}} (5)创建Strut2的核⼼配置⽂件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""/dtds/struts-2.3.dtd"><struts><package name="demo" extends="struts-default" namespace="/"><action name="userAction" class="erAction"></action></package></struts> (6)在web.xml中配置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> (7)导⼊Spring整合Web项⽬的jar包,也就是监控项⽬启动的监听器所在的jar包 (8)创建Spring的核⼼配置⽂件并在其中引⼊约束<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd/schema/aop/schema/aop/spring-aop.xsd/schema/tx/schema/tx/spring-tx.xsd"></beans> (9)把action交给Spring进⾏配置1 <!-- 配置action的对象 -->2 <!-- 注意action是多实例的,因此我们这⾥把scope配置为prototype的 -->3 <bean id="userAction" class="erAction" scope="prototype"></bean> ①在spring配置action对象,在struts.xml中也配置action对象 ②解决: 只需要在spring⾥⾯配置action对象,不要在struts.xml中配置<struts><package name="demo1" extends="struts-default" namespace="/"><!-- class属性⾥⾯不写action全路径了,因为写,action对象创建两次写spring配置的action的bean的id值--><action name="userAction" class="userAction"></action></package></struts> 可以这样写的原因是我们导⼊了⼀个Spring整合Struts2的jar包:struts2-spring-plugin-2.3.24.jar (10)web.xml中Spring监听器的配置<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:bean.xml</param-value></context-param> (11)测试准备 ①所需的为Struts2的核⼼配置⽂件:struts.xml ②Spring的配置⽂件:bean.xml ③项⽬的配置⽂件:web.xml ④Struts2的UserAction类 ⑤在UserAction中对UserService的调⽤ ⑥UserService中对UserDao的调⽤ ⑦UserDao类的编写struts.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""/dtds/struts-2.3.dtd"><struts><package name="demo1" extends="struts-default" namespace="/"><!-- class属性⾥⾯不写action全路径了,因为写,action对象创建两次写spring配置的action的bean的id值--><action name="userAction" class="userAction"></action></package></struts>bean.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd/schema/aop/schema/aop/spring-aop.xsd/schema/tx/schema/tx/spring-tx.xsd"><bean id="userAction" class="erAction"><property name="userService" ref="userService"></property></bean><bean id="userService" class="erService"><property name="userDao" ref="userDaoImp"></property></bean><bean id="userDaoImp" class="erDaoImp"></bean></beans>web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" <display-name>spring-day4-ssh</display-name><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:bean.xml</param-value></context-param><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><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list></web-app>UserAction.javaimport com.opensymphony.xwork2.ActionSupport;import erService;public class UserAction extends ActionSupport {private UserService userService;public void setUserService(UserService userService) {erService = userService;}public String execute() throws Exception {userService.add();return NONE;}}UserService.javapublic class UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {erDao = userDao;}public void add() {userDao.add();}}UserDao.java 其实现类public class UserDaoImp implements UserDao {public void add() {System.out.println("UserDaoImp....");}} (12)测试结果: 可以在后台观察到如下测试结果:image ⾄此,Spring和Struts2的整合已经完毕,然后是Spring对Hibernate的整合了。
01、SSH框架整合
1. ssh框架整合通常说的ssh框架,是指Struts,Spring,Hibernate三个Java EE框架,我们在企业级应用开发的时候,通常是将这3个框架结合在一起,来完成企业应用的开发。
那我们就学习一下,怎么将这3个框架整合在一起工作:1.1. 整合步骤1.1.1. 第一步:新建maven工程,要是war类型1.1.2. 第二步:引入3个框架的jar包1.<dependencies>2.<!-- Struts2核心包-->3.<dependency>4.<groupId>org.apache.struts</groupId>5.<artifactId>struts2-core</artifactId>6.<version>2.3.15.3</version>7.</dependency>8.<dependency>9.<groupId>org.apache.struts</groupId>10.<artifactId>struts2-convention-plugin</artifactId>11.<version>2.3.15.1</version>12.</dependency>13.<!-- Struts2集成spring需要用的包-->14.<dependency>15.<groupId>org.apache.struts</groupId>16.<artifactId>struts2-spring-plugin</artifactId>17.<version>2.3.15.3</version>18.</dependency>19.20.21.<!-- servlet 3.x -->22.<dependency>23.<groupId>javax.servlet</groupId>24.<artifactId>javax.servlet-api</artifactId>25.<version>3.1.0</version>26.</dependency>27.<!-- junit测试包-->28.<dependency>29.<groupId>junit</groupId>30.<artifactId>junit</artifactId>31.<version>4.8.1</version>32.<scope>test</scope>33.</dependency>34.<dependency>35.<groupId>javax.servlet.jsp</groupId>36.<artifactId>jsp-api</artifactId>37.<version>2.2</version>38.</dependency>39.40.<!-- spring依赖的包-->41.<dependency>42.<groupId>org.springframework</groupId>43.<artifactId>spring-core</artifactId>44.<version>4.1.6.RELEASE</version>45.</dependency>46.<dependency>47.<groupId>org.springframework</groupId>48.<artifactId>spring-beans</artifactId>49.<version>4.1.6.RELEASE</version>50.</dependency>51.<dependency>52.<groupId>org.springframework</groupId>53.<artifactId>spring-context</artifactId>54.<version>4.1.6.RELEASE</version>55.</dependency>56.<dependency>57.<groupId>org.springframework</groupId>58.<artifactId>spring-tx</artifactId>59.<version>4.1.6.RELEASE</version>60.</dependency>61.<dependency>62.<groupId>org.springframework</groupId>63.<artifactId>spring-jdbc</artifactId>64.<version>4.1.6.RELEASE</version>65.</dependency>66.<dependency>67.<groupId>org.springframework</groupId>68.<artifactId>spring-web</artifactId>69.<version>4.1.6.RELEASE</version>70.</dependency>71.<!-- spring aop的第三方依赖包-->72.<dependency>73.<groupId>org.aspectj</groupId>74.<artifactId>aspectjrt</artifactId>75.<version>1.8.6</version>76.</dependency>77.<dependency>78.<groupId>org.aspectj</groupId>79.<artifactId>aspectjweaver</artifactId>80.<version>1.8.6</version>81.</dependency>82.83.<!-- hibernate依赖包-->84.<dependency>85.<groupId>org.hibernate</groupId>86.<artifactId>hibernate-core</artifactId>87.<version>4.3.11.Final</version>88.</dependency>89.<dependency>90.<groupId>org.hibernate</groupId>91.<artifactId>hibernate-ehcache</artifactId>92.<version>4.3.11.Final</version>93.</dependency>94.<dependency>95.<groupId>org.springframework</groupId>96.<artifactId>spring-orm</artifactId>97.<version>4.1.6.RELEASE</version>98.</dependency>99.<!--数据连接池dbcp -->100.<dependency>101.<groupId>commons-dbcp</groupId>102.<artifactId>commons-dbcp</artifactId>103.<version>1.4</version>104.</dependency>105.<!-- mysql驱动包-->106.<dependency>107.<groupId>mysql</groupId>108.<artifactId>mysql-connector-java</artifactId> 109.<version>5.1.30</version>110.</dependency>111.<!-- log4j日志包-->112.<dependency>113.<groupId>org.slf4j</groupId>114.<artifactId>slf4j-log4j12</artifactId>115.<version>1.6.1</version>116.</dependency>117.</dependencies>1.1.3. 第三步:配置web.xml1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app version="2.5"3. xmlns="/xml/ns/javaee"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation="/xml/ns/javaee6. /xml/ns/javaee/web-app_2_5.xsd">7.8.<!--指定spring配置文件-->9.<context-param>10.<param-name>contextConfigLocation</param-name>11.<param-value>classpath:applicationContext.xml</param-value>12.</context-param>13.14.<!-- spring监听器-->15.<listener>16.<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>17.</listener>18.19.<!-- struts2核心过滤器-->20.<filter>21.<filter-name>struts2</filter-name>22.<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>23.</filter>24.<filter-mapping>25.<filter-name>struts2</filter-name>26.<url-pattern>/*</url-pattern>27. </filter-mapping>28. <welcome-file-list>29. <welcome-file>index.jsp</welcome-file>30. </welcome-file-list>31.</web-app>1.1.4. 第四步:增加struts配置文件:struts.xml1.<?xml version="1.0" encoding="UTF-8"?>2.<!DOCTYPE struts PUBLIC3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"4. "/dtds/struts-2.3.dtd">5.6.<struts>7.<!--将action的创建托管给spring -->8.<constant name="struts.objectFactory" value="spring"/>9.<constant name="struts.devMode" value="true" />10.<constant name="struts.ui.theme" value="simple" />11.12.</struts>1.1.5. 第五步:增加hibernate配置文件:hibernate.cfg.xml(也可以不要,详见配置)1.<?xml version='1.0' encoding='utf-8'?>2.<!DOCTYPE hibernate-configuration PUBLIC3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"4. "/hibernate-configuration-3.0.dtd">5.<hibernate-configuration>6.<!--一个sessionFactory代表数据库的一个连接-->7.<session-factory>8.9.<!--10. validate 加载hibernate时,验证数据库的结构默认值11. update 加载hibernate时,检查数据库,如果表不存在,则创建,如果存在,则更新12. create 每次加载hiberante,都会创建表13. create-drop 每次加载hiberante,创建,卸载hiberante时,销毁14.-->15.<property name="hbm2ddl.auto">update</property>16.<property name="show_sql">true</property>17.<property name="format_sql">false</property>18.19.</session-factory>20.</hibernate-configuration>1.1.6. 第六步:增加log4j配置文件log4j.properties1.log4j.rootLogger=INFO, Console, R2.3.#Console4.log4j.appender.Console=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern =%d %p [%c]-%m%n7.8.log4j.appender.R=org.apache.log4j.DailyRollingFileAppender9.log4j.appender.R.File=d:/server.logyout=org.apache.log4j.PatternLayoutyout.ConversionPattern =%d %p [%c]-%m%n1.1.7. 第七步:增加数据库配置文件dbcpconfig.properties1.driverClassName=com.mysql.jdbc.Driver2.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8ername=root4.password=root1.1.8. 第八步:增加spring配置文件applicationContext.xml1.<?xml version="1.0" encoding="UTF-8"?>2.<beans xmlns="/schema/beans"3. xmlns:aop="/schema/aop"4. xmlns:tx="/schema/tx"5. xmlns:xsi="/2001/XMLSchema-instance"6. xsi:schemaLocation="/schema/beans7. /schema/beans/spring-beans-2.5.xsd8. /schema/aop9. /schema/aop/spring-aop-2.5.xsd10. /schema/tx11. /schema/tx/spring-tx-2.5.xsd">12.13.<!--14.按照指定的路径加载配置文件15.-->16.<bean17.class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">18.<property name="locations">19.<value>classpath:dbcpconfig.properties</value>20.</property>21.</bean>22.23.<bean id="dataSource" destroy-method="close"24.class="mons.dbcp.BasicDataSource">25.<property name="driverClassName" value="${driverClassName}" />26.<property name="url" value="${url}" />27.<property name="username" value="${username}" />28.<property name="password" value="${password}" />29.</bean>30.31.<!-- session工厂-->32.<bean id="sessionFactory"33.class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">34.<property name="dataSource">35.<ref bean="dataSource" />36.</property>37.<!--1、直接读取配置文件-->38.<property name="configLocation" value="classpath:hibernate.cfg.xml"/>39.40.41.<!--2、也可以省去配置文件42.<property name="mappingResources">43.<list>44.<value>cn/reachedu/ssh/po/User.hbm.xml</value>45.</list>46.</property>47.<property name="hibernateProperties">48.<props>49.<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>50.<prop key="show_sql">true</prop>51.<prop key="hibernate.jdbc.batch_size">20</prop>52.</props>53.</property>54.-->55.</bean>56.57.<bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager">58.<property name="sessionFactory" ref="sessionFactory" />59.</bean>60.61.<!--定义一个增强-->62.<tx:advice id="txAdvice" transaction-manager="transactionManager">63.<!--增强(事务)的属性的配置-->64.<tx:attributes>65.<!--66. isolation:DEFAULT :事务的隔离级别.67. propagation :事务的传播行为.68. read-only :false.不是只读69. timeout :-170. no-rollback-for:发生哪些异常不回滚71. rollback-for:发生哪些异常回滚事务72.-->73.<tx:method name="*" propagation="REQUIRED" />74.</tx:attributes>75.</tx:advice>76.77.<!-- aop配置定义切面和切点的信息-->78.<aop:config>79.<!--定义切点:哪些类的哪些方法应用增强-->80.<aop:pointcut expression="execution(* cn.reachedu.ssh.service..*.*(..))"id="mypointcut"/>81.<!--定义切面:-->82.<aop:advisor advice-ref="txAdvice" pointcut-ref="mypointcut"/>83.</aop:config>84.85.</beans>我们已经将3个框架集成在一起,但是目前什么也干不了,因为我们这个框架下没有任何功能,那么现在我们在框架里面增加一个查询用户的功能,进行简单的测试。
整合与CURD操作
注入该Action
<bean name="/xxx" class="xxx" parent="base"/> name值一定要与struts_config.xml的path一致
实训项目:基于SSH的简单信息系统开发
基于SSH的简单信息系统的需求
创建一个具有"专业","班级"和"学生"表的数据库
学生关联班级,班级关联专业 学生表:基本信息,成绩有数学和英语
</bean>
构建系统Service服务对象
创建All_DAO对象
class All_DAO{
Ext_DAO ext_dao; Table1DAO table1dao; Table2DAO table2dao; …… //setter和getter方法
}
构建系统Service服务对象
注入All_DAO对象
将传入的detached状态的对象的属性复制到持久化对象中,并 返回该持久化对象, 如果该session中没有关联的持久化对象, 加载一个,如果传入对象未保存,保存一个副本并作为持久对 象返回,传入对象依然保持detached状态.
HibernateDaoSupport类介绍
表对象Dao提供的merge,attachDirty和 attachClean的使用
将传入的对象状态设置为Transient状态
构建系统Service服务对象
Service服务对象
为了提供服务对象的灵活性,将系统需要的操 作全部封装到Service对象中,方便设计组成员 使用 其目的将所有的服务对象集中管理,能在控制 层Action调用时只需要调用Service对象,就可 以调用所有的服务 完成所有服务必定需要所有Dao,只要将所有 Dao集中管理,就能实现大大增强软件模块之 间数据的流动性
SSH框架 CRUD及验证 ajax校验 完整实例(一)
SSH框架下CRUD及验证完整实例(一)一准备工作●目标和工具在学习Java两个月之后,尝试使用学过的东西写一个最简单的页面,实现对一张数据库进行基本的CRUD操作和分页,顺便增加服务端验证和Ajax动态验证以及简单的验证码.使用的工具和环境如下:SSH框架(Struts2.1.6,Spring2.5,Hibernate3.2), Myeclipse8.0, Oracle10g数据库,JS类库prototype.js,json2.js. 数据库连接池使用的是proxool,应用到的jar 包如下图,其中dojo和dwr两个插件是后期添加功能时要用,本实例没有用到,在添加项目Hibernate和Spring支持的时候冲突的架包已经删除.●项目的目录结构源文件的目录结构如左图,其中pass文件夹放的是一些历史文件,和本例无关.项目按照mvc框惯例,分为action, dao, model, service, web五层.jsp文件如右图所示放在了WebRoot/per文件夹下,连同js库文件,其中register.jsp是测试验证码使用的.项目对应的数据库表二开发步骤首先新建web项目crm,依次为项目添加SSH支持,接着用工具或命令在数据库中建立数据表PERSON,4个列ID,NAME,AGE,ADDRESS,其中ID为主键.接着在Myeclipse中打开database 试图,为数据库新建一个连接或者使用已有的连接.接下来可以选择直接在database试图中选中PERSON表使用Hibernate反向工程自动生成实体Dao和映射表,也可以自己编写这些文件,相关代码如下.model层,包名com.person.crm.modelDao层,包名com.person.crm.dao业务层service 包名com.person.crm.service PersonManager.java 业务层接口●web层包名com.person.crm.web一个用于生成验证码的类●action层负责处理用户请求包名com.person.crm.actionPersonAction.properties处理PersonAction中类型转换错误信息PersonAction-add-validation.xml和PersonAction-update-validation.xml。
struts2基本学习教学
继续框架的学习:Struts2:MVC ←→SpringMVC (不要打架)Oracle:DB ←→MySQL (一些语法还是有差异的,不要打架) Hiberante:DAO ←→MyBatis (都是实现持久化的,不要打架)SSH整合的一个简单的CRUD案例!SSH: spring struts2 hibernate1,Struts2框架是一个MVC框架M(javabean) V(view) C(前端(核心)控制器,业务控制器)2,阐述Struts2的框架原理请求到达前端(核心)控制器从ActionMapper对象中查找ActionMapping对象获得ActionInvoker对象并执行Action返回视图3,在编写Struts2代码之前再介绍一个框架(了解)Struts2是Struts1的一个”延伸”(其实两个框架没有关系)其实Struts2的前身并不是struts1,它其实来自另一框架:webworkStruts1这个框架的控制器是Servlet,这个框架与servlet是严重耦合的!(ActionServlet)Struts1中的控制器是单例的!Struts2跟Servlet无关!Struts2中的控制器是多例的!4,开发Struts2的项目(学框架就是用别人的东西,学别人定义的规则)1)引入JAR包commons-fileupload-*.*.jar : 实现文件上传commons-logging-*.*.jar : apache下提供的一个日志包freemarker-*.*.jar : 提供视图解析的ognl-*.*.jar: struts2中的一个新特性,提供对象图导航语言struts2-core-*.*.jar :struts2的核心包xwork-core-*.*.jar : webwork的核心包2)在开发之前介绍几个文件:在struts2-core-*.*.jar中文件:struts-default.xml满足约束:文件中定义了组件:<bean> : 是struts2中要使用的bean对象<result-type> : 定义了struts2中视图的响应方式<interceptor>: 定义拦截器在struts2-core-*.*.jar中的org.apache.struts2包中文件:default.properties文件中定义开发的语言环境以及url的默认扩展名3)开发31)配置核心控制器(是一个过滤器) 在web.xmlorg.apache.struts2.dispatcher.FilterDispatcher (过时)org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter (使用)32)View –> JSP编写自己的配置文件:在src下struts.xml满足33)编写ActionAction可以是一个普通的javabean,不需要实现任何接口或者继承任何类!(当然也可以去实现Action接口或者继承ActionSupport类)视图传值给Action:规则是视图组件的name必须和action中的属性名保持一致!!(注:方法的执行顺序Setter –> execute)5,如果在Action中要使用request,response,session,application对象,struts2框架提供了如下机制:去实现XxxAware接口6,如果在struts.xml中希望有多个action的name相同,可以使用不同package进行管理。
ssh框架整合原理
ssh框架整合原理SSH框架整合原理引言:SSH(Struts+Spring+Hibernate)是一种常用的Java开发框架组合,它将Struts、Spring和Hibernate三个框架整合在一起,提供了全面的Web应用开发解决方案。
本文将介绍SSH框架的整合原理,以帮助读者深入理解该框架的工作机制。
一、Struts框架Struts是一个基于MVC(Model-View-Controller)模式的Web 应用程序开发框架。
它将应用程序划分为模型(Model)、视图(View)和控制器(Controller)三个部分,以实现业务逻辑和界面展示的分离。
在Struts框架中,用户请求首先由控制器接收,并根据配置文件中的映射规则将其转发给相应的Action处理。
Action负责处理用户请求,并将处理结果封装成一个ActionForm对象,然后将结果返回给控制器。
控制器再将结果转发给指定的视图进行展示。
二、Spring框架Spring是一个轻量级的Java开发框架,它提供了全面的企业级应用程序开发解决方案。
Spring框架主要由IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)两个核心模块组成。
在Spring框架中,IoC容器负责管理应用程序中的对象,并通过依赖注入的方式将对象之间的依赖关系设置好。
通过IoC容器,我们可以通过配置文件或注解的方式将各个模块中的对象整合在一起,实现解耦和灵活性。
AOP模块则通过横切关注点的方式,将应用程序的功能进行模块化,提高了代码的可重用性和可维护性。
在Spring框架中,我们可以通过配置文件或注解的方式定义切面和通知,然后将其与应用程序中的对象进行织入,实现特定功能的增强。
三、Hibernate框架Hibernate是一个优秀的Java持久化框架,它提供了一种对象关系映射(ORM)的方式,将Java对象和数据库表之间进行映射。
SSH成功整合+Oracle数据库
MyEclipse8.5的SSH整合Version 1.02012-04-241.编写目的最近在学习struts1.2+spring2.0+hibernate3.1的整合。
在整合的过程中遇到过各种各样的问题,在网上找了很多相关的实例但都有不同程度的问题,经过我多次的研究现整理出一份安装文档,为了让初学者少走弯路,特写下了这篇文档,希望对大家有所帮助。
2.准备环境MyEclipse 8.5Tomcat6.0ORACLE10GJDK6.0需要指出的是,各个软件的版本号并不一定需要和上面列出的相同。
但是,由于我在实验的过程中是由上述各版本系统搭建的,因此不能确保其它版本的软件是不是能够正常运行,但基于上面的环境还是能够运行成功的。
另外由于MyEclipse 中已经附带了SSH 所需要的各种库文件,所以我们一般不再需要另外的准备。
3.数据库操作在ORACLE 数据库中新建TEST用户,并创建下表添加相应的记录。
4.创建WEB工程打开MyEclipse,新建一个Web Project,输入适当的工程名,这里我就输入myssh,修改Context root URL为myssh。
这个URL是使用MyEclipse部署时,浏览器访问站点时的根路径。
如果你的工程名中包含空格,那么这个URL必须修改为没有空格的地址。
J2EE Specification Level选择Java EE 5.0,最后Finish。
新建的Web Project项目的目录结构如下所示:5.添加Struts支持在刚刚创建的myssh工程上面右击,在弹出的菜单中选择MyEclipse->Add Struts Capabilities…,添加Struts,具体操作如下:在弹出的对话框中选择Struts1.2,修改Base package for new classes成所需的包名,其余操持原状,Finish即可。
操作如下:此时已完成Struts的配置,相关的文件添加如下,目录结构为:6.添加Spring支持在myssh工程上右击,在弹出的菜单中选择MyEclipse->Add Spring Capabilities…,添加Spring的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
①配置数据源 dataSourse ,和DBCP BasicDataSource
②配置SessionFactory spring 将dataSourse注入sessionFactory
③将sessionFactory拿给XXDaoImpl用; 通常实现过程中,xxDaoImpl继承HibernateDaoSupport.
private UserDao ud;
⑤在applicationContext.xml中加入和bean有关的信息(定义bean 注入)?
需要将实体类名.hbm.xml 在xml中进行配置.
⑥编写junit的测试类,尝试获取sevice中的类已经方法调用,看功能是否正常.
修改web.xml文件,在这个文件中加入一个过滤器,.....
修改web.xml文件,在这个文件中加入一个监听器,希望web application启动的时候,帮我们初始化
spring容器.
其他层的编码:
XXAction 继承ActionSupport/调用XXservice,
2)+struts2的整合:
首先 在struts2包下有一个plugin struts-spring-plugin2.3.20.jar
加入和struts2有关的其他的jar文件.
在classpath中加入struts的配置文件:struts.xml,配置的内容 常量,package,action,result等
整合的方式:
1)spring+hibernte的整合:
首先加入和spring有关的jar文件.
加入和ibernate有关的jar文件.
和数据库操作( 连接池)有关的
配置文件:log4j jdbc.properties等
之前hibernate全局配置文件中的信息,现在在sping的配置文件applicationContext.xml中进行设置;
...
...
mit();
}catch(Exception ex)
{
conn.rollBack();
}
Hibernate中如何处理事务?
得到session对象
session.beginTranscation();//开始事务
有问题:
增加用户的时候,希望能在增加操作之后,加入一个日志记录.
什么时候,做了一个什么操作.
事务的基本概念?
四个特征?
java语言jdbc支持事务操作?怎么整?
得到一个connection
conn.setAutoCommit(false);
try{....
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_UNCOMMITTED)
漏掉了几个配置:
①
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 注入一个sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
try{
session.save();
session.saveorupdate();
session....
session.getTranscation().comomit();
}catch(Exception ex)
{
session.getTranscation().rollback();
在struts.xml中配置action和result;
Action中的属性也需要注入,也可以在applicationContext.xml中进行注入.
jsp页面的编码,提交表单给action,完成程序.
-------------------------------------------------------------------------------------------
配置文件之外的操作:
①定义实体类(javabean)
②映射文件 实体类名.hbm.xml
③写Dao接口,UserDao 以及接口对应的那个实现类;UserDaoImpl继承HibernateDaoSupport.
④写biz(service)层; 调用xxDaoImpl类的实现,这里通常是写一个接口的引用;
}
编程式事务;
声明式事务:
使用注解来配置的话:
① 修改applicationContext.xml这个文件的头部,加入支持事务的tx
② 定义一个事务管理的bean:
<!-- 定义一个事务管理有关的bean -->
<bean id="txManager"
</bean>
③
<!-- 告诉spring 注解@trans... 用 txManager这个bean来管理事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
④将事务配置信息写在service中的方法前: