zoukankan      html  css  js  c++  java
  • 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 }

    运行结果:

      浏览器显示:

       

      控制台输出:

       

       

  • 相关阅读:
    LamBda学习(一)
    如何返回一个只读泛型集合
    Socket编程笔记同步
    如何快速读取大文件(看csdn一网友要求写的)没有测试具体的速度。
    如何实现项目脚本的批量生成
    如何实现WORD查找完成后不提示的代码
    W32/Pate.a 病毒处理小记
    在WORD中用VBA实现光标移动与内容选择
    2. WCF 消息操作
    3. WCF 异常处理
  • 原文地址:https://www.cnblogs.com/zhaowancheng/p/5841591.html
Copyright © 2011-2022 走看看