Servlet3.0 + Freemarker + Dbutils零配置整合
博客专区 > 超龍 的博客 > 博客详情
Servlet3.0 + Freemarker + Dbutils零配置整合
超龍 发表于3个月前
Servlet3.0 + Freemarker + Dbutils零配置整合
  • 发表于 3个月前
  • 阅读 11
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

Spring框架越来越臃肿,Servlet3.0很强大了,@WebServlet注解基本可以替代Spring MVC的功能,至于数据库事务我们可以手动实现,所以我们开发web可以放弃Spring框架了。

Servlet3.0 + Freemarker + Dbutils这种轻量级的组合才是我们喜欢的。

废话少说,先上代码。配置一个Freemarker的控制器,用以解析html页面。这里控制器为TemplateController.java 文件:

import freemarker.ext.servlet.FreemarkerServlet;
import freemarker.template.Configuration;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

/**
* Freemarker模板配置
*
* @author yongchao
*/
@WebServlet(urlPatterns = { "*.html" }, // 需要定义Freemarker解析的页面后缀类型
asyncSupported = false, loadOnStartup = 0, name = "templateController", displayName = "TemplateController", initParams = {
@WebInitParam(name = "TemplatePath", value = "/"),
@WebInitParam(name = "NoCache", value = "true"),// 定义是否缓存
@WebInitParam(name = "ContentType", value = "text/html; charset=UTF-8"),// 定义内容类型
@WebInitParam(name = "template_update_delay", value = "0"), // 开发环境中可设置为0
@WebInitParam(name = "default_encoding", value = "UTF-8"),
@WebInitParam(name = "number_format", value = "0.##########") })
public class TemplateController extends FreemarkerServlet {
private static final long serialVersionUID = 8714019900490761087L;
}

Servlet代码没有发生什么变化,只是这次转向了html文件:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/test1")
public class TemplateTest1Action extends HttpServlet {
private static final long serialVersionUID = 6576879808909808L;

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException {
String id = "1";
String title = "使用freemarker";
String content = "这是测试";
request.setAttribute("article", new Article(id, title, content));
request.getRequestDispatcher("/WEB-INF/pages/template1.html").forward(
request, response);
}
}

接下来写个模板文件(template1.html)测试一下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${article.title}</title>
</head>
<body>
${article.id}
${article.content}
</body>
</html>

记得把 freemarker的jar和Dbutils的jar文件扔进WEB-INF/lib 目录下。

下面是使用Ubutils写的数据库事务Junit测试方法,所用数据库为MySql:

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.yunte.utils.db.JDBCUtils;
import java.sql.Connection;
import java.sql.SQLException;

public class TestTransaction {
protected Logger logger = LoggerFactory.getLogger(getClass());

@Test
public void test(String[] args) throws SQLException {
boolean originalAutoCommitSetting = true;
Connection connection = null;
try {
connection = JDBCUtils.getDataSource().getConnection();
/**
* 在创建QueryRunner对象时,不传递数据源给它,是为了保证这两条SQL在同一个事务中进行,
* 我们手动获取数据库连接,然后让这两条SQL使用同一个数据库连接执行
*/
QueryRunner runner = new QueryRunner();
originalAutoCommitSetting = connection.getAutoCommit();
// 开启事务
connection.setAutoCommit(false);
String sql = "insert into test_table(field1, field2, field3) values(?, ?, ?)";
Object[] paramArr1 = { "test1", "test1", 1 };
Object[] paramArr2 = { "test2", "test2", 2 };
runner.update(connection, sql, paramArr1);
// 模拟程序出现异常让事务回滚
int x = 1 / 0;
runner.update(connection, sql, paramArr2);
connection.commit();
} catch (Exception e) {
if (null != connection) {
// 出现异常之后就回滚事务
connection.rollback();
}
e.printStackTrace();
} finally {
// 关闭数据库连接
if (null != connection) {
connection.setAutoCommit(originalAutoCommitSetting);
connection.close();
}
}
}
}

 

标签: java servlet
共有 人打赏支持
粉丝 0
博文 30
码字总数 8618
×
超龍
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: