SSH 架构
这几天学习了 ssh 架构,中间出了好多错误,现在终于整理好了,就记录下来
ssh机构的框架构成,以及它们的作用
struts2 :这个框架主要用做控制处理的,其核心是 Contraller ,即 ActionServlet。而 ActionServlet 的核心是 struts.xml。用于分配处理web请求需要执行哪个业务逻辑。
spring :spring 可以理解为粘合剂的作用。它把这三个框架糅合在一起使用。利用本身的控制反转(IOC) 来达到解耦的目的。
Hibernate:及时数据持久层。只要用来操作数据库。它通过把关系型数据的 数据结构映射编程面向对象的概念。让程序员不用变换思维就离异实现对数据库的操作。
这次实例使用的各个框架的版本。
struts-2.3.15.3
spring-3.2.0
hibernate-3.6.10
使用的 jar 包
1、struts2 使用的 jar 包
1) struts2 → apps → struts-blank 实例空项目 → web-INF → lib 下的所有 jar 包。(从官网在的struts2 里面有这个 struts-blank 实例空项目)
2)struts2-convention-plugin-2.3.15.3.jar struts2 注解开发用的 jar 包。
3)struts2-spring-plugin-2.3.15.3.jar struts2用于整合 spring 的 jar 包。
2、Hibernate 使用的 jar 包
1) Hibernate3.jar Hibernate 根目录下的
2) hibernate → lib → required 目录下的所有 jar 包。
3)hibernate-entitymanager-2.0.Final.jar hibernate → lib → required 目录下
4)日志记录用的包 slf4j-log4j12.1.7.5.jar
5) mysql-connector-java-5.1.25-bin.jar 数据库的驱动包
3、spring 使用的 jar 包
1) IOC 的开发用到的包
spring-beans-3.2.5.RELEASE.jar
spring-context-3.2.5.RELEASE.jar
spring-core-3.2.5.RELEASE.jar
spring-expression-3.2.5.RELEASE.jar
com.springsource.org.apache.log4j-1.2.15.jar
com.springsource.org.apache.commons.logging-1.1.1.jar (不进行具体的日志记录,整合其他的日志系统的)
2)AOP 的开发
spring-aop-3.2.5.RELEASE.jar
spring-aspects-3.2.5.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar (AOP 联盟的包)
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-jdbc-3.2.5.RELEASE.jar
spring-test-3.2.5.RELEASE.jar
spring-web-3.2.5.RELEASE.jar
spring-orm-3.2.5.RELEASE.jar
spring-tx-3.2.5.RELEASE.jar
引入相应的配置文件
1、struts2 框架的配置文件
web.xml (关于struts2 的配置)
<!-- struts2 框架的核心过滤器的配置 -->
<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>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- /* * Licensed to the Apache Software Foundation (ASF) under one * or
more contributor license agreements. See the NOTICE file * distributed with
this work for additional information * regarding copyright ownership. The
ASF licenses this file * to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance * with the License.
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0
* * Unless required by applicable law or agreed to in writing, * software
distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the
License for the * specific language governing permissions and limitations
* under the License. */ -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> </struts>
2、Hibernate 配置文件
hibernate.cfg.xml (在整理中这个配置文件时可以省略的,相应的内容写到 spring 配置文件中了)
映射文件(*.bhm.xml)
3、spring 配置文件
web.xml (关于spring的配置)
<!-- 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>
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: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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd "> <!-- 引入外部文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 设置数据库链接池 c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<!-- <property name="driverClass" value="com.mysql.jdbc.Driver"></property> -->
<!-- <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb"></property> -->
<!-- <property name="user" value="root"></property> -->
<!-- <property name="password" value="123456"></property> -->
</bean> <!-- 配置hibernate的相关属性 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入連接池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置 Hibernate 属性 -->
<property name="hibernateProperties">
<props>
<!-- mysql 方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!-- 是否打印 sql 语句 -->
<prop key="hibernate.show_sql">true</prop>
<!-- sql 语句是否格式话,格式化就是能够方便阅读的格式 -->
<prop key="hibernate.format_sql">true</prop>
<!-- 是否自动更新表结构 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 加载 Hibernate 映射属性 -->
<property name="mappingResources">
<list>
<value>cn/myssh/entity/Product.hbm.xml</value>
</list>
</property>
</bean> <bean id="productAction" class="cn.myssh.action.ProductAction">
<property name="productService" ref="productService"></property>
</bean> <bean id="productService" class="cn.myssh.service.ProductService">
<property name="productDao" ref="productDao"></property>
</bean> <bean id="productDao" class="cn.myssh.dao.ProductDao">
<!-- 因为 ProductDao 继承了HibernateDaoSupport,HibernateDaoSupport 里面有 setSessionFactory
方法, -->
<!-- 所以可以直接注入,HibernateDaoSupport 里面还有创建 HibernateTemplate 方法 -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <!-- 事物管理配置器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <!-- 开启注解事物 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
applicationContext
建造包结构及实体
package cn.myssh.entity; /**
* 商品管理的实体类
* @author Administrator
*
*/
public class Product implements java.io.Serializable{
private int pid;
private String pname;
private double price;
public int getPid() {
return pid;
}
public void setPid(int 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;
}
}
实体类 product 对象
struts2 整合 spring 保存添加的商品为例
1、添加页面例子
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'addProduct.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<h1>保存商品</h1>
<s:form action="product_save" method="post" namespace="/" theme="simple">
<table border="1" width="500px">
<tr>
<td>商品名称</td>
<td><s:textfield name="pname"></s:textfield></td>
</tr>
<tr>
<td>商品价格</td>
<td><s:textfield name="price"></s:textfield></td>
</tr>
<tr>
<td colspan="2"><s:submit value="tijiao"></s:submit></td>
</tr>
</table>
</s:form>
</body>
</html>
addProduct.jsp
2、后台逻辑条用的过程
addProduct.jsp 发出请求 → 在struts.xml 中找到对应的 Action 执行(productAction save) → 通过注入的 ProductService 方法找到 对应的 逻辑处理 → 通过注入到 ProductService 里面的对象找到对应的的 productDao执行 → 更新到数据库里面。
3、关于 productAction 类
1) ProductService 注入到 productAction 里面。
1 在以前注入的时候都需要借用 beans 工具类,就是在 applicationContext 配置,然后写一个类来获取折耳根配置。
2 现在有了 struts2-spring-plugin-2.3.20.jar(整理struts2和plugin)jar 包。可以自动装配了。
在 jar 包中 有个 struts-plugin.xml 文件,中间看了 <constant name="struts.objectFactory" value="spring" /> 这是一个 struts2 的常量。在 struts-core 包中 有个 default.properties。里面有常量的介绍。struts.objectFactory = spring 这句话原本是被注释的,但是 <constant name="struts.objectFactory" value="spring" /> 给打开了。就引发了 struts.objectFactory.spring.autoWire = name 即 是自动装配
<!-- 在 struts.xml 里面配置 -->
<package name="myssh" extends="struts-default" namespace="/">
<!-- productAction 之所以直接用 productAction 这个是因为在 applicationContext.xml 进行了配置 -->
<action name="product_*" class="productAction"
method="{1}">
<result name="none">index.jsp</result>
</action> </package>
package cn.myssh.action; import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; import cn.myssh.entity.Product;
import cn.myssh.service.ProductService; /**
* 商品管理的 action 类
* @author Administrator
*
*/
public class ProductAction extends ActionSupport implements ModelDriven<Product> {
/**
* 模型驱动使用的类
*/
private Product product = new Product(); public Product getModel()
{
return product;
}
//spring 和 struts2 整合过程中,按照名称自动注入业务层类
private ProductService productService; public void setProductService(ProductService productService) {
this.productService = productService;
} /**
* 保存商品的方法
*/
public String save()
{
System.out.println("save the product");
productService.save(product);
return "none";
}
}
productAction
4、在 applicationContext.xml 配置 Action、service、dao 。(见上面贴出的 applicationContext.xml )
5、添加保存方法。
/**
* 保存商品的方法
*/
public String save()
{
System.out.println("save the product");
productService.save(product);
return "none";
}
ProductAction 里面的 save 方法
public void save(Product product)
{
productDao.save(product);
System.out.println("service 中的方法执行了");
}
ProductService 里面 save 方法
public void save(Product product) {
System.out.println("dao 的save 方法");
}
productDao 里面的 save 方法
到这儿,执行 addProduct 方法,后台的过程就是框架整合后的过程,只是还没有更新到数据库里面
整合 spring 和 Hibernate
1、引入 jdbc.properties ,目录在src 下。
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/testdb
jdbc.username=root
jdbc.password=123456
2、配置映射文件,这个文件需要和映射的提示文件放在一个包下。
<?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="cn.myssh.entity.Product" table="product">
<id name="pid" column="pid">
<generator class="native"></generator>
</id> <property name="pname" column="pname" />
<property name="price" column="price" />
</class>
</hibernate-mapping>
Product.hbm.xml
3、applicationContext.xml 获取 jdbc.properties 配置数据库链接 用的是 c3p0 的连接方式。
<!-- 引入外部文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 设置数据库链接池 c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<!-- <property name="driverClass" value="com.mysql.jdbc.Driver"></property> -->
<!-- <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb"></property> -->
<!-- <property name="user" value="root"></property> -->
<!-- <property name="password" value="123456"></property> -->
</bean> <!-- 配置hibernate的相关属性 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入連接池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置 Hibernate 属性 -->
<property name="hibernateProperties">
<props>
<!-- mysql 方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!-- 是否打印 sql 语句 -->
<prop key="hibernate.show_sql">true</prop>
<!-- sql 语句是否格式话,格式化就是能够方便阅读的格式 -->
<prop key="hibernate.format_sql">true</prop>
<!-- 是否自动更新表结构 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 加载 Hibernate 映射属性 -->
<property name="mappingResources">
<list>
<value>cn/myssh/entity/Product.hbm.xml</value>
</list>
</property>
</bean>
applicationContext.xml 的 Hibernate 相关配置部分
4、dao 方法继承 ActionSupport 实现接口 ModelDriven<T>
package cn.myssh.action; import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; import cn.myssh.entity.Product;
import cn.myssh.service.ProductService; /**
* 商品管理的 action 类
* @author Administrator
*
*/
public class ProductAction extends ActionSupport implements ModelDriven<Product> {
/**
* 模型驱动使用的类
*/
private Product product = new Product(); public Product getModel()
{
return product;
}
//spring 和 struts2 整合过程中,按照名称自动注入业务层类
private ProductService productService; public void setProductService(ProductService productService) {
this.productService = productService;
} /**
* 保存商品的方法
*/
public String save()
{
System.out.println("save the product");
productService.save(product);
return "none";
}
}
productDao
5、创建数据库 testdb,配置了
<!-- 是否自动更新表结构 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
运行项目 会自动创建 / 更新表结构,
结束感悟
1、原来三个框架都是最新版本,有些包总是找不到,代码检查没有错,还是执行不了。怀疑是 版本兼容问题。
2、在配置过程路径或者文件名字,能复制的尽量复制。手桥极容易敲错,但是配置不顺利。比如我桥 classpath 就写成了 classpash 废了好大劲儿才检查出来。
3、配置中能用自动提醒的,就用自动提醒。
4、配置方法有注解和xml两种。
SSH 架构的更多相关文章
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- WebLogic使用SSH架构部署遇到org.hibernate.hql.internal.ast.HqlTok
其实这个问题在以前就遇到过,当时解决了,但今天在部署一个测试轻应用的时候一直没有想起来,特此记录一下. 这个问题出现在使用WebLogic(我使用的是10.3.5版本)发布SSH架构的应用.在操作数据 ...
- SSH架构
说说项目架构整个变化过程吧 拿用户注册来举例: 数据库里面有一张User表 需要把注册信息存储到User表中 1. 最开始是两层架构 就是cliect + jsp + DB 就是在 ...
- SSH架构实现在线支付功能
在线支付是指卖方与卖方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务,她为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具,在线支付不仅帮助企业实 ...
- ssh架构简单解释和vo po解释
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forwa ...
- SSH架构简单总结
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forw ...
- ssh架构之hibernate(五)hql语句狂练
1.练习题 1.查询所有商品的名称[查询特定属性](只有一个参数的话可以使用List<String>接收数据)2.查询所有商品的名称和供应商[查询特定属性](多个参数可以使用List< ...
- ssh架构之hibernate(四)二级缓存
二级缓存使用步骤: 1.拷贝jar包 2.配置Hibernate.cfg.xml文件 a.#开启二级缓存 hibernate.cache.use_second_level_cache=true b.# ...
- ssh架构之hibernate(三)关系映射
1.单向多对一 1.映射文件配置 2.model: 测试 1.查询测试 执行顺序,先查询多方,在查询一方,一方采用延迟加载 注意:如果不使用一方的数据,就关闭session,报错,同延迟加载中的报错类 ...
随机推荐
- Web并发页面访问量统计实现
Web并发页面访问量统计实现 - huangshulang1234的博客 - CSDN博客https://blog.csdn.net/huangshulang1234/article/details/ ...
- SparkStreaming+Kafa+HBase
1. 总结一些概念: 安装zookeeper3.4.6 cp zoo_sample.cfg zoo.cfgvim zoo.cfg tickTime=2000initLimit=10syncLimit= ...
- AngularJS 1.x系列:AngularJS简介及第一个应用(2)
1. 安装AngularJS 1.1 AngularJS官网 Github源码:https://github.com/angular/angular.js 官网:https://angularjs.o ...
- Jekins相关笔记
Jekins忘记密码操作 https://blog.csdn.net/intelrain/article/details/78749635 Jekins重启 https://www.cnblogs.c ...
- flask 状态保持session和上下文session的区别
问题场景: 在falsk项目中导入了两个session: 首先,配置文件config.py文件中 有个 flask_session扩展导入了Session ( from flask_sessi ...
- 转 spring注解式参数校验
转自: https://blog.csdn.net/jinzhencs/article/details/51682830 转自: https://blog.csdn.net/zalan01408980 ...
- 【数学建模】MatLab 数据读写方法汇总
1.读入 txt 文件数据. load xxx.txt A=load(‘xxx.txt’) A=dlmread(‘xxx.txt’) A=importdata(‘xxx.txt’) 例:将身高体重的 ...
- jQUERY中的属性获取
jQuery获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...}); //为Se ...
- Android : Resource is not a Drawable (color or path)
错误1:android.content.res.Resources$NotFoundException 错误2:Resource is not a Drawable (color or path) 解 ...
- Redux Counter Vanilla example
此示例不需要构建系统或视图框架,并且存在以显示与ES5一起使用的原始Redux API. 代码如下 <!DOCTYPE html> <html> <head> &l ...