SSH 架构

Posted 彭卫强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH 架构相关的知识,希望对你有一定的参考价值。

这几天学习了 ssh 架构,中间出了好多错误,现在终于整理好了,就记录下来

ssh机构的框架构成,以及它们的作用

    struts2 :这个框架主要用做控制处理的,其核心是 Contraller ,即 ActionServlet。而 ActionServlet 的核心是 struts.xml。用于分配处理web请求需要执行哪个业务逻辑。

    spring :spring 可以理解为粘合剂的作用。它把这三个框架糅合在一起使用。利用本身的控制反转(IOC) 来达到解耦的目的。

    Hibernate:及时数据持久层。只要用来操作数据库。它通过把关系型数据的 数据结构映射编程面向对象的概念。让程序员不用变换思维就离异实现对数据库的操作。

这次实例使用的各个框架的版本。

   struts-2.3.15.3

   spring-3.2.0

   hibernate-3.6.10

使用的 jar 包

 1、struts2 使用的 jar 包

        1)  struts2 → apps → struts-blank 实例空项目 → web-INF → lib 下的所有 jar 包。(从官网在的struts2 里面有这个 struts-blank 实例空项目)

     

        2)struts2-convention-plugin-2.3.15.3.jar    struts2 注解开发用的 jar 包。

        3)struts2-spring-plugin-2.3.15.3.jar   struts2用于整合 spring 的 jar 包。

 2、Hibernate 使用的 jar 包

       1) Hibernate3.jar     Hibernate 根目录下的 

       2)  hibernate → lib → required 目录下的所有 jar 包。

           

      3)hibernate-entitymanager-2.0.Final.jar    hibernate → lib → required 目录下

      4)日志记录用的包 slf4j-log4j12.1.7.5.jar

      5) mysql-connector-java-5.1.25-bin.jar  数据库的驱动包

 3、spring 使用的 jar 包   

     1) IOC 的开发用到的包

              spring-beans-3.2.5.RELEASE.jar

        spring-context-3.2.5.RELEASE.jar

     spring-core-3.2.5.RELEASE.jar

     spring-expression-3.2.5.RELEASE.jar

        com.springsource.org.apache.log4j-1.2.15.jar

        com.springsource.org.apache.commons.logging-1.1.1.jar  (不进行具体的日志记录,整合其他的日志系统的)

    2)AOP 的开发

             spring-aop-3.2.5.RELEASE.jar

     spring-aspects-3.2.5.RELEASE.jar

     com.springsource.org.aopalliance-1.0.0.jar (AOP 联盟的包)

        com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 

 

        spring-jdbc-3.2.5.RELEASE.jar

        spring-test-3.2.5.RELEASE.jar

     spring-web-3.2.5.RELEASE.jar

   spring-orm-3.2.5.RELEASE.jar

        spring-tx-3.2.5.RELEASE.jar

 引入相应的配置文件

  1、struts2 框架的配置文件

         web.xml (关于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>
View Code

     struts.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!-- /* * Licensed to the Apache Software Foundation (ASF) under one * or 
 3     more contributor license agreements. See the NOTICE file * distributed with 
 4     this work for additional information * regarding copyright ownership. The 
 5     ASF licenses this file * to you under the Apache License, Version 2.0 (the 
 6     * "License"); you may not use this file except in compliance * with the License. 
 7     You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 
 8     * * Unless required by applicable law or agreed to in writing, * software 
 9     distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT 
10     WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the 
11     License for the * specific language governing permissions and limitations 
12     * under the License. */ -->
13 <!DOCTYPE struts PUBLIC
14         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
15         "http://struts.apache.org/dtds/struts-2.3.dtd">
16 
17 
18 <struts> 
19     
20 
21     
22 </struts>
View Code

   2、Hibernate 配置文件

         hibernate.cfg.xml (在整理中这个配置文件时可以省略的,相应的内容写到 spring 配置文件中了)

         映射文件(*.bhm.xml)

 3、spring 配置文件

         web.xml (关于spring的配置)

1 <!-- spring 的核心监听器 -->
2     <listener>
3         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
4     </listener>
5 
6     <context-param>
7         <param-name>contextConfigLocation</param-name>
8         <param-value>classpath:applicationContext.xml</param-value>
9     </context-param>
View Code

    applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <beans xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
 6     xsi:schemaLocation="
 7         http://www.springframework.org/schema/beans
 8         http://www.springframework.org/schema/beans/spring-beans.xsd
 9         http://www.springframework.org/schema/aop
10         http://www.springframework.org/schema/aop/spring-aop.xsd
11         http://www.springframework.org/schema/tx
12         http://www.springframework.org/schema/tx/spring-tx.xsd
13         http://www.springframework.org/schema/context 
14         http://www.springframework.org/schema/context/spring-context.xsd ">
15 
16     <!-- 引入外部文件 -->
17     <context:property-placeholder location="classpath:jdbc.properties" />
18     <!-- 设置数据库链接池 c3p0 -->
19     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
20         <property name="driverClass" value="${jdbc.driverClass}"></property>
21         <property name="jdbcUrl" value="${jdbc.url}"></property>
22         <property name="user" value="${jdbc.username}"></property>
23         <property name="password" value="${jdbc.password}"></property>
24         <!-- <property name="driverClass" value="com.mysql.jdbc.Driver"></property> -->
25         <!-- <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb"></property> -->
26         <!-- <property name="user" value="root"></property> -->
27         <!-- <property name="password" value="123456"></property> -->
28     </bean>
29 
30     <!-- 配置hibernate的相关属性 -->
31     <bean id="sessionFactory"
32         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
33         <!-- 注入連接池 -->
34         <property name="dataSource" ref="dataSource"></property>
35         <!-- 配置 Hibernate 属性 -->
36         <property name="hibernateProperties">
37             <props>
38                 <!-- mysql 方言 -->
39                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
40                 <!-- 是否打印 sql 语句 -->
41                 <prop key="hibernate.show_sql">true</prop>
42                 <!-- sql 语句是否格式话,格式化就是能够方便阅读的格式 -->
43                 <prop key="hibernate.format_sql">true</prop>
44                 <!-- 是否自动更新表结构 -->
45                 <prop key="hibernate.hbm2ddl.auto">update</prop>
46             </props>
47         </property>
48         <!-- 加载 Hibernate 映射属性 -->
49         <property name="mappingResources">
50             <list>
51                 <value>cn/myssh/entity/Product.hbm.xml</value>
52             </list>
53         </property>
54     </bean>
55 
56     <bean id="productAction" class="cn.myssh.action.ProductAction">
57         <property name="productService" ref="productService"></property>
58     </bean>
59 
60     <bean id="productService" class="cn.myssh.service.ProductService">
61         <property name="productDao" ref="productDao"></property>
62     </bean>
63 
64     <bean id="productDao" class="cn.myssh.dao.ProductDao">
65         <!-- 因为 ProductDao 继承了HibernateDaoSupport,HibernateDaoSupport 里面有 setSessionFactory 
66             方法, -->
67         <!-- 所以可以直接注入,HibernateDaoSupport 里面还有创建 HibernateTemplate 方法 -->
68         <property name="sessionFactory" ref="sessionFactory"></property>
69     </bean>
70 
71     <!-- 事物管理配置器 -->
72     <bean id="transactionManager"
73         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
74         <property name="sessionFactory" ref="sessionFactory"></property>
75     </bean>
76 
77     <!-- 开启注解事物 -->                       
78     <tx:annotation-driven transaction-manager="transactionManager"/>
79 </beans>
applicationContext

 建造包结构及实体

 1 package cn.myssh.entity;
 2 
 3 /**
 4  * 商品管理的实体类
 5  * @author Administrator
 6  *
 7  */
 8 public class Product implements java.io.Serializable{
 9     private int pid;
10     private String pname;
11     private double price;
12     public int getPid() {
13         return pid;
14     }
15     public void setPid(int pid) {
16         this.pid = pid;
17     }
18     public String getPname() {
19         return pname;
20     }
21     public void setPname(String pname) {
22         this.pname = pname;
23     }
24     public double getPrice() {
25         return price;
26     }
27     public void setPrice(double price) {
28         this.price = price;
29     }
30 }
实体类 product 对象

 

struts2 整合 spring   保存添加的商品为例

1、添加页面例子

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3     String path = request.getContextPath();
 4     String basePath = request.getScheme() + "://"
 5             + request.getServerName() + ":" + request.getServerPort()
 6             + path + "/";
 7 %>
 8 <%@taglib uri="/struts-tags" prefix="s"%>
 9 
10 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
11 <html>
12 <head>
13 <base href="<%=basePath%>">
14 
15 <title>My JSP \'addProduct.jsp\' starting page</title>
16 
17 <meta http-equiv="pragma" content="no-cache">
18 <meta http-equiv="cache-control" content="no-cache">
19 <meta http-equiv="expires" content="0">
20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
21 <meta http-equiv="description" content="This is my page">
22 <!--
23     <link rel="stylesheet" type="text/css" href="styles.css">
24     -->
25 
26 </head>
27 
28 <body>
29     <h1>保存商品</h1>
30     <s:form action="product_save" method="post" namespace="/" theme="simple">
31         <table border="1" width="500px">
32             <tr>
33                 <td>商品名称</td>
34                 <td><s:textfield name="pname"></s:textfield></td>
35             </tr>
36             <tr>
37                 <td>商品价格</td>
38                 <td><s:textfield name="price"></s:textfield></td>
39             </tr>
40             <tr>
41                 <td colspan="2"><s:submit value="tijiao"></s:submit></td>
42             </tr>
43         </table>
44     </s:form>
45 </body>
46 </html>
addProduct.jsp

2、后台逻辑条用的过程

  addProduct.jsp 发出请求 → 在struts.xml 中找到对应的 Action 执行(productAction     save) → 通过注入的 ProductService 方法找到 对应的 逻辑处理 → 通过注入到 ProductService 里面的对象找到对应的的 productDao执行 → 更新到数据库里面。

3、关于 productAction 类

  1) ProductService 注入到 productAction 里面。

        1 在以前注入的时候都需要借用 beans 工具类,就是在 applicationContext 配置,然后写一个类来获取折耳根配置。

   2 现在有了 struts2-spring-plugin-2.3.20.jar(整理struts2和plugin)jar 包。可以自动装配了。

             在 jar 包中 有个 struts-plugin.xml 文件,中间看了    <constant name="struts.objectFactory" value="spring" />  这是一个 struts2 的常量。在 struts-core 包中 有个 default.properties。里面有常量的介绍。struts.objectFactory = spring 这句话原本是被注释的,但是  <constant name="struts.objectFactory" value="spring" />  给打开了。就引发了 struts.objectFactory.spring.autoWire = name 即 是自动装配

1 <!-- 在 struts.xml 里面配置 -->
2     <package name="myssh" extends="struts-default" namespace="/">
3     <!-- productAction 之所以直接用 productAction 这个是因为在 applicationContext.xml 进行了配置 -->
4         <action name="product_*" class="productAction"
5             method="{1}">
6             <result name="none">index.jsp</result>
7         </action>
8 
9     </package>
 1 package cn.myssh.action;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 import com.opensymphony.xwork2.ModelDriven;
 5 
 6 import cn.myssh.entity.Product;
 7 import cn.myssh.service.ProductService;
 8 
 9 /**
10  * 商品管理的 action 类
11  * @author Administrator
12  * 
13  */
14 public class ProductAction extends ActionSupport implements ModelDriven<Product> {
15     /**
16      * 模型驱动使用的类
17      */
18     private Product product = new Product();
19     
20     public Product getModel()
21     {
22         return product;
23     }
24     //spring 和 struts2 整合过程中,按照名称自动注入业务层类
25     private ProductService productService;
26 
27     public void setProductService(ProductService productService) {
28         this.productService = productService;
29     }
30 
31     /**
32      * 保存商品的方法
33      */
34     public String save()
35     {
36         System.out.println("save the product");
37         productService.save(product);
38         return "none";
39     }
40 }
productAction

 4、在 applicationContext.xml 配置 Action、service、dao 。(见上面贴出的 applicationContext.xml )

5、添加保存方法。

1 /**
2      * 保存商品的方法
3      */
4     public String save()
5     {
6         System.out.println("save the product");
7         productService.save(product);
8         return "none";
9     }
ProductAction 里面的 save 方法
1 public void save(Product product)
2     {
3         productDao.save(product);
4         System.out.println("service 中的方法执行了");
5     }
ProductService 里面 save 方法
1 public void save(Product product) {
2         System.out.println("dao 的save 方法");
3     }
productDao 里面的 save 方法

到这儿,执行 addProduct 方法,后台的过程就是框架整合后的过程,只是还没有更新到数据库里面

整合 spring 和 Hibernate

1、引入 jdbc.properties ,目录在src 下。

1 jdbc.driverClass=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3306/testdb
3 jdbc.username=root
4 jdbc.password=123456

2、配置映射文件,这个文件需要和映射的提示文件放在一个包下。

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 
 3 <!DOCTYPE hibernate-mapping PUBLIC 
 4     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 5     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 6 
 7 <hibernate-mapping>
 8     <class name="cn.myssh.entity.Product" table="product">
 9         <SSH----MVC框架模式与分层架构

Jetpack 组成没有片段的导航架构?

导航架构片段重载问题

导航架构片段重载问题

如何使用导航架构组件从片段中获取结果?

使用导航架构组件添加(而不是替换)片段