上一节我们將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工程)

MyBatis数据持久化(十一)Mybatis3、Spring4、Struts2整合开发的更多相关文章

  1. 学习Hadoop+Spark大数据巨量分析与机器学习整合开发-windows利用虚拟机实现模拟多节点集群构建

    记录学习<Hadoop+Spark大数据巨量分析与机器学习整合开发>这本书. 第五章 Hadoop Multi Node Cluster windows利用虚拟机实现模拟多节点集群构建 5 ...

  2. MyBatis数据持久化(十)与Spring4整合

    前面几节介绍了mybatis的基本使用方法,本节主要介绍如何使用mybatis与主流的IoC容器Spring进行整合. 我们首先需要获取Spring框架的jar文件,在写本文时spring的最新Rel ...

  3. Mybatis3+Spring4+SpringMVC4 整合

    首先在整合这个框架的时候,想想其一般的步骤是怎样的,先有个步骤之后,不至于在后面的搞混了,这样在整合的时候也比较清晰些. 然后我们就细细的一步一步来整合. 1  创建一个Web项目. 2  导入Myb ...

  4. MyBatis数据持久化(七)多表连接查询

    本节继续以多表连接查询的案例介绍使用resultMap的好处,对于两张以上的表进行关联查询,当我们有选择的从不同表查询所需字段时,使用resultMap是相当方便的.例如我们有两张表,分别为用户表Us ...

  5. MyBatis数据持久化(六)resultMap使用

    resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...

  6. MyBatis数据持久化(三)增删改查

    上篇文章中我们使用mybatis成功建立数据库会话,并从表中查询出相应的数据,本文在此基础上介绍MyBatis另外几种操作,即插入.修改.删除记录. 1.修改User.xml文件,增加几条sql语句: ...

  7. MyBatis数据持久化(二)建立数据库会话

    上篇文章中介绍了我们使用mybatis前的准备工作,并在程序中通过jdbc与mysql数据库成功建立连接,接下来介绍如何使用mybatis与数据库建立会话.我们需要以下几个步骤: 1.在build p ...

  8. MyBatis数据持久化(九)动态sql

    本文摘自:mybatis参考文档中文版 MyBatis的一个强大的特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能 ...

  9. MyBatis数据持久化(八)sql复用

    在mybatis中,我们可以將sql语句中公共的部分提取出来,然后需要该段sql的地方通过include标签引入即可,这样可以达到sql语句复用的目的. 例如我们有两条相似的查询语句: <sel ...

随机推荐

  1. 8 Python+Selenium操作测试对象

    [环境信息] Python3.6+selenium3.0.2+Firefox50.0+win7 [操作方法] 1.清除输入框内容:clear() 2.单击一个按钮:click() 3.返回元素尺寸:s ...

  2. 配置notepad++编程环境

    1. 到 https://sourceforge.net/projects/mingw-w64/files/ 下载MinGW64,解压并移动到C盘根目录 2. 将 C:\MinGW64\bin 加入系 ...

  3. js 或运算

    表达式a && 表达式b : 计算表达式a(也可以是函数)的运算结果, 如果为 True, 执行表达式b(或函数),并返回b的结果: 如果为 False,返回a的结果: 表达式a || ...

  4. word2016如何英汉互译

    1.如果是一篇英文文档且是pdf格式,可以用word2016打开直接转化成了word,就算不是会员也可以的,在此附上16版的光盘安装包,可以百度自行下载 (链接:https://pan.baidu.c ...

  5. day26 hashlib, logging

    目录 hashlib hmac uuid logging v1 v2 v3 看了这个,上面的当作没看过 hashlib 为了防止密码在传输过程被抓取 对字符进行加密,相当于是一个自定义的字符编码表 原 ...

  6. 洛谷P1441 砝码称重 枚举 + 01背包

    显然,n<=20, m<=4 的数据范围一眼爆搜. 直接搜索一下不用哪4个砝码,再做一遍01背包即可. 可能是本人太菜鸡,01背包部分调了半天QAQ-- #include<cstdi ...

  7. node——express框架

    express基于Node.js是一个web开发框架,web框架是为了我们开发更方便,更简洁,更高效. 英文网址 中文网址 安装: npm install express --save express ...

  8. 搭建`wenblogic`执行`install`脚本失败

    搭建weblogic服务,前期准备都已经完成,安装包都是已上传,执行install_wls1213.sh脚本,出现以下报错: install_wls1213.sh: line 1: rectory: ...

  9. 算法46----移除K位数字

    一.题目:移除K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...

  10. HTTPie:一个不错的 HTTP 命令行客户端

    转自:http://top.jobbole.com/9682/ HTTPie:一个不错的 HTTP 命令行客户端 HTTPie (读aych-tee-tee-pie)是一个 HTTP 的命令行客户端. ...