SSH的框架整合

struts 控制用的   

hibernate 操作数据库的 

spring 用解耦的 

第一步:先创建一个wed项目 。

 

第二步:配置struts2

1.添加Struts2所需要的基本jar包到 lib目录下 包名如下图:

 2.在web.xml 文件里添加struts的过滤器配置如下:《提示:struts2-2.3版本》

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ssh</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <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-app>

 3.在web.xml 文件里添加struts的过滤器配置如下:《提示:struts2-2.5版本》

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ssh</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
      <filter>
        <filter-name>struts-prepare</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareFilter</filter-class>
    </filter>

    <filter>
        <filter-name>struts-execute</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsExecuteFilter</filter-class>
    </filter>


    <filter-mapping>
        <filter-name>struts-prepare</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>struts-execute</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

 4.在src目录下创建struts配置文件,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>
       <package name="struts2" extends="struts-default">
       </package>
   </struts> 
使用Struts2的好处:
1.实现了页面和代码的分离实现了mvc设计理念。
2.获取表单内容,并组织生成参数对象
3.根据请求的参数转发请求适当的控制器
4.在控制器中调用业务接口
5.将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展现
6.做一些简单的校验或国际化工作



第三步:配置spring 

1.在lib目录下导入spring相关的jar包如下:《提示:spring跟struts结合还需要2个struts的jar包分别是:

struts2-spring-plugin-2.3.30.jar和commons-logging-1.1.3.jar》

 

 2.在wed.xml文件下配置监听器,配置如下:

 <!-- spring的监听器配置开始 -->
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:applicationContext.xml</param-value>  
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
使用Spring的好处:
(1)Spring能有效地组织你的中间层对象。
(2)Spring能消除在许多工程中常见的对Singleton的过多使用。
(3)Spring能消除各种各样自定义格式的属性文件的需要,使配置信息一元化。
(4)Spring能够帮助我们真正意义上实现针对接口编程。
(5)在Spring应用中的大多数业务对象没有依赖于Spring。
(6)使用Spring构建的应用程序易于单元测试
(7)Spring支持JDBC和O/R Mapping产品(Hibernate)
(8)MVC Web框架,提供一种清晰,无侵略性的MVC实现方式。
(9)JNDI抽象层,便于改变实现细节,可以方便地在远程服务和本地服务间切换。
(10)简化访问数据库时的例外处理。
(11)Spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事务进行管理。
(12)提供了JavaMail或其他邮件系统的支持。

 

第四步:配置hibernate

1.在lib目录里导入hibernate相关的jar包如下:

 

2.在entity包下创建实体类

1 package ssh.entity;
 2 
 3 import java.math.BigDecimal;
 4 import java.util.Date;
 5 
 6 /*
 7  * 跟数据库表一致,作为一个java对象
 8  * 1个对象代表的是数据库表中的一行记录
 9  * 1个属性代表的是表中的一个字段
10  */
11 public class BookCard {
12     private int cid  ;
13     private String name;
14     private String sex ;
15     private Date cardDate;
16     private BigDecimal deposit;
17     
18     //定义get()、set()方法
19     public int getCid() {
20         return cid;
21     }
22     public void setCid(int cid) {
23         this.cid = cid;
24     }
25     public String getName() {
26         return name;
27     }
28     public void setName(String name) {
29         this.name = name;
30     }
31     public String getSex() {
32         return sex;
33     }
34     public void setSex(String sex) {
35         this.sex = sex;
36     }
37     public Date getCardDate() {
38         return cardDate;
39     }
40     public void setCardDate(Date cardDate) {
41         this.cardDate = cardDate;
42     }
43     public BigDecimal getDeposit() {
44         return deposit;
45     }
46     public void setDeposit(BigDecimal deposit) {
47         this.deposit = deposit;
48     }
49 
50 }

在entity创建实体类对应的xxx..hbm.xml映射文件。

 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 
 6 <hibernate-mapping>
 7     <class name="ssh.entity.BookCard" table="BookCard">
 8         <!-- 卡号 -->
 9         <id name="cid" column="cid">
10             <generator class="native"></generator>
11         </id>
12         <!-- 姓名 -->
13         <property name="name" column="name"></property>
14         <!-- 性别 -->
15         <property name="sex" column="sex"></property>
16         <!-- 办卡日期 -->
17         <property name="cardDate" column="cardDate"></property>
18         <!-- 押金 -->
19         <property name="deposit" column="deposit"></property>
20     </class>
21 </hibernate-mapping>


3.应用IOC实现DAO接口

在Dao接口实现类里IndexDaoImpl定义一个sessionFactory的属性提供一个set的方法,方便在spring里注入 注入方式如下:

  <bean id="myDao" class="dao.IndexDaoImpl" scope="prototype">
        <property name="sessionFactory" ref="mysessionFactory"></property> 
  </bean>
       
    <!-- mysql hibernate配置 -->
    <!-- 注入sessionFactory -->
    <bean id="mysessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <!-- 注入连接池,包含了数据库用户名,密码等等信息 -->
        <property name="dataSource" ref="myDataSource2"></property>
        <!-- 配置Hibernate的其他的属性 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.connection.autocommit">false</prop>
                <!-- 开机自动生成表 -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
                <value>entity/xxx.hbm.xml</value>
            </list>
        </property>    
    </bean>
    
    <bean id="myDataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/CardDB"></property>
        <property name="user" value="root"></property>
        <property name="password" value="123456"></property>
    </bean> 

 使用hibernate的好处:

1.连接数据库不用我们来管理。

2.原来是对表操作,现在是对对象操作。

 

环境第搭好了下面可写代码了

第五步 编写IndexAction(action类)。

1 package ssh.action;
 2 
 3 import java.text.DecimalFormat;
 4 import java.util.List;
 5 
 6 import com.opensymphony.xwork2.ActionContext;
 7 import com.opensymphony.xwork2.ActionSupport;
 8 
 9 import ssh.entity.BookCard;
10 import ssh.service.IndexService;
11 
12 //创建IndexAction(action类)继承ActionSupport接口
13 public class IndexAction extends ActionSupport {
14     
15     private static final long serialVersionUID = 1L;
16     
17     //声明service,但不给它创建具体的实现类的实例,
18     private IndexService is = null;
19     //添加set()方法
20     public void setIs(IndexService is) {
21         this.is = is;
22     }
23     
24     //编写execute()方法
25     public String execute() {
26         
27         //获取IndexService实例,调用getAllBookCard()方法
28         //将结果保存到List集合里
29         List<BookCard> myBookCardList = is.getAllBookCard();
30         
31         //将查询出来的结构集打印到控制台
32         System.out.println("结果集:"+myBookCardList.size());
33         
34         //获取Context上下文对象
35         ActionContext ac = ActionContext.getContext();
36         //将myBookCardList集合添加到上下文对象里
37         ac.put("myBookCardList", myBookCardList);
38         
39         //返回一个字符串
40         return "success";
41     }
42     
43     //金额格式转换
44     public String formatDouble(double s){
45         DecimalFormat fmat=new DecimalFormat("u00A4##.0"); 
46         return fmat.format(s);
47     }
48     
49 }

第六步:在ssh.service包里编写IndexService(接口类)和IndexServiceImpl(实现类)。

IndexService(接口类):

1 package ssh.service;
 2 
 3 import java.util.List;
 4 
 5 import ssh.dao.IndexDao;
 6 import ssh.entity.BookCard;
 7 
 8 //创建一个IndexService接口类
 9 public interface IndexService {
10     
11     
12     public List<BookCard> getAllBookCard();
13 
14 }
复制代码

IndexServiceImpl(实现类):

1 package ssh.service;
 2 
 3 import java.util.List;
 4 
 5 import ssh.dao.IndexDao;
 6 import ssh.entity.BookCard;
 7 
 8 //创建IndexServiceImpl(实现类)实现IndexService接口
 9 public class IndexServiceImpl implements IndexService {
10 
11     //dao实例使用注入方式
12     private IndexDao id;
13     //用于注入使用
14     public void setId(IndexDao id) {
15         this.id = id;
16     }
17 
18 
19     @Override
20     public List<BookCard> getAllBookCard() {
21         //本类应该编写业务逻辑的代码,
22         //但本例没有业务逻辑,就不用写。
23         
24         //访问数据库的代码,不会出现在service这一层
25         //交给dao来操作数据库
26         List<BookCard> myBookCardList = id.getAllBookCard();
27         
28         //进行其它的业务逻辑操作,比如增加多一个选项,是否过期
29         //本例不需要
30         //....
31         
32         return myBookCardList;
33     }
34 
35 }

 IndexDao(接口类):

 1 package ssh.dao;
 2 
 3 import java.util.List;
 4 
 5 import ssh.entity.BookCard;
 6 
 7 //创建IndexDao(接口类)
 8 public interface IndexDao {
 9     
10     public List<BookCard> getAllBookCard();
11     
12 }

IndexDaoImpl(实现类):

1 package ssh.dao;
 2 
 3 import java.util.List;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.query.Query;
 8 
 9 import ssh.entity.BookCard;
10 
11 //创建IndexDaoImpl(实现类)实现IndexDao接口
12 public class IndexDaoImpl implements IndexDao {
13     
14     //在SSH的设计理念:要使用某个实例,那么就定义声明一个对象,然后
15     //给它添加set方法(用于spring注入进来)
16     //实现不要关注这个实例来自于那里,以及怎么创建,或者它是谁    
17     private SessionFactory sessionFactory;
18     
19     public void setSessionFactory(SessionFactory sessionFactory) {
20         this.sessionFactory = sessionFactory;
21     }
22 
23 
24     @Override
25     public List<BookCard> getAllBookCard() {
26         
27         //sessionFactory这个实例可以自己按常规的hibernate传统写法创建
28         //也可以交给spring去托管
29         /*
30         Configuration cfg = new Configuration().configure();
31         sessionFactory = cfg.buildSessionFactory();*/
32         
33         //获取session
34         Session session = sessionFactory.openSession();
35             
36         //后面当使用JPA的时候,EntityManager 类似于 Session
37         Query query = session.createQuery("from BookCard");
38         
39         //将所有的数据查询出来并放到List集合里
40         List<BookCard> list = query.getResultList();
41         
42         //将集合遍历循环
43         for(BookCard bookCard:list){
44             //打印输出到控制台
45             System.out.println(bookCard);
46         }
47         
48         //关闭session
49         session.close();
50         //关闭sessionFactory
51         sessionFactory.close();
52         //返回list集合
53         return list;
54         
55     }
56 
57 }

运行结果:

  浏览器显示:

   

  控制台输出:

   

   

原文地址:https://www.cnblogs.com/zhaowancheng/p/5841591.html