上一章写到了spring 集成 struts2 ,这章接着上一次写,集成持久层myibatis
上一章:http://blog.csdn.net/lipp555/article/details/50725678
导入的jar包:
项目结构:
1.首先导入jar包
2.创建一个测试数据库(数据库版本:Mysql),数据库名称:lzz
在lzz数据库中创建一个测试表:user
表结构如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键' , `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名' , `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码' , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=8 ROW_FORMAT=COMPACT ;
3.开始编码,首先规划好目录结构,在src目录下创建
4.代码如下:
User.java
package com.ss02.user.model; public class User { private Integer id; private String name; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User[id="+id+" , username="+name+" , password="+password+"]"; } }
user.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.ss02.user.dao.UserDao"> <select id="getUserById" parameterType="int" resultType="userBean"> SELECT * FROM user WHERE id=#{id} </select> <insert id="insertUser" parameterType="userBean" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name,password) VALUES (#{name},#{password}) </insert> <update id="updateUser" parameterType="userBean"> UPDATE user SET password=#{password} WHERE id=#{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id=#{id} </delete> </mapper>
UserDao.java(Myibatis自适应,不需要创建Dao的实现类)package com.ss02.user.dao; import com.ss02.user.model.User; public interface UserDao { User getUserById(Integer id); void insertUser(User user); void updateUser(User user); void deleteUser(Integer id); }
UserManager.javapackage com.ss02.user.manager; import java.util.List; import com.ss02.user.model.User; public interface UserManager { public void insertUser(User user); public void insertUserList(List<User> list); public User getUserByid(Integer id); }
UserManagerImp.javaUserAction.javapackage com.ss02.user.manager.imp; import java.util.List; import com.ss02.user.dao.UserDao; import com.ss02.user.manager.UserManager; import com.ss02.user.model.User; public class UserManagerImp implements UserManager{ private UserDao userDao; @Override public void insertUser(User user) { userDao.insertUser(user); } @Override public void insertUserList(List<User> list) { for (int i = 0; i < list.size(); i++) { this.insertUser(list.get(i)); } } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public User getUserByid(Integer id) { return userDao.getUserById(id); } }
package com.ss02.user.action; import com.opensymphony.xwork2.ActionSupport; import com.ss02.user.manager.UserManager; import com.ss02.user.model.User; public class UserAction extends ActionSupport { UserManager userManager; User user; /** * */ private static final long serialVersionUID = 7499436215736504870L; @Override public String execute() throws Exception { System.out.println("execute"); User user = userManager.getUserByid(2); System.out.println(user.toString()); return super.execute(); } public String login() throws Exception { System.out.println("login"); User user = userManager.getUserByid(2); System.out.println(user.toString()); return SUCCESS; } public String insertUser(){ userManager.insertUser(user); return SUCCESS; } public UserManager getUserManager() { return userManager; } public void setUserManager(UserManager userManager) { this.userManager = userManager; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
5.配置
5.1配置数据库连接,jdbc.properties
#测试环境#aliyundatahome,aliyundata
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/lzz
jdbc.username=root
jdbc.password=root
#\u521d\u59cb\u5316\u65f6\u521b\u5efa\u7684\u8fde\u63a5\u6570\uff0c\u5e94\u5728minPoolSize\u4e0emaxPoolSize\u4e4b\u95f4\u53d6\u503c\u3002\u9ed8\u8ba4\u4e3a3
c3p0.initialPoolSize=10
#\u8fde\u63a5\u6c60\u4e2d\u4fdd\u7559\u7684\u6700\u5c0f\u8fde\u63a5\u6570\u3002\u9ed8\u8ba4\u4e3a15
c3p0.minPoolSize=1
#\u8fde\u63a5\u6c60\u4e2d\u4fdd\u7559\u7684\u6700\u5927\u8fde\u63a5\u6570\u3002\u9ed8\u8ba4\u4e3a15
c3p0.maxPoolSize=20
#\u5f53\u8fde\u63a5\u6c60\u4e2d\u7684\u8fde\u63a5\u8017\u5c3d\u7684\u65f6\u5019c3p0 \u4e00\u6b21\u540c\u65f6\u83b7\u53d6\u7684\u8fde\u63a5\u6570\u3002Default: 3
c3p0.acquireIncrement=2
#\u6bcf60\u79d2\u68c0\u67e5\u6240\u6709\u8fde\u63a5\u6c60\u4e2d\u7684\u7a7a\u95f2\u8fde\u63a5\u3002Default: 0
c3p0.idleConnectionTestPeriod=1800
#\u6700\u5927\u7a7a\u95f2\u65f6\u95f4,60\u79d2\u5185\u672a\u4f7f\u7528\u5219\u8fde\u63a5\u88ab\u4e22\u5f03\u3002\u82e5\u4e3a0\u5219\u6c38\u4e0d\u4e22\u5f03\u3002Default: 0
c3p0.maxIdleTime=180
#\u5b9a\u4e49\u5728\u4ece\u6570\u636e\u5e93\u83b7\u53d6\u65b0\u8fde\u63a5\u5931\u8d25\u540e\u91cd\u590d\u5c1d\u8bd5\u83b7\u53d6\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e3a30
c3p0.acquireRetryAttempts=30
#\u4e24\u6b21\u8fde\u63a5\u4e2d\u95f4\u9694\u65f6\u95f4\uff0c\u5355\u4f4d\u6beb\u79d2\uff0c\u9ed8\u8ba4\u4e3a1000
c3p0.acquireRetryDelay=1000
c3p0.automaticTestTable=c3p0TestTable
#\u5f53\u8fde\u63a5\u6c60\u7528\u5b8c\u65f6\u5ba2\u6237\u7aef\u8c03\u7528getConnection()\u540e\u7b49\u5f85\u83b7\u53d6\u65b0\u8fde\u63a5\u7684\u65f6\u95f4\uff0c\u8d85\u65f6\u540e\u5c06\u629b\u51fa SQLException,\u5982\u8bbe\u4e3a0\u5219\u65e0\u9650\u671f\u7b49\u5f85\u3002\u5355\u4f4d\u6beb\u79d2\u3002Default: 0
c3p0.checkoutTimeout=1800
c3p0.maxStatements=0
#\u8fde\u63a5\u6c60\u5185\u5355\u4e2a\u8fde\u63a5\u6240\u62e5\u6709\u7684\u6700\u5927\u7f13\u5b58Statement\u6570\u3002\u9ed8\u8ba4\u4e3a0
c3p0.maxStatementsPerConnection=100
5.2配置myibtis,在WEB-INF下创建myibatis文件夹,在myibatis下创建mybatis-config.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>
<!-- 给bean取一个别名 -->
<typeAliases>
<typeAlias type="com.ss02.user.model.User" alias="userBean"/>
</typeAliases>
<mappers>
<mapper resource="com/ss02/user/model/user.xml" />
</mappers>
</configuration>
5.3配置spring和myibatis的关联,dataSource.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 配置数据源 -->
<bean id="jdbcDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/springResource/jdbc.properties</value>
</list>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="jdbcDataSource" />
<property name="configLocation" value="/WEB-INF/myibatis/mybatis-config.xml"></property>
</bean>
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.ss02.user.dao.UserDao"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<!-- Transaction manager for a single JDBC DataSource -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
</beans>
5.4在struts,spring中配置userAction
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- struts的action配置文件 -->
<!-- 将action托管给spring -->
<constant name="struts.objectFactory" value="spring"></constant>
<!-- 编码过滤器 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- <constant name="struts.i18n.encoding" value="UTF-8"></constant> -->
<!-- 所有的action都应该放在对应的package下 -->
<package name="ss" extends="struts-default" namespace="/lzz">
<action name="login" class="loginAction">
<!-- 定义逻辑视图和物理资源之间的映射 -->
<result name="success">/page/Come.jsp</result>
<result name="error">/page/Hello.jsp</result>
</action>
<action name="login_*" class="loginAction" method="{1}">
<!-- 定义逻辑视图和物理资源之间的映射 -->
<result name="success">/page/Come.jsp</result>
<result name="error">/page/Hello.jsp</result>
</action>
<action name="user_*" class="userAction" method="{1}">
<!-- 定义逻辑视图和物理资源之间的映射 -->
<result name="success">/page/Come.jsp</result>
<result name="error">/page/Hello.jsp</result>
</action>
</package>
</struts>
applicationContext-user.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-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
default-autowire="byName" default-lazy-init="true">
<bean id="userAction" class="com.ss02.user.action.UserAction" scope="prototype">
<property name="userManager" ref="userManager" />
</bean>
<!-- 事务控制 -->
<bean id="userManager" parent="baseTransactionProxy">
<property name="target">
<bean class="com.ss02.user.manager.imp.UserManagerImp">
<property name="userDao" ref="userDao"/>
</bean>
</property>
</bean>
</beans>
在web.xml中配置编码格式
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>ssi01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springResource/applicationContext.xml,
/WEB-INF/springResource/dataSource.xml,
/WEB-INF/springResource/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- web filter -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
6.在page文件夹下,增加一个页面:
addUser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>Hello word</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>
<form action="<%=path%>/lzz/user_insertUser" method="post">
用户名:
<input name="user.name" type="text"/>
<br> 密码:
<input name="user.password" type="text"/><br>
<input type="submit" value="submit"/>
</form>
</body>
</html>
在index.jsp中增加对addUser.jsp的引用
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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 'index.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">
<title>Insert title here</title>
</head>
<body>
This is my JSP page.
<br>
<form action="<%=basePath%>lzz/login">
<input type="submit" value="login">
</form>
<form action="<%=path%>/lzz/login_login">
<input type="submit" value="login_login">
</form>
<form action="<%=path%>/lzz/user_login">
<input type="submit" value="test_ssi">
</form>
<a href="<%=path%>/page/addUser.jsp">Add_User</a>
</body>
</html>
配置结束,运行tomca。
遇到的问题:
1.user.xml的namespace需要和userDao的路径一致,否则映射不过去
2.接口UserDao中的方法名,需要和user.xml中方法名称一样,否则提示找不到该方法
3.在配置struts中文编码的,需要同时两个Filter,如下代码,否则找不到action:
web.xml
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml
<constant name="struts.i18n.encoding" value="UTF-8"/>