MyBatis数据持久化(十一)Mybatis3、Spring4、Struts2整合开发
2015-07-02 19:58
731 查看
上一节我们將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工程中。
exam3被改造成web项目后,会自动生成WEB-INF目录,我们需要在WEB-INF目录下新建一个lib目录,將上面所有jar包拷贝的该目录下,并將jar包添加的build path中。
这里我们通过
我们要实现的功能是当用户输入用户名和密码后,点击登录按钮,将请求交给struts2进行处理,如果用户名密码正确跳转到成功页面,不正确则停在该页面并给出错误提示。
index.jsp内容如下:
可以看到表单提交地址为userLogin.do,我们需要在struts2配置文件中配置该请求处理的action。
在这里我们通过constant标签指定访问后缀名为*.do,处理userLogin.do请求的action名称为loginAction,我们需要在spring对该action进行配置。
接着创建一个action类com.mybatis.action.LoginAction,该类需要基础struts2框架中的ActionSupport类。
在action中定义两个属性username和password和index.jsp页面中input表单的name对应,并为它们添加set和get方法,请求到达时,表单中输入的数据会自动封装到该类的属性中。
我们重写了父类的execute和validate方法,validate方法会在excute方法之前执行,用于完成数据的校验。
这里我们向action中注入了UserService来处理业务逻辑,根据UserService类的checkUser方法返回结果进行相应处理,返回false则增加错误提示信息,跳转的错误页面index.jsp,否则跳转到成功页面。
service层同样采用面向接口的编程,我们新建一个UserService接口:
接着编写实现类com.mybatis.service.impl.UserServiceImpl
这里我们需要根据用户名从数据库中查出密码信息,由于Service层不直接和数据库打交道,我们需要通过注入Dao层类UserDao实现数据库的交互。
对于Service的创建我们同样交给spring进行管理,在spring中对UserService进行配置:
首先创建UserDao接口com.mybatis.dao.UserDao
接下来创建UserDao实现类com.mybatis.dao.impl.UserDaoImpl
前面教程中提到过,我们对数据库的操作可以通过SqlSessionTemplate来完成,因此我们需要向UserDaoImpl中注入SqlSessionTemplate。
我们需要在User.xml文件中增加两条Sql配置:
Dao的创建依然托管给spring框架,在beans.xml中对UserDao进行配置:
完整的spring配置文件beans.xml内容如下:
可以看到spring在web开发中的作用就是负责servcie层、dao层、action、数据库连接池的创建以及属性的注入。
输入错误的用户名或密码时界面显示错误信息,用户名密码输入正确时跳转到成功页面。
博文源码:https://github.com/rongbo-j/mybatis-blog
(请参考exam3工程)
我们首先需要获取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="登录"> <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工程)
相关文章推荐
- MyBatis数据持久化(十一)Mybatis3、Spring4、Struts2整合开发
- MyBatis数据持久化(十一)Mybatis3、Spring4、Struts2整合开发
- Java类的克隆
- java junit测试
- 尚学堂Spring视频教程(七):AOP XML
- java学习06--比较运算符和逻辑运算符
- java内存管理简析
- MyEclipse安装插件xfire的各种办法推荐
- Java编程思想_笔记(五)
- eclipse离线安装adt
- eclipse安装Hibernate反向生成实体类工具
- Java反射-简单应用
- 工作积累(九)——前后台传递类Map型参数
- Eclipse常用设置
- JAVA模拟自动售货机
- spring的IOC(控制反转)与AOP(面向切面编程)
- java连接数据库报错Unknown system variable 'tx_read_only'
- eclipse 编辑窗口不见了(打开左边的java、xml文件,中间不会显示代码)
- JAVA 文件操作
- Spring MVC @ResponseBody 中文乱码 解决方案