how2j.cn

本例演示从0开始逐一整合SSH的步骤,要学习本知识,需要具备Spring, Struts, Hibernate的基础,如果没有这些基础,请把基础掌握之后再学习,不要跳跃学习,最后坑的是自己

本例演示从struts,spring,hibernate逐一配置的步骤,完整的可运行实例可在右边下载

必读: 基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 如果你是第一次学习本框架,务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍

相关下载
文件名 文件大小
lib.rar 16m
ssh.rar 16m
使用站长秘制下载工具
步骤 1 : 创建数据库   
步骤 2 : 创建表   
步骤 3 : 准备数据   
步骤 4 : 先运行,再学习   
步骤 5 : 新建项目   
步骤 6 : 导入jar   
步骤 7 : pojo   
步骤 8 : hbm   
步骤 9 : DAO   
步骤 10 : Service   
步骤 11 : ProductAction   
步骤 12 : struts.xml   
步骤 13 : applicationContext.xml   
步骤 14 : 配置web.xml   
步骤 15 : list.jsp   
步骤 16 : 访问http://127.0.0.1/listProduct   
步骤 17 : 可运行项目   
步骤 18 : 思路图   
步骤 19 : 练习   

步骤 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;
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);
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中新建项目ssm,使用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>
<?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>
<?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>
<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
访问http://127.0.0.1/listProduct
步骤 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 :

练习

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
基于这个例子,使用 SSH做一套产品的 增 删 改 查



问答区域    
2017-11-28 用myeclipse要怎么跑起来啊??
可劲儿学吧
下载后是个java项目,要怎么用myeclipse自带的tomcat跑起来??




1 个答案

timeline 答案时间:2017-11-28
部署进去




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-11-18 struts.xml
John2
你好,我想问下,是不是在整合的ssh中 struts.xml文件中不能配置开发模式,我配置后出错 404 <constant name="struts.devMode" value="true"/>








答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-11-10 我想知道项目访问路径为什么要加listProduct,不能一启动就直接跳转到正确的页面很难受
2017-11-03 见过最清晰的教学方式
2017-10-30 站长,我想问个路径问题
2017-10-26 为什么需要Service?与在Action中调用hibernate有什么好处?
2017-09-30 这个标签意思
2017-09-19 tomcat404错误
2017-09-08 这些代码作用是什么
2017-09-06 没看懂这一段代码,能讲解一下吗
2017-09-06 步骤11不太懂
2017-09-06 步骤14增加监听器的作用是什么
2017-09-06 不太懂这一段
2017-09-06 不太懂这一段
2017-09-05 return 后紧跟函数
2017-08-28 404错误
2017-08-19 为什么还需要ProductDAOImpl?
2017-08-09 用TOMCAT发布出现问题
2017-08-01 application.xml的位置
2017-07-22 Tomcat正常启动,连接失败
2017-07-21 请问老师,您的ssh版本需要jdk1.8支持吗,jdk1.7好像不行?
2017-07-16 update出现问题
2017-07-13 dao层继承HibernateTemplate之后怎么执行带有问号的sql?
2017-07-08 j2ee跑的起来,ssh跑不起来,怎么做
2017-06-22 你好 我想问一下为什么不创建WEB动态工程 而是创建一个JAVA工程呢
2017-05-24 1212121
2017-04-26 我用下载的ssh.rar和tomcat_8080.rar试了,404
2017-04-15 显示的数据并不是数据库中的数据
2017-03-18 通俗易懂,非常感谢
2017-03-01




提问之前请登陆
关于 JAVA 框架-SSH-整合步骤 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 661682521
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图