当前位置: 代码迷 >> 综合 >> MyBatis数据持久化(十一)Mybatis3、Spring4、Struts2整合开发
  详细解决方案

MyBatis数据持久化(十一)Mybatis3、Spring4、Struts2整合开发

热度:5   发布时间:2023-12-17 16:17:52.0

上一节我们將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;}@Overridepublic String execute() throws Exception {return this.SUCCESS;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void saveUser(User u) {sqlSessionTemplate.insert("User.saveUser", u);}@Overridepublic 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.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://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工程)

  相关解决方案