mybatis3.3+struts2.3.24+mysql5.1.22開發(fā)環(huán)境搭建圖文教程
一、新建Web工程,并在lib目錄下添加jar包
主要jar包:struts2相關(guān)包,mybatis3.3相關(guān)包,mysql-connector-java-5.1.22-bin.jar, gson-2.1.jar

二、配置web.xml,添加一個(gè)過濾器StrutsPrepareAndExecuteFilter,處理所有*.action請求;
<?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" 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>MS</display-name> <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>*.action</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
查看該過濾器doFilter源碼,主要做以下幾件事:
1、判斷是否設(shè)置了struts排除的url(struts.action.excludePattern,通過正則表達(dá)式匹配),如果有且當(dāng)前路徑符合規(guī)則,則將請求轉(zhuǎn)發(fā)給過濾器鏈上下一個(gè)對象,不交給struts2處理
if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
}
2、查找ActionMapping:通過PrepareOperations的findActionMapping方法查找,如果沒找到,則將請求轉(zhuǎn)發(fā)給過濾器鏈上下一個(gè)對象,不交給struts2處理;如果找到ActionMapping,則調(diào)用ExecuteOperations的executeAction方法,開始執(zhí)行Action;下圖是根據(jù)url找到ActionMapping的情況;

三、配置struts.xml文件,該Demo主要演示向前端傳json格式數(shù)據(jù),result type設(shè)成json格式,當(dāng)然也可以設(shè)成其它的;
<?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> <constant name="struts.devMode" value="false" /> <package name="default" extends="struts-default,json-default"> <global-results> <result type="json"> <param name="root">json</param> <param name="contentType">text/html</param> </result> </global-results> <action name="addUser" class="ms.action.UserAction" method="addUser"> <result>.</result> </action> <action name="queryAllUser" class="ms.action.UserAction" method="queryAllUser"> <result>.</result> </action> </package> <!-- Add packages here --> </struts>
四、配置Mybatis.xml和userMapper.xml,
配置cacheEnabled為true, 開啟二級緩存;
配置datasource相關(guān)信息: type為POOLED-連接池形式,poolMaximumActiveConnections – 在任意時(shí)間存在的活動(dòng)(也就是正在使用)連接的數(shù)量,默認(rèn)值:10。
配置實(shí)體類映射mappers //<mapper resource="ms/model/userMapper.xml"/>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!--開啟二級緩存--> <setting name="cacheEnabled" value="true"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/demo" /> <property name="username" value="root" /> <property name="password" value="admin" /> <property name="poolMaximumActiveConnections" value="10" /> <property name="poolPingEnabled" value="true"/> <property name="poolPingQuery" value="select 1 as poolPingQuery"/> </dataSource> </environment> </environments> <mappers> <mapper resource="ms/model/userMapper.xml"/> </mappers> </configuration>
配置userMapper.xml,配置緩存為EHcache及相關(guān)參數(shù),記得實(shí)體類要實(shí)現(xiàn)Serializable接口
<?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="UserMapper">
<!-- 默認(rèn)的cache <cache />-->
<!-- 使用ehcache緩存 -->
<cache type="org.mybatis.caches.ehcache.LoggingEhcache" >
<property name="timeToIdleSeconds" value="3600"/><!--1 hour 緩存自創(chuàng)建日期起至失效時(shí)的間隔時(shí)間-->
<property name="timeToLiveSeconds" value="3600"/><!--1 hour 緩存創(chuàng)建以后,最后一次訪問緩存的日期至失效之時(shí)的時(shí)間間隔-->
<property name="maxEntriesLocalHeap" value="1000"/>
<property name="maxEntriesLocalDisk" value="10000000"/>
<property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>
<!-- 新增-->
<insert id="saveUser" parameterType="ms.model.User">
insert into USER(
account,
name,
address
) values (
#{account},
#{name},
#{address}
)
</insert>
<select id="queryAllUser" resultType="ms.model.User">
select u.id,
u.account,
u.name,
u.address
from USER u
</select>
</mapper>
五、關(guān)鍵代碼
DAO層:
首先建一個(gè)類,用于獲取SqlSessionFactory,設(shè)計(jì)成單例模式;
package ms.dao.base;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
public class MySessionFactory {
private static SqlSessionFactory sessionFactory;
private MySessionFactory(){
}
public static synchronized SqlSessionFactory getSqlSessionFactory(){
if(sessionFactory == null){
try {
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
return sessionFactory;
} catch (IOException e) {
Logger.getLogger(MySessionFactory.class).error("getSqlSessionFactory error.");
e.printStackTrace();
return null;
}
}else{
return sessionFactory;
}
}
}
接下來是UserDao,通過openSession獲取SqlSession,注意這里是可以通過SqlSession的commit和rollback進(jìn)行事務(wù)控制的,當(dāng)然如果本來就一條sql操作,也就沒什么事務(wù)控制可言了(本例子只是demo);
package ms.dao;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import ms.dao.base.MySessionFactory;
import ms.model.User;
public class UserDao {
public void add(User user) throws Exception{
SqlSession session = MySessionFactory.getSqlSessionFactory().openSession();
try {
String statement = "UserMapper.saveUser";
session.insert(statement, user);
session.commit(true);
} catch (Exception e) {
session.rollback(true);
e.printStackTrace();
throw new Exception("error in add method");
} finally {
session.close();
}
}
public List<User> queryAllUser() throws Exception{
SqlSession session = MySessionFactory.getSqlSessionFactory().openSession();
List<User> users = new ArrayList<User>();
try{
String statement = "UserMapper.queryAllUser";
users = session.selectList(statement,1);
session.commit(true);
} catch (Exception e) {
session.rollback(true);
e.printStackTrace();
throw new Exception("error in queryAllUser method");
} finally {
session.close();
}
return users;
}
}
Service層:略
Model:略
Action層:
轉(zhuǎn)成json格式數(shù)據(jù)返回給前端;
package ms.action;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ms.model.User;
import ms.service.UserService;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import com.google.gson.Gson;
public class UserAction {
Logger logger = Logger.getLogger(UserAction.class);
private UserService userService = new UserService();
public void addUser(){
PrintWriter out = null;
try{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=UTF-8");
String account = request.getParameter("account");
String name = request.getParameter("name");
String address = request.getParameter("address");
User user = new User();
user.setAccount(account);
user.setAddress(address);
user.setName(name);
userService.add(user);
out = response.getWriter();
out.write(new Gson().toJson("success"));
}catch(Exception e){
e.printStackTrace();
logger.error(e.getMessage());
if(out != null)
out.write(new Gson().toJson("fail"));
}finally{
out.flush();
out.close();
}
}
public void queryAllUser(){
PrintWriter out = null;
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=UTF-8");
Gson gson = new Gson();
List<User> userList= userService.queryAllUser();
String gsonStr = gson.toJson(userList);
out = response.getWriter();
out.write(gsonStr);
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
if(out != null)
out.write(new Gson().toJson("fail"));
}finally{
out.flush();
out.close();
}
}
}
前端代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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; charset=UTF-8">
<title>Insert title here</title>
<style>
.mt20{
margin-top: 20px;
}
</style>
</head>
<body>
<div style="text-align: center;">
<div class="mt20"><label>賬號:</label><input id="account" type="text"/></div>
<div class="mt20"><label>姓名:</label><input id="name" type="text"/></div>
<div class="mt20"><label>地址:</label><input id="address" type="text"/></div>
<div class="mt20"><button id="addUser" >添加</button></div>
</div>
<h3>用戶列表:</h3>
<ul id="userList">
</ul>
<script type="text/javascript" src="js/jquery-1.11.1.min.js"></script>
<script>
$(function() {
$.ajax({
url : 'queryAllUser.action',
type : 'post',
dataType : 'json',
success : function(data) {
try {
for(var i = 0; i < data.length; i++){
$("#userList").append("<li><span style='color:red'>id="+data[i].id+"</span>,account="+data[i].account+",name="+data[i].name+",address="+data[i].address+"</li>");
}
} catch (e) {};
}
,
error : function(e) {
alert("sys error");
}
});
$("#addUser").on("click", function() {
var account = $("#account").val();
var name = $("#name").val();
var address = $("#address").val();
$.ajax({
url : 'addUser.action',
type : 'post',
dataType : 'json',
data : {
account : account,
name : name,
address : address
},
success : function(data) {
try {
$("#userList").append("<li>account="+account+",name="+name+",address="+address+"</li>");
alert("添加成功");
} catch (e) {
}
},
error : function(e) {
alert("sys error");
}
});
});
});
</script>
</body>
</html>
六、測試效果:
struts2運(yùn)行正常;

測試二級緩存是否OK,查詢所有User;
第一次查詢:cache未命中,訪問數(shù)據(jù)庫:

第二次以及接下來的多次查詢,cache命中,沒有訪問數(shù)據(jù)庫:

@author 風(fēng)一樣的碼農(nóng)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Mybatis環(huán)境搭建和使用實(shí)例代碼
- 詳解SpringMVC和MyBatis框架開發(fā)環(huán)境搭建和簡單實(shí)用
- Java+MyBatis+MySQL開發(fā)環(huán)境搭建流程詳解
- Windows下Java+MyBatis框架+MySQL的開發(fā)環(huán)境搭建教程
- AngularJS整合Springmvc、Spring、Mybatis搭建開發(fā)環(huán)境
- SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解
- Springboot mybatis常見配置問題解決
- SpringBoot整合MyBatisPlus配置動(dòng)態(tài)數(shù)據(jù)源的方法
- Mybatis環(huán)境搭建及文件配置過程解析
相關(guān)文章
使用java8 API遍歷過濾文件目錄及子目錄和隱藏文件示例詳解
這篇文章主要介紹了使用java8API遍歷過濾文件目錄及子目錄及隱藏文件示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
SpringBoot整合Spring?Data?JPA的詳細(xì)方法
JPA全稱為Java Persistence API(Java持久層API),是一個(gè)基于ORM的標(biāo)準(zhǔn)規(guī)范,在這個(gè)規(guī)范中,JPA只定義標(biāo)準(zhǔn)規(guī)則,不提供實(shí)現(xiàn),本文重點(diǎn)給大家介紹SpringBoot整合Spring?Data?JPA的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-02-02
IDEA中Spring項(xiàng)目的工程構(gòu)建
這篇文章主要介紹了IDEA中Spring項(xiàng)目的工程構(gòu)建,Spring框架是輕量級的JavaEE框架,可以解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性,有兩個(gè)核心部分:IOC和Aop,今天來學(xué)習(xí)如何構(gòu)建spring項(xiàng)目,需要的朋友可以參考下2023-05-05
@RequestParam?和@RequestBody注解的區(qū)別解析
在 Spring MVC 中,我們可以使用 @RequestParam 和 @RequestBody 來獲取請求參數(shù),但它們在用法和作用上有一些區(qū)別,這篇文章主要介紹了@RequestParam?和@RequestBody注解的區(qū)別,需要的朋友可以參考下2023-06-06
微服務(wù)中使用Maven BOM來管理你的版本依賴詳解
這篇文章主要介紹了微服務(wù)中使用Maven BOM來管理你的版本依賴,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

