一、新建Web工程,并在lib目录下添加jar包

主要jar包:struts2相关包,mybatis3.3相关包,mysql-connector-java-5.1.22-bin.jar, gson-2.1.jar

二、配置web.xml,添加一个过滤器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、判断是否设置了struts排除的url(struts.action.excludePattern,通过正则表达式匹配),如果有且当前路径符合规则,则将请求转发给过滤器链上下一个对象,不交给struts2处理

if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
}

2、查找ActionMapping:通过PrepareOperations的findActionMapping方法查找,如果没找到,则将请求转发给过滤器链上下一个对象,不交给struts2处理;如果找到ActionMapping,则调用ExecuteOperations的executeAction方法,开始执行Action;下图是根据url找到ActionMapping的情况;


三、配置struts.xml文件,该Demo主要演示向前端传json格式数据,result type设成json格式,当然也可以设成其它的;

<?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相关信息: type为POOLED-连接池形式,poolMaximumActiveConnections – 在任意时间存在的活动(也就是正在使用)连接的数量,默认值:10。

配置实体类映射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及相关参数,记得实体类要实现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"> <!-- 默认的cache <cache />-->
<!-- 使用ehcache缓存 -->
<cache type="org.mybatis.caches.ehcache.LoggingEhcache" >
<property name="timeToIdleSeconds" value="3600"/><!--1 hour 缓存自创建日期起至失效时的间隔时间-->
<property name="timeToLiveSeconds" value="3600"/><!--1 hour 缓存创建以后,最后一次访问缓存的日期至失效之时的时间间隔-->
<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>

五、关键代码

DAO层:

首先建一个类,用于获取SqlSessionFactory,设计成单例模式;

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进行事务控制的,当然如果本来就一条sql操作,也就没什么事务控制可言了(本例子只是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层:

转成json格式数据返回给前端;

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运行正常;


测试二级缓存是否OK,查询所有User;

第一次查询:cache未命中,访问数据库:

第二次以及接下来的多次查询,cache命中,没有访问数据库:

mybatis3.3 + struts2.3.24 + mysql5.1.22开发环境搭建及相关说明的更多相关文章

  1. spring mvc4.1.6 + spring4.1.6 + hibernate4.3.11 + mysql5.5.25 开发环境搭建及相关说明

    一.准备工作 开始之前,先参考上一篇: struts2.3.24 + spring4.1.6 + hibernate4.3.11 + mysql5.5.25 开发环境搭建及相关说明 struts2.3 ...

  2. struts2.3.24 + spring4.1.6 + hibernate4.3.11+ mysql5.5.25开发环境搭建及相关说明

    一.目标 1.搭建传统的ssh开发环境,并成功运行(插入.查询) 2.了解c3p0连接池相关配置 3.了解验证hibernate的二级缓存,并验证 4.了解spring事物配置,并验证 5.了解spr ...

  3. 小强的HTML5移动开发之路(24)—— PhoneGap Android开发环境搭建

    有关JDK及Android开发环境的搭建请看我前面的博文:http://blog.csdn.net/dawanganban/article/details/9748497 一.下载PhoneGap 下 ...

  4. Struts2+Spring3+Mybatis3开发环境搭建

    本文主要介绍Struts2+Spring3+Mybatis3开发环境搭建 Struts和Spring不过多介绍. MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBa ...

  5. Struts2开发环境搭建,及一个简单登录功能实例

    首先是搭建Struts2环境. 第一步 下载Struts2去Struts官网 http://struts.apache.org/ 下载Struts2组件.截至目前,struts2最新版本为2.3.1. ...

  6. 24、自动装配-@Profile环境搭建

    24.自动装配-@Profile环境搭建 Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能. 开发环境.测试环境.正式环境 数据源切换 24.1 添加 数据源和jdbc驱动 ...

  7. 1.Struts2简介和Struts2开发环境搭建

    一.Struts2简介: 1.什么是Struts2? 著名的SSH三大框架分别为:表现层(Struts).业务逻辑层(Spring),持久化层(Hibernate). Struts2是在WebWork ...

  8. Struts2 开发环境搭建

    一.开发环境 eclipse+tomcat+struts-2.2.3        eclipse下载地址:http://www.eclipse.org/downloads/        tomca ...

  9. node在Fedora 22系统下开发环境搭建

    事实上,环境搭建在linux系统还是比較简单的,下载已经编译好的包,配置一下环境变量. 或者下载源代码,自己编译. 这里记录一下,主要是node版本号变化节奏很块的情况下.怎样配置一次环境变量就不要再 ...

随机推荐

  1. 【转载】shell中 dd 命令

    转载自:http://blog.chinaunix.net/uid-24958038-id-3416169.html dd if=/dev/zero of=的含义是什么? 一.dd命令的解释 dd:用 ...

  2. 扁平化设计的最新趋势 – 长阴影(Long Shadow)

    随着互联网的发展,网页设计变得越来越复杂,如今设计的外观和感觉实现网站功能说使用的开发技术一样重要.互联网的功能远远不只是基本的信息共享,现在人们对网站的期望是远远大于几年前的. 如今,HTML5 & ...

  3. java中this关键字

    1.     当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量.(this是当前对象自己) 如:public class Hello { String s = &q ...

  4. ThroughRain第一次冲刺个人总结

    团队名:ThroughRain 项目确定:<餐厅到店点餐系统> 项目背景:本次项目是专门为餐厅开发的一套订餐系统.大家有没有发现在节假日去餐厅吃饭会超级麻烦,人很多, 热门的餐厅基本没有座 ...

  5. JavaScript基础概念

    1.JavaScript在浏览器中是解释执行的: 2.JavaScript是一中弱类型的语言,在使用变量前,可以不用先申明: 3.JavaScript使用了对象对象程序设计思想: 4.JavaScri ...

  6. 微软参考源代码 referencesource.microsoft.com

    微软参考源代码 http://referencesource.microsoft.com/ referencesource 下载地址 https://github.com/Microsoft/refe ...

  7. MVC+EF+esayui初试(一 布局加菜单显示)

    最近都在做linq+ext.net的开发.这两天想学习下MVC和ef,刚好,在看ext.js的时候也喜欢上了esayui,所以就想用mvc+ef+esayui做一个汽车网后台管理来加强下.在这里也把我 ...

  8. .net reflector激活

    1.断网 2. 运行.NET Reflector,点击Help -> Activate 3. 运行注册机,复制注册机生成的序列号,粘贴到.NET Reflector中的激活输入框 4. 点击激活 ...

  9. LeetCode130:Surrounded Regions

    题目: Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is capt ...

  10. wget进行整站下载

    wget加上参数之后,即可成为相当强大的下载工具. wget -r -p -np -k http://xxx.com/abc/ -r,  --recursive(递归)          specif ...