工具版本兼容问题
本例演示从0开始逐一整合SSH的步骤,要学习本知识,需要具备Spring, Struts, Hibernate的基础,如果没有这些基础,请把基础掌握之后再学习,不要跳跃学习,最后坑的是自己
纠
本例演示从struts,spring,hibernate逐一配置的步骤,完整的可运行实例可在右边下载 必读: 基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 如果你是第一次学习本框架,务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍 步骤 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 : 练习
首先准备数据库 how2java
如果没有安装数据库,请参考 安装mysql-server 注: 新安装的数据库账号密码是root:admin, 后续的配置里,也是用的这个账号密码。如果密码不是这个,本知识点右上角的可运行项目跑不起来,所以尽量修改密码为admin, 修改密码办法:修改root密码
准备表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; 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);
SSH整合需要做不少步骤,任何一步部做漏了,做错了,都有可能失败,这样会影响学习的信心,并且误以为本教程是走不通的。
所以先下载右上角的可运行项目 ssh.rar,解压后导入到eclipse中,启动Tomcat,观察是否正常运行。确定可以运行,确定教程是可以跑得起来的,再学习下面的内容。 导入到Eclipse中并运行的办法请参考:导入动态Web项目到Eclipse中 部署成功自后,测试地址,应该看到如图所示的效果 http://127.0.0.1:8080/ssh/listProduct
在eclipse中新建项目ssh,使用dynamic web project的方式。 不熟悉这种方式的同学,请参考 使用Dynamic Web Project的方式开发J2EE应用
下载右上角的lib.rar, 解压后复制到 e:/project/ssh/WebContent/WEB-INF/lib目录下
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;
}
}
<?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>
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);
}
}
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;
}
}
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;
}
}
指定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>
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>
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>
用于显示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>
部署在Tomcat中,重启tomcat,然后访问地址,观察效果
http://127.0.0.1:8080/ssh/listProduct 部署办法请参考 通过Eclipse启动Tomcat-Run On Server
在右上角有本知识点对应的可运行项目下载 ,实在自己搞不出来,就下载解压出来比较一下
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显示数据
基于这个例子,使用 SSH做一套产品的 增 删 改 查
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2021-12-01
ios系统打不开lib
2021-03-20
站长,SSH版的天猫没有了吗?
3 个答案
起个名 跳转到问题位置 答案时间:2024-06-21 111
...... 你好啊007 跳转到问题位置 答案时间:2021-04-02 十分感谢
苦练技术 跳转到问题位置 答案时间:2021-03-29 链接隐藏了,在这里。
https://how2j.cn/k/tmall-ssh/tmall-ssh-1159/1159.html
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-07-23
两个重写方法为什么只有一个上面有override
2020-02-24
struts.xml问题请教
2019-12-02
这里为什么用的是接口.方法?不应该是实现这个接口的类.方法吗?
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 49 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|