1-spring在web工程中使用(原理):
1-使用spring的本质是获取每一个bean对象和让spring帮我们自动注入每个属性;
2-所以需要获取ApplicationContext,ApplicationContext是单例的;
3-web中可以在服务器一启动就马上工作的有:监听器(ServletContextlistener) ,application;
4-实现原理:在web 工程中,定义个ServletContextlistener监听器,将ApplicationContext容器对象的创建语句放到监听器中,创建好后,将该容器对象存放到application域中,需要容器对象时,调用application 的 getAttribute方法;
2-整合:
整合分为两步:
1-struts跟spring整合:其中利用spring管理action;
2-spring跟mybatis整合: 其中利用spring管理sessionfactory;
3-实现步骤:
(1)整合spring:
1-导入spring的架包jar(1-必须jar和 2-logging-jar 3-spring-web-4.0.0.RELEASE.jar, spring-webmvc-4.0.0.RELEASE.jar)
2-配置文件:spring的核心配置文件:applicationContext.xml
3-在web工程中的web.xml中:
<!-- 配置spring配置文件参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置spring容器监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
(2)整合struts:
1-导入struts的jar(1-struts核心jar 2-struts2-spring-plugin-2.3.20.jar)
2-配置文件:struts.xml配置文件;
3-注册核心控制器,在web.xml中
4-整合spring(将spring和Struts结合):
1-在spring中管理action对象(注意:action作用域:prototype非单例模式,由于action是非单例的,而spring创建的对象默认是单例的,所以需要修改scpoe的属性为prototype)
<bean id="usersAction" class="com.ssm.action.UsersAction" scope="prototype"></bean>
2-在struts的配置文件中:
1- <constant name="struts.objectFactory" value="spring"></constant>
2-action的class属性不再指定全类名了,而是spring中的bean的id
<action name="xxx" class="usersAction" method="">
(3)3-整合mybatis(数据源):
1-导入mybatis的jar(1-mybatis-jar 2-数据源-jar 3-数据库-jar 4-myabtis-spring-jar)
注:由于导入的架包较多,有些架包可能会重复所以需要删减重复的jar(保留高版本的架包);
2-mybatis的配置文件:
1-mybatis配置文件中:只保留别名,缓存设置等配置(甚至可以完全删除)
2-数据源:DB.properties
3-log4j
3-整合:
1-spring的配置文件中:
1-配置数据源:
<!-- 整合数据库连接池c3p0 -->
<!-- 引入键值对文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源对象 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="maxPoolSize" value="${jdbc.maxsize}"/>
<property name="initialPoolSize" value="${jdbc.initsize}"/>
</bean>
2-配置sessionfactory:
<!-- 整合sessionfactory -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:conf.xml"/>
<property name="mapperLocations" value="classpath:com/ssm/mapper/*.xml"/>
</bean>
3-配置mapper接口:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssm.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
</bean>
4-声明式事务:
具体实现的实例:
实现对数据库中一张user表的添加操作:
使用分层,将设计分为三层:控制层control,业务逻辑层service,持久层dao.
各层目录结构如下:
(1)Bean类有User:
package com.bean;
public class User {
private int uid;
private float money;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
@Override
public String toString() {
return "User [uid=" + uid + ", money=" + money + "]";
}
}
(2)Dao层的mapper接口UserMapper
package com.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.bean.Goods;
import com.bean.User;
@Repository
public interface UserMapper {
public int AddUser(User u);
public int AddGoods(Goods g);
public List<User> selectUser();
public int deleteUser(int uid);
public int updateUser(User u);
}
(3)控制层
1.userAction,执行添加的逻辑;
package com.handler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.bean.Goods;
import com.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.service.UserService;
@Controller
public class UserAction extends ActionSupport{
private User u;
@Autowired
private UserService us;
public User getU() {
return u;
}
public void setU(User u) {
this.u = u;
}
public void setUs(UserService us) {
this.us = us;
}
public String AddUser(){
this.us.addUser(u);
/*this.us.addGoods(g);
System.out.println(g+"******");*/
return SUCCESS;
}
}
2.’selectAction执行查询的逻辑:
package com.handler;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.service.UserService;
@Controller
public class SelectAction extends ActionSupport{
@Autowired
UserService us;
List<User> l;
public UserService getUs() {
return us;
}
public void setUs(UserService us) {
this.us = us;
}
public List<User> getL() {
return l;
}
public void setL(List<User> l) {
this.l = l;
}
public String select(){
l=this.us.selectUser();
return SUCCESS;
}
}
(4)service层有:UserServlce
package com.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bean.Goods;
import com.bean.User;
import com.dao.UserMapper;
@Service
public class UserService {
@Autowired
private UserMapper um;
public void setUm(UserMapper um) {
this.um = um;
}
public void addUser(User u){
this.um.AddUser(u);
}
public void addGoods(Goods g){
this.um.AddGoods(g);
}
public List<User> selectUser(){
List<User> l=this.um.selectUser();
return l;
}
public int deleteUser(int uid){
int num=this.um.deleteUser(uid);
return num;
}
public int updateUser(User u){
int num=this.um.updateUser(u);
return num;
}
}
(5)mapper.xml的映射文件UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserMapper">
<insert id="AddUser" parameterType="user">
insert into user values(#{uid},#{money})
</insert>
<select id="selectUser" resultType="user">
select * from user
</select>
<delete id="deleteUser" parameterType="int">
delete from user where uid=#{value}
</delete>
<update id="updateUser" parameterType="user">
update user set money=#{money} where uid=#{uid}
</update>
</mapper>
(6)spring的主配置文件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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" 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.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <!-- 扫描注入 --> <context:component-scan base-package="com"></context:component-scan> <!-- <bean id="userAction" class="com.handler.UserAction" scope="prototype"> <property name="us" ref="userService"></property> </bean> --> <!-- <bean id="userService" class="com.service.UserService"> <property name="um" ref=""></property> </bean> --> <!-- 配置数据源 --> <!-- 引入键值对文件 --> <context:property-placeholder location="classpath:DB.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driverClass}"></property> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="user" value="${user}" ></property> <property name="password" value="${password}"></property> </bean> <!-- 整合sessionfactory --> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:conf.xml"></property> <property name="mapperLocations" value="classpath:com/mapper/*.xml"></property> </bean> <!--配置mapper接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.dao"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 声明式事务 --> <aop:config> <aop:pointcut expression="execution(* com.service.*.*(..))" id="pc"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/> </aop:config> </beans> (7)mybatis的核心配置文件conf.xml
(8)struts的核心配置文件struts.xml:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="com.bean"></package> </typeAliases> </configuration>
<?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> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <constant name="struts.objectFactory" value="spring"></constant> <package name="default" namespace="/" extends="struts-default"> <action name="userAction" class="userAction" method="AddUser"> <result type="redirectAction"> <param name="actionName">selectAction</param> <param name="namespace">/</param> </result> </action> <action name="selectAction" class="selectAction" method="select"> <result>/show.jsp</result> </action> <action name="deleteAction" class="deleteAction" method="delete"> <result type="redirectAction"> <param name="actionName">selectAction</param> <param name="namespace">/</param> </result> </action> <action name="updateAction" class="updateAction" method="update"> <result type="redirectAction"> <param name="actionName">selectAction</param> <param name="namespace">/</param> </result> </action> </package> </struts> 展示界面show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <% 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> <base href="<%=basePath%>"> <title>My JSP 'show.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> <table border="1px"> <tr> <td>uid</td> <td>money</td> <td>opt</td> </tr> <s:iterator value="l" var="u"> <tr> <td><s:property value="#u.uid"/></td> <td><s:property value="#u.money"/></td> <td><a href="deleteAction?uid=<s:property value="#u.uid"/>"style="width: 40px"> delete</a><a href="update.jsp?uid=<s:property value="#u.uid"/>&money=<s:property value="#u.money"/>">update</a></td> </tr> </s:iterator> </table> </body> </html>
运行结果:
添加成功后的查询结果: