微逻辑

走过冬天
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

重点来了!

首先贴出对我配置这一步很有帮助的博客地址:

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&amp;characterSetResults=UTF-8&amp;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的整合。也许他们整合的方法有很多种,本文就提供一种最好理解的大不一定是最好的。