为初学者提供一个基本Struts+Spring+Mybatis框架的搭建(主要实现登录注册):配置struts+spring+mybatis篇
Posted on 2015-04-23 12:16 微逻辑 阅读(612) 评论(2) 收藏 举报重点来了!
首先贴出对我配置这一步很有帮助的博客地址:
http://p.primeton.com/articles/54c1dcc5be20aa3884000012
这篇文章让我理清了大体的思路,是看过的所有博客中最具有特色的博客,但是它也没有实现网页的功能。
http://blog.csdn.net/afgasdg/article/details/7392367
这篇博客让我知道了配置Struts+Spring+Mybatis框架的基本流程,帮助特大,最重要的是它是我看到的唯一一篇实现的网页功能的一个搭建。但是他在配置的过程中用了注解,作为初学者的我,我还是没有真正的明白。
我一直配置不好spring的配置文件applicationContext.xml,这也是最关键的一步!
注意:本文用的MySql数据库
第一步:需要导入的包:
asm-3.3.1.jar
cglib-2.2.2.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.1.jar
commons-logging-1.1.1.jar
commons-logging-1.1.3.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.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.6.jar
mybatis-spring-1.1.1.jar
mysql-connector-java-5.0.8-bin.jar
ognl-3.0.6.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
spring-aop-4.0.6.RELEASE.jar
spring-aspects-4.0.6.RELEASE.jar
spring-beans-4.0.6.RELEASE.jar
spring-context-4.0.6.RELEASE.jar
spring-context-support-4.0.6.RELEASE.jar
spring-core-4.0.6.RELEASE.jar
spring-expression-4.0.6.RELEASE.jar
spring-jdbc-4.0.6.RELEASE.jar
spring-orm-4.0.6.RELEASE.jar
spring-tx-4.0.6.RELEASE.jar
spring-web-4.0.6.RELEASE.jar
spring-webmvc-4.0.6.RELEASE.jar
struts2-core-2.3.16.3.jar
struts2-spring-plugin-2.3.16.3.jar
velocity-tools-1.3.jar
xwork-core-2.3.16.3.jar
这些包都能从官网或者百度得到,红色的包根据连接数据库类型的不同而不同。要找好对应的包。
第二步:四大配置文件的配置
applicationContext.xml
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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
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/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
">
<!--配置DataSource 数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>
jdbc:mysql://localhost:3306/ABC?characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull
</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>
注意:ABC是你自己建立的数据库的名字。端口号:3306一般是你安装数据库的时候默认的端口号 property的name值都是固定的,但是value值根据你设置的不同而不同。username是你登录数据库的账户名,password是用该账户登录数据库的密码。
<!-- Mybatis中对数据库的所有操作都是基于一个sqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来产生的。
但是Mybatis-spring给我们封装了一个SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionBuilder来建立对应的SqlSessionFactory进而获得对应的SqlSession.
-->
<!-- 通过对SqlSessionFactoryBean指定一些属性来制定一些属性来提供Mybatis的一些配置信息-->
<!-- 创建sqlSessionFactory ,即定义一个SqlSessionFactoryBean-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定MyBatis配置文件路径 :找到实体类与数据库之间的映射文件-->
<property name="configLocation" value="classpath:MyBatisConf.xml"/>
<!-- 指定使用的数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- Mybatis-spring为我们提供了一个实现了SqlSession接口的SessionTemplate类,它是线程安全的可以被多个Dao同时使用。同时它还跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的 -->
<!-- 当使用了Spring的事务管理机制后,SqlSession还可以跟着Spring的事务一起提交和回滚 -->
<!-- 配置SqlSessionTemplate ,这样我们就可以通过Spring的依赖注入在Dao中直接使用SqlSessionTemplate来编成了-->
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!-- 注入实现类的Bean,并为其注入"sessionTemplate"的属性值 -->
<bean id="userDao" class="dao.UserDaoImpl">
<property name="sqlSessionTemplate" ref="sessionTemplate"></property>
</bean>
<bean id="userService" class="service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="loginAction" class="Action.LoginAction">
<property name="userService" ref="userService"></property>
</bean>
<bean id="registerAction" class="Action.RegisterAction">
<property name="userService" ref="userService"></property>
</bean>
</beans>
总结:其中枚红色的两个userDao要一致,大红色的userDao对应缩写的接口类userDao.java,同理userService也一样
MyBatisConf.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">
<!-- 此配置文件用于配置映射类的别名,并配置SqlMapper文件的"路径" -->
<!-- 如果不与spring进行整合的话,此配置文件 还需要配置数据源信息,与spring整合之后数据源就配置在spring配置文件中,-->
<configuration>
<!-- 配置映射类的别名 -->
<typeAliases >
<typeAlias type="model.User" alias="User"></typeAlias>
</typeAliases>
<!-- 配置Mapper文件的路径 -->
<mappers>
<mapper resource="dao/SqlMapper.xml" />
</mappers>
</configuration>
struts.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>
<!-- 指定默认编码集,用于HttpServletRequest的setCharacterEncoding()和freemarker,vilocity的输出 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 当struts配置文件修改时是否自动加载 -->
<constant name="struts.configuration.xmlreload" value="true"></constant>
<!-- 开发模式下打印详细的错误信息 -->
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.ui.theme" value="xhtml"></constant>
<!-- 将action的创建交给spring来管理 -->
<constant name="struts.objectFactory" value="spring" ></constant>
<package name="user1" extends="struts-default">
<action name="Login" class="loginAction" method="login">
<result name="success">index.jsp</result>
<result name="input">login1.jsp</result>
</action>
<action name="Register" class="registerAction" method="add">
<result name="success">index1.jsp</result>
<result name="input">register.jsp</result>
</action>
</package>
</struts>
总结:method的值等于RegisterAction.java中的add方法,这个是必须写的,同理login对应LoginAction.java中的login方法。
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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>struts_spring_mybatis</display-name>
<!-- 配置Spring资源 : 设置上下文的参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置spring:初始化Spring容器的Listener -->
<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>/*</url-pattern>
</filter-mapping>
<!-- 默认跳转页面-->
<welcome-file-list>
<welcome-file>login1.jsp</welcome-file>
</welcome-file-list>
</web-app>
第三步:登录,注册逻辑类的实现
LoginActon.java
package Action;
import model.User;
import com.opensymphony.xwork2.ActionSupport;
import service.UserService;
public class LoginAction extends ActionSupport {
private UserService userService;
private User user;
// private List<User> userList;
public String execute() throws Exception {
return null;
}
public String login() {
if (user != null) {
System.out.println("haha");
System.out.println(user.getUserName() + "\n" + user.getPassWord());
User user2 = userService.login(user);
// System.out.println(user2.getuserName() +"\n"+
// user2.getpassWord());
if (user2 != null) {
System.out.println("haha");
return SUCCESS;
}
}
this.addFieldError("user.userName", "用户或密码错误!");
return INPUT;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
RegisterAction.java
package Action;
import model.User;
import service.UserService;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
private UserService userService;
private User user;
public String execute() throws Exception {
return null;
}
public String add(){
if(user!=null)
{
userService.addUser(user);
return SUCCESS;
}
this.addFieldError("user.userName", "用户不合法!");
return INPUT;
}
public User getUser(){
return user;
}
public void setUser(User user){
this.user=user;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
总结:红色的方法不可少。
第四步:数据库的映射文件
model包
User.java
//类User是数据库中user1表的映射类,即把表这个实体抽象为一个类
/*
CREATE TABLE user1(id int(4)not null primary key auto_increment,
username CHAR(20) not null,
password varchar(10)
insert into user1 values('1','admin','admin');*/
/*用SHOW DATABASES;找出在服务器上当前存在的数据库
* 创建一个数据库:CREATE DATABASE ABC;
* 选择创建的数据库:USE ABC
* 创建一个数据库表,先看该数据库中存在什么表:SHOW TABLES;
* 然后创建一个数据库表user1*/
package model;
public class User {
private int Id;
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public User() {
}
public int getId() {
return Id;
}
public void setId(int Id) {
this.Id = Id;
}
public String toString() {
return "User [Id=" + Id + ",userName=" + userName + ",passWord="
+ passWord + "]";
}
}
dao包
SqlMapper.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="dao.SqlMapper"><!-- mapper的namespace的名字是mapper对象的完整路径名,因为mybatis的作用是使得接口绑定成为可能 -->
<!-- 此配置文件就是实现抽象类于实体数据库的映射 -->
<!-- 用于配置数据库中表中的字段与映射类属性间的映射关系,其中type表示映射类的完整类名(model.User),但此处用的是User,这是因为在mybatis的配置文件中把类名改成了User -->
<!-- property映射实体类User中的属性,column是数据库表中的字段名 -->
<resultMap type="User" id="userResult">
<id property="Id" column="id"/>
<result property="userName" column="username"/>
<result property="passWord" column="password"/>
</resultMap>
<!-- 实现sql语句与接口中方法的映射关系 id 的值对应服务(dao)接口中的方法名 -->
<!-- parameterType是输入参数的数据类型 -->
<!-- resultMap适用于返回值是自定义实体类的情况 -->
<!-- resulttype 适用于返回值得数据类型是非自定义的,即jdk提供的类型 -->
<select id="userLogin" parameterType="User" resultMap="userResult">
select * from user1
where
username=#{userName} and password=#{passWord}<!--username数据库中对应表的字段属性,userName对应实体类中的映射变量 -->
</select>
<select id="selectAllUser" resultMap="userResult">
select * from user1
where
username=#{userName}
</select>
<select id="findUserByid" parameterType="int" resultMap="userResult">
select * from user1
where
id=#{Id}
</select>
<insert id="insertUser" parameterType="User" flushCache="true">
insert into
user1(id,username,password) values(#{Id},#{userName},#{passWord})
</insert>
<update id="updateUser" parameterType="User">
update user1 set
password=#{passWord} where id=#{Id}
</update>
<delete id="deleteUser" parameterType="int">
delete from user1
where id=#{Id}
</delete>
</mapper>
总结:id的属性值对应dao包中接口的属性名。
第五步:对数据库的操作
UserDao.java
package dao;
import java.util.List;
import model.User;
public interface UserDao {
public abstract void insertUser(User user);
public abstract void updateUser(User user);
public abstract void deleteUser(int userId);
public abstract User userLogin(User user);
public abstract User findUserByid(Integer userId);
public abstract List<User> findAll();
}
UserDaoImpl.java
package dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import model.User;
public class UserDaoImpl implements UserDao{
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public SqlSessionTemplate getSqlSessionTemplate() {
return sqlSessionTemplate;
}
@Override
public void insertUser(User user) {
// TODO Auto-generated method stub
//insert(,)的第一个参数的值是sqlMapper文件中对应的sql语句中对应的id名
sqlSessionTemplate.insert("insertUser", user);
}
@Override
public void updateUser(User user) {
// TODO Auto-generated method stub
sqlSessionTemplate.update("updateUser", user);
}
@Override
public void deleteUser(int userId) {
// TODO Auto-generated method stub
sqlSessionTemplate.delete("deleteUser", userId);
}
@Override
public User userLogin(User user) {
// TODO Auto-generated method stub
return sqlSessionTemplate.selectOne("userLogin", user);
}
@Override
public User findUserByid(Integer userId) {
// TODO Auto-generated method stub
return sqlSessionTemplate.selectOne("findUserid", userId);
}
@Override
public List<User> findAll() {
// TODO Auto-generated method stub
return sqlSessionTemplate.selectList("selectAllUser");
}
}
总结:对private变量都要有get和set方法。
Service包
UserService.java
package service;
import java.util.List;
import model.User;
public interface UserService {
public abstract void addUser(User user);
public abstract void updateUser(User user);
public abstract void deleteUser(Integer userId);
public abstract User findUserById(Integer userId);
public abstract List<User> findAllUser();
public abstract User login(User user);
}
UserServiceImpl.java
package service;
import java.util.List;
import dao.UserDao;
import model.User;
public class UserServiceImpl implements UserService {
private UserDao userDao;//用注解的话是不是就不用导入包了阿?
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
userDao.insertUser(user);
}
@Override
public void updateUser(User user) {
// TODO Auto-generated method stub
userDao.updateUser(user);
}
@Override
public void deleteUser(Integer userId) {
// TODO Auto-generated method stub
userDao.deleteUser(userId);
}
@Override
public User findUserById(Integer userId) {
// TODO Auto-generated method stub
return userDao.findUserByid(userId);
}
@Override
public List<User> findAllUser() {
// TODO Auto-generated method stub
return userDao.findAll();
}
@Override
public User login(User user) {
// TODO Auto-generated method stub
return userDao.userLogin(user);
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public UserDao getUserDao() {
return userDao;
}
}
第六步 JSP文件
Login1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Struts Test</title>
</head>
<body>
<center>
<h1>用户登录</h1>
<s:form action="Login" method="post">
<s:textfield name="user.userName" label="用户名"></s:textfield>
<s:textfield name="user.passWord" label="密码"></s:textfield>
<s:submit value="登录" />
</s:form>
</center>
</body>
</html>
总结:红色部分对应LoginAction.java中属性的名字,要不然LoginAction.java识别不了。
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<center>
<h1>用户注册</h1>
<s:form action="Register" method="post">
<s:textfield name="user.userName" label="用户名"></s:textfield>
<s:textfield name="user.passWord" label="密码"></s:textfield>
<s:submit value="注册" />
</s:form>
</center>
</body>
</html>
总结:写本博客的目的主要是让大家看四大配置文件是怎么配的,主要看applicationContext.xml 这个文件实现了Spring和Mybatis的整合。也许他们整合的方法有很多种,本文就提供一种最好理解的大不一定是最好的。
浙公网安备 33010602011771号