本篇文章将基于Maven项目来讲解,如不懂maven,可以参考发布的前文
依赖下载的Maven网站:https://mvnrepository.com/
Struts2
struts是什么?
基于mvc模式设计的一个web应用框架,是struts1的升级版,实现了servlet的功能,进而控制页面跳转。
用法:
1.环境搭建,在pom.xml中导入相关的依赖包
<properties>
<junit.version>3.8.1</junit.version>
<mysql.version>5.1.44</mysql.version>
<struts.version>2.5.13</struts.version>
<jstl.version>1.2</jstl.version>
<taglibs.version>1.1.2</taglibs.version>
</properties>
<dependencies>
<!-- junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<!-- jstl标准标签库 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${taglibs.version}</version>
</dependency>
</dependencies>
2.配置struts.xml(核心配置文件)
这边可以使用struts-base.xml来保存基本引用内容,再将struts-base导入struts.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!--此段代码要从struts的jar包中找到struts-2.5.dtd导入-->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 是否支持国际化(中文) -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 是否使用开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 是否开启热加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 是否开启热加载 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 是否使用动态方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 定义一个基础包,在自己所需要的其他包中引用-->
<package name="base" extends="struts-default" abstract="true">
<global-allowed-methods>regex:.*</global-allowed-methods>
</package>
</struts>
在重建一个struts-sys.xml在里面配置自己需要的内容以及跳转路径,如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!--继承struts-base.xml中定义的包-->
<package name="test" extends="base">
<action name="book_*" class="com.zking.action.BookAction" method="{1}">
<result name="index">index.jsp</result>
<result name="success" type="redirectAction">/book_selAll</result>
<result name="goUpdate" type="redirect">/update.jsp</result>
<result name="add" type="redirect">/addBook.jsp</result>
</action>
</package>
</struts>
3.开发
3.1Action 不需要指定父类(ActionSupport),
业务方法的定义
public String xxx();//execute
注1:开启动态方法调用
3.2参数赋值
Action中定义属性,并提供get/set方法
userName, getUserName/setUserName
hibernate
hibernate是什么(来源科普中国)?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。
ORM框架/持久层框架
对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
基本用法:
1.在pom.xml中添加hibernate相关依赖(推荐5.12.final的版本)
2.在hibernate目录下添加hibernate.cfg.xml(核心配置文件)如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库相关配置 -->
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="connection.url">jdbc:mysql://localhost:3306/T264?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 调试相关配置 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- EhCache驱动 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 进行实体类映射文件的注册 -->
<mapping resource="mapping/User.hbm.xml"/>
<mapping resource="mapping/Order.hbm.xml"/>
<mapping resource="mapping/OrderItem.hbm.xml"/>
<mapping resource="mapping/TreeNode.hbm.xml"/>
<mapping resource="mapping/Book.hbm.xml"/>
<mapping resource="mapping/BookCategory.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.每创建一个表都要对它做实体映射文件配置,拿Book表为例,创建Book.hbm.xml
注意:配置完之后要到hibernate核心配置文件中做实体类映射文件的注册
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="t_book" name="com.zking.entity.Book">
<id name="bookId" type="java.lang.Integer">
<column name="book_id"/>
<generator class="increment"/>
</id>
<property name="bookName" type="java.lang.String">
<column name="book_name"/>
</property>
<property name="price" type="java.lang.Double">
<column name="price"/>
</property>
<!--配置表与表之间主外键关系所用到的-->
<set name="bookCategories" table="t_book_category">
<key column="bid"/>
<many-to-many column="cid" class="com.zking.entity.BookCategory"></many-to-many>
</set>
</class>
</hibernate-mapping>
4. 如何使用hibernate完成CRUD操作
4.1 CRUD操作步骤
4.1.1 读取配置
4.1.2 创建SessionFactory
4.1.3 打开Session
4.1.4 开启事务
4.1.5 CURD
4.1.6 提交事务/回滚事务
4.1.7 关闭Session
4.2 注意事项
4.2.1 hibernate默认使用的是手动事务,因此必须显示的开启和提交事务
4.2.2 删除操作时,必须先查再删
Spring
什么是spring,它能做什么?
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
SSH2/SSM
1.1 中间层框架、万能胶
struts2
spring
hibernate
1.2 容器框架
JavaBean
IOC和AOP
如何在spring当中定义和配置一个JavaBean(使用无参构造方法+set方法创建一个JavaBean)
- id:在容器中查找Bean的id(唯一、且不能以/开头)
- class:bean的完整类名
- name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开)
- scope:(singleton(单例模式)|prototype(多例模式))默认是singleton
- abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象bean,非抽象类也可以定义成抽象bean
- parent:指定一个父bean(必须要有继承关系才行)
- init-method:指定bean的初始化方法
简单属性的配置:
8+1+3
8基础数据+String+3个sql
java.util.Date
java.sql.Date
java.sql.Time
java.sql.Timestamp
通过<value>标签赋值即可
复杂属性的配置
5.1 JavaBean
ref bean=""
5.2 List或数组
5.3 Map
5.4 Properties
用法:
配置spring-xml文件(也可以配置spring-base.xml然后导入spring-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:context="http://www.springframework.org/schema/context"
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-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 目标 -->
<bean id="bookService" class="p2.BookServiceImpl"></bean>
<!-- 前置通知 -->
<bean id="beforeAdvice" class="p2.MyMethodBeforeAdvice"></bean>
<!-- 后置通知 -->
<bean id="afterAdvice" class="p2.MyAfterReturningAdvice"></bean>
<!-- 环绕通知 -->
<bean id="methodInterceptor" class="p2.MyMethodInterceptor"></bean>
<!-- 代理对象 -->
<bean id="proxybean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref bean="bookService"></ref>
</property>
<property name="interceptorNames">
<list>
<value>afterAdvice</value>
<value>pointCutAdvice</value>
<value>methodInterceptor</value>
</list>
</property>
<property name="proxyInterfaces">
<list>
<value>p2.IBookService</value>
</list>
</property>
</bean>
<!-- 适配器 -->
<bean id="pointCutAdvice" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref bean="beforeAdvice"/>
</property>
<property name="pattern">
<value>.*buy</value>
</property>
</bean>
</beans>
什么是ssh框架?(来源于科普中国)
SSH是 struts+spring+hibernate的一个集成框架,是16年之前较为流行的一种Web应用程序开源框架。区别于 Secure Shell 。
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。
用法:1.修改spring核心配置文件:在spring-base.xml中实现hibernate与spring的集成
<?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:context="http://www.springframework.org/schema/context" 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-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 配置c3p0连接池(在需要的时候自动连接和关闭)-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/T264?useUnicode=true&characterEncoding=UTF-8" />
<property name="user" value="root" />
<property name="password" value="123" />
<!--连接池中保留的最小连接数。 -->
<property name="minPoolSize" value="5" />
<!--连接池中保留的
最大连接数。Default: 15 -->
<property name="maxPoolSize" value="30" />
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="10" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="60" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="5" />
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。
所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:
0 -->
<property name="maxStatements" value="0" />
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。
如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
<property name="breakAfterAcquireFailure" value="true" />
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod
或automaticTestTable 等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout" value="false" />
</bean>
<!-- hibernate与spring集成 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- 指定hibernate相关属性 -->
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
</props>
</property>
<!-- 指定实体映射文件 -->
<property name="mappingResources">
<list>
<value>mapping/Account.hbm.xml</value>
</list>
</property>
</bean>
<!-- hibernateTemplate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!--声明式事务配置开始 -->
<!--1) 开启自动代理 -->
<aop:aspectj-autoproxy />
<!--2) 事务管理器 begin/commit/rollback -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--3) 定义事务特性 -->
<!-- 环绕通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="edit*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="load*" propagation="REQUIRED" read-only="true" />
<tx:method name="list*" propagation="REQUIRED" read-only="true" />
<tx:method name="do*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!--4) 定义切入点 -->
<aop:config>
<!-- pointcut属性用来定义一个切入点,分成四个部分理解 [* ][*..][*Service][.*(..)] -->
<!-- A: 返回类型,*表示返回类型不限 -->
<!-- B: 包名,*..表示包名不限 -->
<!-- C: 类或接口名,*Service表示类或接口必须以Service结尾 -->
<!-- D: 方法名和参数,*(..)表示方法名不限,参数类型和个数不限 -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*DaoImpl.*(..))" />
</aop:config>
<!-- 声明式事务配置结束 -->
</beans>
SSH集成的注意事项
- .struts的xml的配置文件基本保持不变:将action标签中的class属性改成spring-xml中配置的类Acition引用就完成对struts2的集成
- 将hibernate的核心配置文件hibernate.cfg.xml中的内容放入spring.xml中,配置hibernateTemplate,将实体类映射文件也放入其中
- 在java代码中凡是引用spring中定义的bean元素,都要提供相对应的set/get方法