本例演示从0开始逐一整合SSH的步骤,要学习本知识,需要具备Spring, Struts, Hibernate的基础,如果没有这些基础,请把基础掌握之后再学习,不要跳跃学习,最后坑的是自己
本例演示从struts,spring,hibernate逐一配置的步骤,完整的可运行实例可在右边下载
必读: 基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 如果你是第一次学习本框架,务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍
步骤 1 : 创建数据库
首先准备数据库 how2java
如果没有安装数据库,请参考 安装mysql-server
注: 新安装的数据库账号密码是root:admin, 后续的配置里,也是用的这个账号密码。如果密码不是这个,本知识点下载区(点击进入)的可运行项目跑不起来,所以尽量修改密码为admin, 修改密码办法:修改root密码
步骤 2 : 创建表
准备表product_, 有3个字段,分别是
主键id(自增长)
字符串格式的name
浮点数格式的price
use how2java; CREATE TABLE product_ ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(30) , price float , PRIMARY KEY (id) ) DEFAULT CHARSET=UTF8; |
步骤 3 : 准备数据
use how2java; delete from product_; INSERT INTO product_ VALUES (null,'产品a',88.88); INSERT INTO product_ VALUES (null,'产品b',88.88); INSERT INTO product_ VALUES (null,'产品c',88.88); INSERT INTO product_ VALUES (null,'产品x',88.88); INSERT INTO product_ VALUES (null,'产品y',88.88); INSERT INTO product_ VALUES (null,'产品z',88.88); |
步骤 4 : 先运行,再学习
SSH整合需要做不少步骤,任何一步部做漏了,做错了,都有可能失败,这样会影响学习的信心,并且误以为本教程是走不通的。
所以先下载下载区(点击进入)的可运行项目 ssh.rar,解压后导入到eclipse中,启动Tomcat,观察是否正常运行。确定可以运行,确定教程是可以跑得起来的,再学习下面的内容。
导入到Eclipse中并运行的办法请参考:导入动态Web项目到Eclipse中
部署成功自后,测试地址,应该看到如图所示的效果
http: //127.0.0.1:8080/ssh/listProduct |
步骤 5 : 新建项目
在eclipse中新建项目ssh,使用dynamic web project的方式。 不熟悉这种方式的同学,请参考 使用Dynamic Web Project的方式开发J2EE应用
步骤 6 : 导入jar
下载下载区(点击进入)的lib.rar, 解压后复制到 e:/project/ssh/WebContent/WEB-INF/lib目录下
步骤 7 : pojo
package com.how2java.pojo; public class Product { private int id; private String name; private float price; public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public float getPrice() { return price; } public void setPrice( float price) { this .price = price; } } |
步骤 8 : hbm
<? xml version = "1.0" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> < hibernate-mapping package = "com.how2java.pojo" > < class name = "Product" table = "product_" > < id name = "id" column = "id" > < generator class = "native" > </ generator > </ id > < property name = "name" /> < property name = "price" /> </ class > </ hibernate-mapping > |
步骤 9 : DAO
DAO部分由接口ProductDAO 和其实现类ProductDAOImpl 构成
ProductDAO 接口声明了方法list()、add(Product p)。
ProductDAOImpl 类继承了Hibernatetemplete,并实现接口ProductDAO。
package com.how2java.dao; import java.util.List; import com.how2java.pojo.Product; public interface ProductDAO { public List<Product> list(); public void add(Product p); } |
package com.how2java.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.HibernateTemplate; import com.how2java.dao.ProductDAO; import com.how2java.pojo.Product; public class ProductDAOImpl extends HibernateTemplate implements ProductDAO{ public List<Product> list() { return find( "from Product" ); } @Override public void add(Product p) { save(p); } } |
步骤 10 : Service
Service部分由接口ProductService 和其实现类ProductServiceImpl 构成
ProductService 接口声明了方法list()。
ProductServiceImpl 实现接口ProductService,并接受productDAO的注入。
list方法就是业务方法,productDAO查找所有的数据,如果是空的,就往数据库里插入5条数据。
package com.how2java.service; import java.util.List; import com.how2java.pojo.Product; public interface ProductService { public List<Product> list(); } |
package com.how2java.service.impl; import java.util.List; import org.springframework.orm.hibernate3.HibernateTemplate; import com.how2java.dao.ProductDAO; import com.how2java.pojo.Product; import com.how2java.service.ProductService; public class ProductServiceImpl implements ProductService { ProductDAO productDAO; public List<Product> list() { List<Product> products= productDAO.list(); if (products.isEmpty()){ for ( int i = 0 ; i < 5 ; i++) { Product p = new Product(); p.setName( "product " + i); productDAO.add(p); products.add(p); } } return products; } public ProductDAO getProductDAO() { return productDAO; } public void setProductDAO(ProductDAO productDAO) { this .productDAO = productDAO; } } |
步骤 11 : ProductAction
ProductAction提供对ProductService的注入,借助SSH的整合,ProductAction就充当非常单纯的控制层的角色:
1. 取得数据
2. 跳转到页面 “listJsp”
package com.how2java.action; import java.util.List; import com.how2java.pojo.Product; import com.how2java.service.ProductService; public class ProductAction { ProductService productService; List<Product> products; public String list() { products = productService.list(); return "listJsp" ; } public ProductService getProductService() { return productService; } public void setProductService(ProductService productService) { this .productService = productService; } public List<Product> getProducts() { return products; } public void setProducts(List<Product> products) { this .products = products; } } |
步骤 12 : struts.xml
指定objectFactory 为spring,把action的生命周期管理交给spring进行
<? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > < constant name = "struts.i18n.encoding" value = "UTF-8" ></ constant > < constant name = "struts.objectFactory" value = "spring" /> < package name = "basicstruts" extends = "struts-default" > < action name = "listProduct" class = "productActionBean" method = "list" > < result name = "listJsp" >list.jsp</ result > </ action > </ package > </ struts > |
步骤 13 : applicationContext.xml
applicationContext.xml应该放在WEB-INF目录下
提供action的管理,并且在创建action的时候,注入dao
<? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework.org/schema/tx" xmlns:context = "http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> < bean name = "productActionBean" class = "com.how2java.action.ProductAction" > < property name = "productService" ref = "productServiceImpl" /> </ bean > < bean name = "productServiceImpl" class = "com.how2java.service.impl.ProductServiceImpl" > < property name = "productDAO" ref = "productDAOImpl" /> </ bean > < bean name = "productDAOImpl" class = "com.how2java.dao.impl.ProductDAOImpl" > < property name = "sessionFactory" ref = "sf" /> </ bean > < bean name = "sf" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" > < property name = "dataSource" ref = "ds" /> < property name = "mappingResources" > < list > < value >com/how2java/pojo/Product.hbm.xml</ value > </ list > </ property > < property name = "schemaUpdate" > < value >true</ value > </ property > < property name = "hibernateProperties" > < value > hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true hbm2ddl.auto=update </ value > </ property > </ bean > < bean name = "ds" class = "org.springframework.jdbc.datasource.DriverManagerDataSource" > < property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> < property name = "url" value = "jdbc:mysql://localhost:3306/how2java?characterEncoding=UTF-8" /> < property name = "username" value = "root" /> < property name = "password" value = "admin" /> </ bean > </ beans > |
步骤 14 : 配置web.xml
web.xml 增加Context监听器
< web-app > < 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 > < dispatcher >FORWARD</ dispatcher > < dispatcher >REQUEST</ dispatcher > < url-pattern >/*</ url-pattern > </ filter-mapping > < listener > < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class > </ listener > </ web-app > |
步骤 15 : list.jsp
用于显示products的jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <%@ taglib prefix="s" uri="/struts-tags" %> <%@page isELIgnored="false"%> < table > < tr > < td >id</ td > < td >name</ td > </ tr > < s:iterator value = "products" var = "p" > < tr > < td >${p.id}</ td > < td >${p.name}</ td > </ tr > </ s:iterator > </ table > |
步骤 16 : 访问http://127.0.0.1/listProduct
部署在Tomcat中,重启tomcat,然后访问地址,观察效果
http: //127.0.0.1:8080/ssh/listProduct |
部署办法请参考 通过Eclipse启动Tomcat-Run On Server
步骤 17 : 可运行项目
在下载区(点击进入)有本知识点对应的可运行项目下载 ,实在自己搞不出来,就下载解压出来比较一下
步骤 18 : 思路图
1. 访问路径/listProduct
2. web.xml中的过滤器会将请求交由struts进行处理
3. struts根据listProduct创建对应的productActionBean
此时productActionBean不再由Struts自己创建,而是由Spring创建
4. spring根据applicationContext.xml创建productActionBean对应的对象ProductAction
5. Spring 创建ProductAction的时候 注入Service
6. 创建Service的时候注入DAO
7. Struts 调用ProductAction的list方法
8. 在list方法中调用注入好的dao,访问数据库,查询结果
9. 跳转到list.jsp显示数据
步骤 19 : 练习
基于这个例子,使用 SSH做一套产品的 增 删 改 查
更多内容,点击了解: https://how2j.cn/k/ssh/ssh-integrationtest/100.html?p=81777