zoukankan      html  css  js  c++  java
  • MyBatis数据持久化(十一)Mybatis3、Spring4、Struts2整合开发

    上一节我们將Mybatis和Spring4进行整合,本节向大家介绍Mybatis在Web开发中的应用,并与主流的MVC框架Struts2进行整合。
    我们首先需要获取Struts2框架,Struts2官方下载地址:
    http://struts.apache.org/download.cgi#struts2324

    读者可以根据自己的需要选择版本,笔者使用的版本为struts-2.3.12。
    这里写图片描述
    下载解压后,可以看到,struts2的目录结构很简单,apps目录下为struts2案例程序,lib目录下为我们需要的jar包,src目录下为struts2源码,docs目录下则为api文档。准备工作做好后,我们就可以开始了!

    首先我们將上节的exam2工程复制一份,命名为exam3,由于exam2为java工程,我们需要手动將exam3改造成java web工程,具体做法可以参考笔者的另一篇文章:
    Eclipse中將Java项目转变为Java Web项目

    接下来我们开始將struts2整合到exam3工程中。

    1.引入项目所需jar包

    笔者新建一个名为libs的java工程,用于存放项目所需要的所有jar包。
    这里写图片描述
    exam3被改造成web项目后,会自动生成WEB-INF目录,我们需要在WEB-INF目录下新建一个lib目录,將上面所有jar包拷贝的该目录下,并將jar包添加的build path中。

    2.创建web.xml文件

    在WEB-INF目录下新建web.xml文件,配置struts2框架的过滤器和Spring框架的监听器:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>exam4</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-list>
        <!-- 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>
    
        <!-- Spring4监听器 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:beans.xml</param-value>
        </context-param>
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener> 
    
    </web-app>

    这里我们通过<context-param>标签指定spring的配置文件为classpath下的beans.xml,web容器启动时会自动读取该文件并实例化bean。

    3.登录案例

    3.1.创建登录页面index.jsp。

    这里写图片描述
    我们要实现的功能是当用户输入用户名和密码后,点击登录按钮,将请求交给struts2进行处理,如果用户名密码正确跳转到成功页面,不正确则停在该页面并给出错误提示。
    index.jsp内容如下:

    <%@ page language="java" contentType="text/html; 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; utf-8">
    <title>登录页面</title>
    <style>
    #login
    {
    width:480px;
    height:300px;
    border:1px solid #ccc;
    margin: 10px auto auto auto; 
    }
    #login h1{ 
    font-size:18px;
    text-align: center;
    margin-top:0px;
    }
    #login ul{
    list-style-type: none;
    }
    #login ul li{
    margin-top: 10px;
    }
    </style>
    </head>
    <body>
        <div id="login">
            <h1>登录</h1>
            <form action="userLogin.do" method="post">
            <ul>
                <li>用户名:<input type="text" name="username"></li>
                <li>密 码:<input type="text" name="password"></li>
                <li id="btn"><input type="submit" value="登录">&nbsp;<input type="reset" value="重置"></li>
            </ul>
            <span><s:fielderror cssStyle="color:red"><s:param>ErrorInfo </s:param></s:fielderror></span>
            </form>
        </div>
    </body>
    </html>

    可以看到表单提交地址为userLogin.do,我们需要在struts2配置文件中配置该请求处理的action。

    3.2.创建struts2配置文件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>
        <!-- 指定 action访问后缀名为*.do-->
        <constant name="struts.action.extension" value="do"/> 
        <package name="default" namespace="/"  extends="struts-default">
            <action name="userLogin" class="loginAction">
                <result name="success">/WEB-INF/jsp/result.jsp</result>
                <result name="input">/index.jsp</result>
            </action>
        </package>
    </struts>

    在这里我们通过constant标签指定访问后缀名为*.do,处理userLogin.do请求的action名称为loginAction,我们需要在spring对该action进行配置。

    3.3在spinrg配置文件beans.xml中配置action。

    <bean id="loginAction" class="com.mybatis.action.LoginAction" scope="prototype">
            <property name="userService" ref="userService"/>
    </bean>

    接着创建一个action类com.mybatis.action.LoginAction,该类需要基础struts2框架中的ActionSupport类。

    package com.mybatis.action;
    
    import com.mybatis.service.UserService;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class LoginAction extends ActionSupport{
    
        private static final long serialVersionUID = 1L;
        private String username;
        private String password;
        private UserService userService;
    
        public UserService getUserService() {
            return userService;
        }
    
        public void setUserService(UserService userService) {
            this.userService = userService;
        }
    
        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;
        }
        @Override
        public String execute() throws Exception {
            return this.SUCCESS;
        }
        @Override
        public void validate() {
            if(!userService.checkUser(username, password))
            {
                this.addFieldError("ErrorInfo", "用户名或密码不正确");
            }
        }
    }
    

    在action中定义两个属性username和password和index.jsp页面中input表单的name对应,并为它们添加set和get方法,请求到达时,表单中输入的数据会自动封装到该类的属性中。
    我们重写了父类的execute和validate方法,validate方法会在excute方法之前执行,用于完成数据的校验。
    这里我们向action中注入了UserService来处理业务逻辑,根据UserService类的checkUser方法返回结果进行相应处理,返回false则增加错误提示信息,跳转的错误页面index.jsp,否则跳转到成功页面。

    3.4.创建service层

    service层主要用来封装action中的业务逻辑,以避免action中代码膨胀,action会根据service处理结果跳到不同的页面。
    service层同样采用面向接口的编程,我们新建一个UserService接口:

    package com.mybatis.service;
    
    public interface UserService {
        boolean checkUser(String username,String password);
    }
    

    接着编写实现类com.mybatis.service.impl.UserServiceImpl

    package com.mybatis.service.impl;
    
    import com.mybatis.dao.UserDao;
    import com.mybatis.domain.User;
    import com.mybatis.service.UserService;
    
    public class UserServiceImpl implements UserService{
        private UserDao userDao;
    
        public UserDao getUserDao() {
            return userDao;
        }
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public boolean checkUser(String username,String password) {
            User user = userDao.queryUserByName(username);
    
            if(user != null && user.getPassword().equals(password))
            {
                return true;
            }
            return false;
        }
    
    }

    这里我们需要根据用户名从数据库中查出密码信息,由于Service层不直接和数据库打交道,我们需要通过注入Dao层类UserDao实现数据库的交互。
    对于Service的创建我们同样交给spring进行管理,在spring中对UserService进行配置:

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

    3.5.创建Dao层

    我们的mybatis就工作于Dao层,Dao层的主要作用就是和数据库进行交互,完成数据的读取与持久化。
    首先创建UserDao接口com.mybatis.dao.UserDao

    package com.mybatis.dao;
    
    import com.mybatis.domain.User;
    
    public interface UserDao {
        void saveUser(User u);
        User queryUserByName(String username);
    }
    

    接下来创建UserDao实现类com.mybatis.dao.impl.UserDaoImpl

    package com.mybatis.dao.impl;
    
    import org.mybatis.spring.SqlSessionTemplate;
    import com.mybatis.dao.UserDao;
    import com.mybatis.domain.User;
    
    public class UserDaoImpl implements UserDao{
        private SqlSessionTemplate sqlSessionTemplate;
    
        public SqlSessionTemplate getSqlSessionTemplate() {
            return sqlSessionTemplate;
        }
        public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
            this.sqlSessionTemplate = sqlSessionTemplate;
        }
        @Override
        public void saveUser(User u) {
            sqlSessionTemplate.insert("User.saveUser", u);
        }
        @Override
        public User queryUserByName(String username) {
            User user = (User)sqlSessionTemplate.selectOne("User.queryUserByName",username);
            return user;
        }   
    }
    

    前面教程中提到过,我们对数据库的操作可以通过SqlSessionTemplate来完成,因此我们需要向UserDaoImpl中注入SqlSessionTemplate。
    我们需要在User.xml文件中增加两条Sql配置:

    <?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="User">
        <insert id="saveUser" parameterType="user">
            insert into user(username,password,phone) values(#{username},#{password},#{phone});
        </insert>
        <select id="queryUserByName" parameterType="string" resultType="user">
            select * from User where username = #{username}
        </select>
    </mapper>

    Dao的创建依然托管给spring框架,在beans.xml中对UserDao进行配置:

    <bean id="userDao" class="com.mybatis.dao.impl.UserDaoImpl">
            <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    </bean>

    完整的spring配置文件beans.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:context="http://www.springframework.org/schema/context"
        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/context
               http://www.springframework.org/schema/context/spring-context.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">
        <context:property-placeholder  location="classpath:mysql.properties"/>
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"       
            destroy-method="close">      
            <property name="driverClassName" value="${driver}" />      
            <property name="url" value="${url}" />      
            <property name="username" value="${username}" />      
            <property name="password" value="${password}" />      
        </bean>  
    
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
          <property name="dataSource" ref="dataSource" /> 
          <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
        </bean>
    
        <bean id="sqlSessionTemplate"     class="org.mybatis.spring.SqlSessionTemplate"> 
          <constructor-arg index="0" ref="sqlSessionFactory" /> 
        </bean>
    
        <bean id="userDao" class="com.mybatis.dao.impl.UserDaoImpl">
            <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
        </bean>
    
        <bean id="userService" class="com.mybatis.service.impl.UserServiceImpl">
            <property name="userDao" ref="userDao"/>
        </bean>
    
        <bean id="loginAction" class="com.mybatis.action.LoginAction" scope="prototype">
            <property name="userService" ref="userService"/>
        </bean>
    </beans>

    可以看到spring在web开发中的作用就是负责servcie层、dao层、action、数据库连接池的创建以及属性的注入。

    功能演示

    这里写图片描述
    输入错误的用户名或密码时界面显示错误信息,用户名密码输入正确时跳转到成功页面。

    博文源码:https://github.com/rongbo-j/mybatis-blog
    (请参考exam3工程)

  • 相关阅读:
    python 发送邮件
    java 获取两个时间之前所有的日期
    java 子线程定时去更改主线程的变量
    post 两种方式 application/x-www-form-urlencoded和multipart/form-data
    aws 社交媒体技术大会 部分总结
    java操作Mongodb数据库
    实体类注解 @entity
    spring security 部分注解讲解
    @Column
    阿里云搭建服务器
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468674.html
Copyright © 2011-2022 走看看