构建最基础的ssh框架-商品添加

写代码这件事和很多技术活一样,当你许久未接触之后就会生疏了。

前言

整合ssh,搭建一个框架,将配置文件,基本类完成,实现产品添加入库。

目录

创建一个WEB项目并引入jar包
引入框架的配置文件
创建包结构和页面
编写Action/Dao/Service
Spring整合Struts
Spring整合hibernate
添加事务管理
运行程序
参考

一、创建一个WEB项目并引入jar包

SSH整合所需要的lib包

lib.png

二、引入框架的配置文件

  • struts.xml
  • applicationContext.xml
  • web.xml
  • log4j.properties

1、web.xml

   <!-- Spring的框架的核心监听器 -->
   <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
   </context-param>
  
  <!-- struts2的框架的核心过滤器的配置 -->
  <filter>
    <filter-name>struts</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

2、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>

</struts>

3、applicationContext.xml

<?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-2.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

</beans>

4、log4j.properties

log4j.rootLogger=WARN,stdout,logfile
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${catalina.home}/logs/SSH.log
log4j.appender.logfile.MaxBackupIndex=100
log4j.appender.logfile.MaxFileSize=1024KB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] [%l] - %m%n
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d %p]>> %l\: - %m%n
log4j.logger.org.hibernate=ERROR
log4j.logger.org.hibernate.SQL=ERROR
log4j.logger.org.hibernate.cache=ERROR
#ibatis rizhixiangguan
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug,stdout
#ibatis rizhixiangguan
log4j.logger.org.springframework=ERROR
log4j.logger.org.springframework.aop.framework=ERROR
log4j.appender.CONSOLE=org.apache.log4j.RollingFileAppender
log4j.appender.CONSOLE.File=${catalina.home}/logs/SSHConsole.log
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd hh\:mm\:ss} %-5p %c %x - %m%n


三、创建包结构和页面

1、新建包结构如下:

  • |-renault.ssh
    • |-action
    • |-model
      • |-Product
    • |-service
    • |-dao

2、在model包下新建 Product.java实体类:

package renault.ssh.model;
/*** 
 * 商品的实体类
 * @author Renault
 *
 */
public class Product {
    private Integer pid;
    private String pname;
    private Double price;
    public Integer getPid() {
        return pid;
    }
    public void setPid(Integer pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    
}

3、新建添加商品页面addProduct.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>保存</title>
  </head>
  <body>
    <h1>保存商品的页面</h1>
<!-- struts标签下有默认theme,如果自己用了simple就不会使用默认的样式 -->
    <s:form action="" method="post" namespace="/" theme="simple">
        <table boder="1" width="400px">
            <tr>
                <td>商品名称</td>
                <td><s:textfield name="pname"/></td>
            </tr>
            <tr>
                <td>商品价格</td>
                <td><s:textfield name="price"/></td>
            </tr>
            <tr>
                <td clospan="2"><input type="submit" value="添加"></td>
            </tr>
        </table>
        </s:form>
  </body>
</html>

四、编写Action/Dao/Service

1、在Action包下新建ProductAction.java

package renault.ssh.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import renault.ssh.model.Product;
import renault.ssh.service.ProductService;

/**
 * 商品管理的Action类
 * @author Renault
 *
 */
public class ProductAction extends ActionSupport implements ModelDriven<Product>{
    //模型驱动使用的类
    private Product product = new Product();
    
    public Product getModel() {
        return product;
    }
    //struts和Sring整合过程中按名称自动注入的业务层类
    private ProductService productService;

    public void setProducrService(ProductService productService) {
        this.productService = productService;
    }


}

2、在Service包下新建ProductService.java

package renault.ssh.service;

import renault.ssh.dao.ProductDao;

/**
 * 商品管理的服务类
 * @author renault
 *
 */
public class ProductService  {

    //业务层注入DAO的类
    private ProductDao productDao;

    public void setProductDao(ProductDao productDao) {
        this.productDao = productDao;
    }

}

3、在Dao包下新建ProductDao.java

package renault.ssh.dao;


/**
 * 商品管理的Dao类
 * @author Renault
 *
 */
public class ProductDao  {


}

五、Spring整合Struts

配置Action、Service、Dao类和配置文件

1、在applicationContext.xml里面配置action、dao、service类

 <!-- 配置Action的类 -->
 <!-- SCOPE的作用在于申明ACTION为多例模式 -->
 <bean id="productAction" class="renault.ssh.action.ProductAction" scope="prototype">
    <!-- 手动注入Service -->
    <property name="producrService" ref="productService"/>
 </bean>
 <!--配置业务层的类 -->
 <bean id="productService" class="renault.ssh.service.ProductService">
    <property name="productDao" ref="productDao" />
 </bean>    
<!-- 配置Dao的类 -->
<bean id="productDao" class="renault.ssh.dao.ProductDao">
    
</bean>

2、配置struts.xml

    <package name="ssh"  extends="struts-default" namespace="/">
        <!-- 由Spring管理的ACTION的class为Spring中的ID值,不再是类的全名 -->
        <action name="product_*" class="productAction" method="{1}">
        </action>
    </package>

3、将addProduct.jsp里面的表单的action改成 action="product_save"

4、在ProductAction.java里添加保存方法:

/**
 * 保存商品
 */
    public String save(){
        System.out.println("Action里面的save方法执行了");
        productService.save(product);
        return NONE;
    }

5、在ProductService.java里添加保存方法:

/**
 * 业务层保存商品
 * @param product
 */
    public void save(Product product) {
        System.out.println("service里面的save方法执行了");
        productDao.save(product);
        
    }

6、在ProductDao.java里添加保存方法:

/**
 * Dao里面保存商品
 * @param product
 */
    public void save(Product product) {
        System.out.println("Dao里面的save方法执行了");
    }

7、启动服务器,运行addProduct.jsp,填写商品名称和价格后提交在控制台会打印

Action里面的save方法执行了
Service里面的save方法执行了
Dao里面的save方法执行了

六、Spring整合hibernate

1、创建数据库;
>create database ssh;
2、创建实体类的映射文件Product.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="renault.ssh.model.Product" table="product">
            <id name="pid" column="pid">
                <generator class="native"/>
            </id>
            <property name="pname" column="pname" length="20"/>
            <property name="price" column="price"/>
        </class>
    </hibernate-mapping>

3、添加配置文件 jdbc.properties:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssh
jdbc.username=root
jdbc.password=admin
jdbc.maxActive=2000
jdbc.initialSize=20
jdbc.maxWait=2000
jdbc.minIdle=10

4、在applicationContext.xml配置hibernate

<!-- 引入外部的属性文件--> 
<context:property-placeholder location="classpath:jdbc.properties"/>


<!-- 配置C3P0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClassName}"></property>
    <property name="jdbcUrl" value="${jdbc.url}"></property>
    <property name="user" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
</bean>

<!-- 配置hibernate相关属性 -->           
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <!--注入连接池  -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 配置Hibernate的属性 -->
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <!-- 加载Hibernate中的映射文件 -->
    <property name="mappingResources">
        <list>
        <!-- 文件路径 -->
            <value>renault/ssh/model/Product.hbm.xml</value>
        </list>
    </property>
</bean>

5、在applicationContext.xml中的DAO里面注入sessionFactory

<!-- 配置Dao的类 -->
<bean id="productDao" class="renault.ssh.dao.ProductDao">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

6、修改ProductDao.java,调用模板完成保存的操作

package renault.ssh.dao;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import renault.ssh.model.Product;

/**
 * 商品管理的Dao类
 * @author Renault
 *
 */
//注入sessionFactory必须继承HibernateDaoSupport 
public class ProductDao extends HibernateDaoSupport {

/**
 * Dao里面保存商品
 * @param product
 */
    public void save(Product product) {
        System.out.println("Dao里面的save方法执行了");
//调用模板的方法
        this.getHibernateTemplate().save(product);
    }

}

七、添加事务管理

1、配置事务管理器,在applicationContext.xml添加如下代码:

<!--配置事务管理器  -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

2、给ProductService.java类添加注解@Transactional

八、运行程序

保存商品页面.png

控制台输出.png

数据库.png

参考

SSH整合所需要的lib包

慕课网-基于SSH实现员工管理系统之框架整合篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容