Spring4第五讲学习笔记,整合Spring,Struts,Mybatis框架

来源:互联网 发布:java nio长连接实现 编辑:程序博客网 时间:2024/05/19 10:40

1.导入Spring4 struts2 Mybatis JAR包 

注意导入整合包 :struts2-spring-plugin-2.3.4.jar mybatis-spring-1.2.3.jar 还有数据库驱动


aopalliance.jar
asm-3.3.1.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
aspectjweaver.jar
cglib-2.2.2.jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.1.jar
freemarker-2.3.19.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-rc1.jar
log4j-core-2.0-rc1.jar
mybatis-3.2.7.jar
mybatis-spring-1.2.3.jar
mysql-connector-java-5.1.20-bin.jar
ognl-3.0.5.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
spring-aop-4.1.6.RELEASE.jar
spring-aspects-4.1.6.RELEASE.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-context-support-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-orm-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-webmvc-4.1.6.RELEASE.jar
struts2-core-2.3.4.jar
struts2-spring-plugin-2.3.4.jar
xwork-core-2.3.4.jar
2.编写配置文件
需要在web.xml声明Spring和struts的配置文件。web.xml是整个配置文件的指挥者。

Spring配置文件是applicationContext.xml

 Struts2的配置文件是struts.xml
为了配置Spring的配置文件,首先需要在web.xml中添加全局参数。
首先配置全局参数context-param, 参数名是全局配置文件路径contextConfigLocation,值是classpath:applicationContext.xml
配置一个监听器,全局加载监听器contextLoaderListener,它在初始化的时候创建webApplicationContext容器,根据全局参数contextConfigLocation的路径去加载Spring的配置文件
再配置struts2的过滤器的相关信息,filter 和 filter-mapping

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" 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">
<!-- 配置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>
<!-- 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>*.action</url-pattern>
  </filter-mapping>


<display-name>Struts Showcase Application</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>


</web-app>
3.配置mybatis的配置文件
mybatis.cfg.xml ,映射命名空间的sql语句

mybatis.cfg.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>
<mappers>
<!--注意在这里注册user的userMapper.xml配置文件,文件夹的"/"导入-->
<mapper resource="domain/userMapper.xml"/>
</mappers>
</configuration><?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="domain.userMapper">
<select id="getAll" resultType="domain.User">
select * from user
</select>
<insert id="addUser" parameterType="domain.User">
insert into user(name,pwd) values(#{name},#{pwd})
</insert>

查询动作,相当重要,根据修改后的全局ID查询并返回User对象
<select id="getUserById" resultType="domain.User" parameterType="int">
select * from user where id = #{id}
</select>

<update id="updateUser" parameterType="domain.User">
update user set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<delete id="deleteUser" parameterType="domain.User">
delete from user where id=#{id}
</delete>
</mapper>
4.编码

 domain dao dao.impl service service.impl  action

domain
public interface UserDao {
public List<User> getAll();

public int add(User user);

public User getUserById(int id);

public int update(User user);

public int delete(User user);


}dao.impl
package dao.imp;


import java.util.List;


import org.mybatis.spring.support.SqlSessionDaoSupport;


import dao.UserDao;
import domain.User;


public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
/*在spring配置文件中注入的是sqlSessionFactory,它继承了sqlSessionDaoSupport可以直接使用getSqlSession()方法得到sqlSession*/

@Override
public List<User> getAll() {
String statement ="domain.userMapper.getAll";//映射的是user的命名空间和ID
return this.getSqlSession().selectList(statement);
}


@Override
public int add(User user) {
String statement ="domain.userMapper.addUser";
return this.getSqlSession().insert(statement, user);
}


@Override
public User getUserById(int id) {
String statement = "domain.userMapper.getUserById";
return this.getSqlSession().selectOne(statement, id);
}


@Override
public int update(User user) {
String  statement ="domain.userMapper.updateUser";
return this.getSqlSession().update(statement, user);
}

public int delete(User user){
String statement="domain.userMapper.deleteUser";
return this.getSqlSession().delete(statement,user);

}




}

package service;


import java.util.List;


import domain.User;


public interface UserService {
/*UserService接口,与UserDao接口保持一致*/
public List<User> getAll();

public int add(User user);

public User getUserById(int id);

public int update(User user);

public int delete(User user);


}
package service.imp;


import java.util.List;


import service.UserService;
import dao.UserDao;
import domain.User;


public class UserServiceImpl implements UserService{
private UserDao userDao;//通过Spring的Bean注入,需要set方法
@Override
public List<User> getAll(){
return userDao.getAll();
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public int add(User user) {
return userDao.add(user);
}
@Override
public User getUserById(int id) {
return userDao.getUserById(id);
}
@Override
public int update(User user) {
return userDao.update(user);
}
@Override
public int delete(User user) {
return userDao.delete(user);
}


}
8.添加记录  首先在list.jsp页面中添加一个超链接,跳转至toAdd.action请求,struts2根据请求对应的方法转发至add.jsp,在账户和密码上写记录。记录提交至add.aciton,Action中调用service的方法。service调用userDao。userDao里继承的是SqlSessionDaoSupport,注入sqlSessionFactory。this.getSqlSession().insert(statement,参数)。statement指向的是mybatis命名空间的类名加标签ID。


9.查询记录,修改记录之前必须先查询到个别user。在userDao中根据迭代器中提交的参数ID查询到相关的user。在执行超链接中的action的时候它的参数把全局的user的id改为此行记录的id
<td><a href="toUpdate.action?user.id=<s:property value="id" />">修改</a></td>


10.更新记录
在list.jsp页面中添加超链接,跳转是toUpdate.action请求,struts2根据请求对应的方法转发至update.jsp,必须先获取要修改对象的<a href="toUpdate.action?user.id=<s:property value="id" />">修改</a>ID,通过添加参数的方法提交。
在update.jsp中修改完成后向update.action提交请求,在Action中调用service方法。修改完成后跳转list.action至list.jsp


11.删除
在list.jsp页面中添加超链接,执行delete.action,同上,根据此行的ID,将全局的user的id改为它,执行userService的删除方法。



Action:UserAction


package action;


import java.util.List;


import service.UserService;


import com.opensymphony.xwork2.Action;


import domain.User;

userAction
public class UserAction implements Action{
private List<User> list;//需要set和get方法,用于OGNL表达式在页面展示数据,需要set和get方法
private UserService userService;//通过Spring的Bean注入userService,需要set方法
private User user;//属性驱动,用于接收页面提交的一些参数,需要set,get方法

@Override
public String execute() throws Exception {
System.out.println("默认的action的execute方法执行");
return Action.SUCCESS;
}
public String list(){
list = userService.getAll();
return Action.SUCCESS;
}


public String toAdd(){

return Action.SUCCESS;
}

public String add(){
System.out.println("add function run");
int i =userService.add(user);
return i>0?Action.SUCCESS:Action.ERROR;
}
public String toUpdate(){
user = userService.getUserById(user.getId());//修改,先根据页面提交的更改后的全局ID,拿到查询的user对象
System.out.println("接受到的User的ID是:"+user.getId());
return Action.SUCCESS;
}
public String update(){
int i =userService.update(user);
return i>0?Action.SUCCESS:Action.ERROR;
}

public String delete(){
user = userService.getUserById(user.getId());  //删除,先根据全局ID查询到user对象
System.out.println("即将删除的ID是:"+user.getId());
int i = userService.delete(user);
return i>0?Action.SUCCESS:Action.ERROR; //三目运算符
}




public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}

5.编写Spring的applicationContext.xml和struts.xml配置文件
str
<?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>
<include file="config/struts/user.xml"></include>
</struts>
--------------------------------------------------------------------------------------------------------------
user.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>
user模块的Spring配置文件在为Action注入userService的时候,bean的id是userAction,class="action.UserAction"所以这里也可以这么写
    <package name="user" namespace="/" extends="struts-default">
<action name="list" class="userAction" method="list">
<result>/list.jsp</result>
</action>

添加就要跳转至添加页面
<action name="toAdd" class="userAction" method="toAdd">
<result type="redirect">/add.jsp</result>
</action>
添加成功跳转list.action重新加载list.jsp
<action name="add" class="userAction" method="add">
<result name="success" type="redirectAction">list</result>
<result name="error">/index.jsp</result>
</action>
更新先要查询,先获取迭代器中的要被修改的User的ID,根据此ID修改全局User。成功后跳转更新页面,填写相应的更新信息,这个时候是通过属性驱动修改User的信息,ID跟Action要。下面的蓝色代码

<action name="toUpdate" class="userAction" method="toUpdate">
<result>/update.jsp</result>
</action>
修改页面通过属性驱动向Action提交,成功后重新加载list.jsp

<action name="update" class="userAction" method="update">
<result name="success" type="redirectAction">list</result>
<result name="error">/index.jsp</result>
</action>

<action name="delete" class="userAction" method="delete">
<result name="success" type="redirect">list.action</result>
<result name="error">/index.jsp</result>
</action>
    </package>
</struts>

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body background="images/bgPic">
<table width="80%" border="2" bordercolor="0f0f0f">
<tr>
<td>编号</td>
<td>姓名</td>
<td>密码</td>
<td>操作</td>
</tr>
<s:iterator value="list">
<tr>
<td><s:property value="id" /></td>
<td><s:property value="name" /></td>
<td><s:property value="pwd" /></td>
<td>
<a href="toUpdate.action?user.id=<s:property value="id" />">修改</a>
<a href="delete.action?user.id=<s:property value="id" />" >删除</a>

</td>
</tr>
</s:iterator>
</table>
<h3><a href="toAdd.action" >添加一条记录</a></h3>

</body>
</html>
update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="update.action" method="post">
<input type="hidden" name="user.id" value="<s:property value="user.id"/>">
账户名<input type="text" name="user.name" value="<s:property value="user.name"/>">
密码 <input type="text" name="user.pwd" value="<s:property value="user.pwd"/>">
<input type="submit" value="提交">
</form>
</body>
</html>
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: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">

<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="3333"/>
</bean>
<!-- 声明式事务配置 开始 -->
<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 配置哪些方法使用什么样的事务,配置事务的传播特性 -->
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="insert" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="remove*" propagation="REQUIRED"/>
<tx:method name="get" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* service.impl.*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
<!-- 声明式事务配置 结束 -->

sqlSessionFactory需要两个核心参数,一个是数据源ref,另一个是mybatis的配置文件value
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.
SqlSessionFactoryBean">
<property name=
"dataSource"ref="dataSource"/>
<property name="configLocation"value="classpath:mybatis.cfg.xml"></property>
这里我看到还有别人用了mapperLoactions参数
</bean>


<import resource="config/spring/user.xml"/>添加user模块的Spring配置文件


</beans>

----------------------------------------------------------------------------
user.xml User模块的Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/aop    
                          http://www.springframework.org/schema/aop/spring-aop-3.1.xsd   
                         http://www.springframework.org/schema/tx    
                          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
       
<bean id="userDao"class="dao.imp.UserDaoImpl">
<property name=
"sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>

<bean id="userService" class="service.imp.UserServiceImpl">
<property name="userDao"ref="userDao"></property>
</bean>

<bean id="userAction"class="action.UserAction" scope="prototype">
struts的配置文件中可以引用这个ID作为class,并且设置这个的范围是prototype,
每次创建都产生新的对象,跟struts的Action保持一致

<property name="userService"ref="userService"></property>
</bean>

       
       
       
</beans>

附 index.jsp     <h1><a href="list.action">管理员登录</a></h1>

add.jsp  属性驱动

<body>
<form action="add.action" method="post">
账户名<input type="text" name="user.name">
密码 <input type="text" name="user.pwd">
<input type="submit" value="提交">
</form>
</body>

原创粉丝点击