什么是SSH框架:
SSH框架是struts+spring+hiberanate的一个集成框架。集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,其中使用Struts作为系统的整体基础架构,负责MVC的分离【MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写】,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。
Struts
Struts的实现依赖Servlet和JSP实现,struts 负责 web 层(表现层),EJB和JavaBean两个组件是Struts框架业务功能实现的基础部件;Action和ActionServlet部件是框架实现控制力能的重要部件 ,ActionFormBean 接收网页中表单提交的数据,然后通过 Action 进行处理,再 Forward 到对应的网页,在 struts-config.xml 中定义 , ActionServlet 会加载。
Spring
【 spring 负责业务层管理,即 Service (或 Manager).】
Spring通过采用依赖注入(DI)的方式,通过属性的Setter和Getter方法来注入这个对象的属性,这样的好处就是不完全依赖于容器的API,且查询依赖与代码实现了解耦。而AOP,则是将应用的业务逻辑和系统级服务(例如事务)分离开来,进行内聚性的开发,应用对象只负责完成业务逻辑而不关心日志或者事务的处理。
service 为 action 提供统计的调用接口,封装持久层的 DAO;可以写一些自己的业务方法;统一的 javabean 管理方法;声明式事务管理;集成 Hiberante。
Hibernate
【负责跟数据库的交接,通过持久化数据对象,进行对象关系的映射,并以对象的角度来访问数据库。通过封装JDBC,使得开发人员可以以面向对象编程的思想来操控数据库,从而摆脱了以往使用JDBC编程时的“死板”操作,并且Hibernate有自己的HQL语句,与数据库的SQL语句相似。】
对象的调用流程是: jsp-> Action - > Service ->DAO ->Hibernate 。
数据的流向是 ActionFormBean 接受用户的数据, Action 将数据从ActionFromBean 中取出封装,再调用业务层的 Bean 类,完成各种业务处理后再 forward 。而业务层 Bean 收到这个 PO 对象之后,会调用 DAO 接口方法
部分代码记录:
所需使用的jar包:
在web下的web.xml中配置struts的filter.
代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 配置struts开始 --> <filter> <filter-name>myStruts</filter-name> <!--这个过滤器的名字可以随便写--> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>myStruts</filter-name> <!--要和上面的那个过滤器的名字一致--> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置struts结束 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
在bean.xml文件中各种配置的注释
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd "> <context:annotation-config/> <!-- 打开自动扫描 --> <context:component-scan base-package="cn.itbaizhan" /> <!-- 配置数据源和数据库连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/webshopping" /> <property name="user" value="root"/> <property name="password" value="root"/> <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="1"/> <!--连接池中保留的最小连接数。--> <property name="minPoolSize" value="1"/> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize" value="100"/> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="60"/> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="5"/> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="60"/> </bean> <!-- 将数据源注入到Spring的sessionFactory中 --> <!--<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">--> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan"> <list> <value>cn.itbaizhan.po</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="format_sql">true</prop> </props> </property> </bean> <!-- 配置spring的HibernateTemplate的事务模版 自动生成数据表--> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
创建Action类继承ActionSupport
public class GoIndexAction extends ActionSupport { private CommodityClassService commodityClassService; private List<CommodityClass> commodityClasses;// 商品种类列表 public CommodityClassService getCommodityClassService() { return commodityClassService; }
Dao层接口:
public interface CommodityDao { public void save(Commodity commodity); public void delete(Commodity commodity); public Commodity findCommodityById(int id); public List<Commodity> findAllCommoditys(); public void update(Commodity commodity); public List<Commodity> findCommodityByName(String Name); public List<Commodity> findCommodityByClass(CommodityClass commodityclass); public List<Commodity> findCommodityBName(String name); }
执行Hql语句操作数据库
@SuppressWarnings("unchecked") public List<Message> findAllMessages() { String hql = "from Message"; return (List<Message>)hibernateTemplate.find(hql); }
Service层的封装
public interface CommodityService { // 和CommodityDao的方法一样,可以封装,因为这边只是调用 public void save(Commodity commodity); public void delete(Commodity id); public Commodity findCommodityById(int id); public List<Commodity> findAllCommoditys(); public void update(Commodity commodity); public List<Commodity> findCommodityByName(String Name); public List<Commodity> findCommodityByClass(CommodityClass commodityclass); public List<Commodity> findCommodityBName(String commodityName); }
Jsp店铺管理页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>网上商城系统后台管理</TITLE> <META http-equiv=Content-Type content="text/html; charset=utf-8"> <LINK href="images/style.css" type=text/css rel=stylesheet> <STYLE> .main_left { TABLE-LAYOUT: auto; BACKGROUND: url(images/left_bg.gif) } .main_left_top { BACKGROUND: url(images/left_menu_bg.gif); PADDING-TOP: 5px } .main_left_title { PADDING-LEFT: 15px; FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #fff; TEXT-ALIGN: left } .left_iframe { BACKGROUND: none transparent scroll repeat 0% 0%; VISIBILITY: inherit; WIDTH: 180px; HEIGHT: 92% } .main_iframe { Z-INDEX: 1; VISIBILITY: inherit; WIDTH: 100%; HEIGHT: 92% } TABLE { FONT-SIZE: 12px; FONT-FAMILY: tahoma, 宋体, fantasy } TD { FONT-SIZE: 12px; FONT-FAMILY: tahoma, 宋体, fantasy } </STYLE> <SCRIPT language=javascript src="images/admin.js" type=text/javascript></SCRIPT> <SCRIPT language=javascript src="images/Admin(1).js"></SCRIPT> <SCRIPT> var status = 1; var Menus = new DvMenuCls; document.onclick=Menus.Clear; function switchSysBar(){ if (1 == window.status){ window.status = 0; switchPoint.innerHTML = '<img src="images/left.gif">'; document.all("frmTitle").style.display="none"; } else{ window.status = 1; switchPoint.innerHTML = '<img src="images/right.gif">'; document.all("frmTitle").style.display=""; } } </SCRIPT> <META content="MSHTML 6.00.2900.5726" name=GENERATOR> </HEAD> <BODY> <!--导航部分--> <c:if test="${!empty sessionScope.admin.username}"> <DIV class=top_table align="center" style="margin:1px auto;width:80%"> <DIV class=top_table_leftbg> <DIV class=system_logo></DIV> <DIV class=menu> <UL> <LI id=menu_1 onm ouseover=Menus.Show(this,0) onclick=getleftbar(this);><A href="#">商品管理</A> <DIV class=menu_childs onm ouseout=Menus.Hide(0);> <UL> <LI><A href="include/commodityClass/commodityClassAdd.jsp" target="frmright">新增商品种类</A></LI> <LI><A href="CommodityClassAction!listCommodityClass.action" target=frmright>商品种类列表</A></LI> <LI><A href="CommodityAction!adCommodity.action" target=frmright>商品录入</A></LI> <LI><A href="CommodityAction!listCommodity.action" target=frmright>商品列表</A></LI> </UL> </DIV> <DIV class=menu_div> <IMG style="VERTICAL-ALIGN: bottom" src="images/menu01_right.gif"> </DIV></LI> <LI id=menu_2 onm ouseover=Menus.Show(this,0) onclick=getleftbar(this);><A href="#">订单管理</A> <DIV class=menu_childs onm ouseout=Menus.Hide(0);> <UL> <LI><A href="OrderFormAction!listOrderForm.action" target=frmright>订单列表</A></LI> </UL> </DIV> <DIV class=menu_div> <IMG style="VERTICAL-ALIGN: bottom" src="images/menu01_right.gif"> </DIV></LI> <LI id=menu_3 onm ouseover=Menus.Show(this,0) onclick=getleftbar(this);><A href="#">用户管理</A> <DIV class=menu_childs onm ouseout=Menus.Hide(0);> <UL> <LI><A href="UserAction!listUser.action" target=frmright>用户列表</A> </LI> <LI><A href="include/user/userQuery.jsp" target=frmright>用户查询</A> </LI> </UL> </DIV> <DIV class=menu_div> <IMG style="VERTICAL-ALIGN: bottom" src="images/menu01_right.gif"> </DIV></LI> <LI id=menu_4 onm ouseover=Menus.Show(this,0) onclick=getleftbar(this);><A href="#">系统管理</A> <DIV class=menu_childs onm ouseout=Menus.Hide(0);> <UL> <LI><A href="include/admin/amend.jsp" target=frmright>修改登录密码</A> </LI> </UL> </DIV> <DIV class=menu_div> <IMG style="VERTICAL-ALIGN: bottom" src="images/menu01_right.gif"> </DIV></LI> </UL> </DIV> </DIV> </DIV> <DIV style="BACKGROUND: #337abb; WIDTH: 80%;margin:1px auto; HEIGHT: 24px"></DIV> <!--导航部分结束--> <TABLE style="BACKGROUND: #337abb" height="92%" cellSpacing=0 align="center" cellPadding=0 width="80%" border=0> <TBODY> <TR> <TD class=main_left id=frmTitle vAlign=top align=center> <TABLE class=main_left_top cellSpacing=0 cellPadding=0 width="100%" border=0> </TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR height=32> <TD vAlign=top></TD> <TD vAlign="bottom" align="center"></TD> <TD vAlign=top align=right></TD> </TR> </TBODY> </TABLE> </TD> <TD style="WIDTH: 10px" bgColor=#337abb> > <TD vAlign=top width="100%" bgColor=#337abb> <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#c4d8ed border=0> <TBODY> <TR height=32> <TD text-align:center><SPAN >店铺系统后台管理</SPAN> <SPAN id=dvbbsannounce style="FONT-WEIGHT: bold; FLOAT: left; WIDTH: 80%; COLOR: #c00"> </SPAN></TD> <TD style="COLOR: #135294; TEXT-ALIGN: right" >管理员:${sessionScope.admin.username}| <A href="index.jsp">后台首页</A> | <A href="/webbikeshop/GoIndexAction.action" target=_top>店铺首页</A> | <A href="login.jsp" onclick="return confirm('确定要退出吗?')" target=_top>退出 </A> </TD> <TD align=right width=16 bgColor=#337abb></TD> </TR> </TBODY> </TABLE> <IFRAME class=main_iframe id=frmright name="frmright" src="syscome.htm" frameBorder=0 scrolling=yes></IFRAME> <TABLE style="BACKGROUND: #c4d8ed" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> </TBODY> </TABLE> </TD> </TR> </TBODY> </TABLE> <DIV id=dvbbsannounce_true style="DISPLAY: none"></DIV> </c:if> <c:if test="${empty sessionScope.admin.username}"> <table width=100% height=80% align=center bgColor="#c0c0c0"> <tr> <td align="center"> <h3>对不起,还未登录,请登录</h3> <h3> 正在跳转到登录页面,若没有跳转请<a href=login.jsp>点击这里!</a> </h3> </td> </tr> </table> <% response.setHeader("refresh", "2;url=login.jsp"); %> </c:if> </BODY> </HTML>