SerfJ-0.4.1 REST服务器、Mybatis3.2.3 持久框架、Log4j-1.2.17 日志整合框架

SerfJ-0.4.1 REST服务器、Mybatis3.2.3 持久框架、Log4j-1.2.17 日志整合框架


1、SerfJ REST服务器


1.1、在eclipse中创建一个web项目


1.2、新建一个名为 src_serfj 的源代码文件夹


1.3、从 SerfJ 主页(http://serfj.sourceforge.net/)下载最新的源代码拷贝到源代码文件夹 src_serfj 中,使用源代码而不是二进制jar包的主要原因是后面有需要修改源代码的地方。


1.3、获取 SerfJ 依赖的库文件:下载 SerfJ 的 maven2 配置文件 pom.xml,通过 maven2 来获取这写依赖jar包


commons-codec-1.6.jar
jettison-1.3.jar
logback-classic-1.0.0.jar
logback-core-1.0.0.jar
slf4j-api-1.6.4.jar
stax-1.2.0.jar
stax-api-1.0.1.jar
xpp3_min-1.1.4c.jar
xstream-1.4.2.jar


1.4、配置web.xml中 SerfJ 的 RestServlet(请使用您自己的 url-pattern 参数)


<servlet>
   <servlet-name>RestServlet</servlet-name>
   <servlet-class>net.sf.serfj.RestServlet</servlet-class>
   <load-on-startup>5</load-on-startup>
</servlet>
 
<servlet-mapping>
   <servlet-name>RestServlet</servlet-name>
   <url-pattern>/banks/*</url-pattern>
</servlet-mapping>


1.5、配置 SerfJ 资源搜索语法习惯:/config/serfj.properties


main.package=com.mt.rest 主包名
#alias.controllers.package 所有控制器所在包的包名,默认为 controllers
#alias.serializers.package 所有序列器所在包的包名,默认为 serializers
#suffix.serializers 序列器后缀,默认为 Serializer
suffix.controllers=Ctrl 控制器后缀,默认是没有后缀的
views.directory=views 视图所在目录,默认是 views
packages.style=FUNCTIONAL 常用的资源搜索语法习惯


PS:
FUNCTIONAL 搜索控制器的路径 com.mt.rest + controllers + Bank + Ctrl = com.mt.rest.controllers.BankCtrl
FUNCTIONAL 搜索序列器的路径 com.mt.rest + serializers + Json + Bank + Serializer = com.mt.rest.serializers.JsonBankSerializer


1.6、在 src 源代码文件夹中创建 com.mt.rest,并在其中创建动作接口 ActionInterface.java


package com.mt.rest;

import java.util.Map;

import org.codehaus.jettison.json.JSONObject;

public interface ActionInterface {

public JSONObject execute(Map<String, Object> params);

}


1.7、在 src 源代码文件夹中创建 com.mt.rest.action,并在其中创建动作接口一个实现 GetBillAction.java


package com.mt.rest.action;

import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONObject;

import com.mt.mybatis.SqlMapAll;
import com.mt.mybatis.dao.MsgInboxMapper;
import com.mt.mybatis.model.MsgInboxExample;
import com.mt.rest.ActionInterface;

public class GetBillAction implements ActionInterface {

private static final Logger logger = Logger.getLogger(GetBillAction.class);

@Override
public JSONObject execute(Map<String, Object> params) {
   
JSONObject rst = new JSONObject();

SqlSession session = SqlMapAll.getInstance().openSession();
try {
MsgInboxMapper mapper = session.getMapper(MsgInboxMapper.class);
int countByExample = mapper.countByExample(new MsgInboxExample());
rst.putOpt("countByExample", countByExample); 
logger.debug(rst);
session.commit(true);
} catch(Exception e){
e.printStackTrace();
session.rollback(true);
} finally {
session.close();
}
   
return rst;
}

}


1.8、在控制器包中创建 BankCtrl.java 作为通用控制器


package com.mt.rest.controllers;

import java.util.Map;

import net.sf.serfj.RestController;
import net.sf.serfj.annotations.GET;
import net.sf.serfj.annotations.POST;

import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONObject;

import com.mt.rest.ActionInterface;

public class BankCtrl extends RestController {

private static final Logger logger = Logger.getLogger(BankCtrl.class.getName());

@POST @GET
public JSONObject jsonService() throws Exception{

Map<String, Object> params = getParams();

String actionClass = (String) params.get("actionClass");

JSONObject dataModel = new JSONObject();
try {
ActionInterface newInstance = (ActionInterface) Class.forName(actionClass).newInstance();
dataModel = newInstance.execute(params);
logger.debug(params);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return dataModel;

}
   
}


1.9、在序列华包中创建 JsonBankSerializer 做为通用的Json数据类型的序列华器


package com.mt.rest.serializers;

import net.sf.serfj.serializers.JsonSerializer;

import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

public class JsonBankSerializer extends JsonSerializer {

//private static final Logger LOGGER = Logger.getLogger(JsonBankSerializer.class.getName());

/**
* Serializes an object to Json.
*/
public String serialize(Object object) {
String json = "";
if (object instanceof JSONObject) {
json = ((JSONObject)object).toString();
} else if (object instanceof JSONArray) {
json = ((JSONArray)object).toString();
} else {
json = super.serialize(object);
}
return json;
}

/**
* Deserializes a Json string representation to an object.
*/
public Object deserialize(String jsonObject) {
Object obj = new JSONObject();
try {
if (jsonObject.startsWith("{")) {
obj = new JSONObject(jsonObject);
} else if (jsonObject.startsWith("[")) {
obj = new JSONArray(jsonObject);
} else {
obj = super.deserialize(jsonObject);
}
} catch (JSONException e1) {
e1.printStackTrace();
}
return obj;
}

}


2、Log4j-1.2.17 整合


2.1、只需要一个jar包:log4j-1.2.17.jar


2.2、配置文件 log4j.properties


# 滚动日志
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
# 日志输出位置
log4j.appender.fileout.File=/home/guo/log/mybatis3.log
# 日志最大限制
log4j.appender.fileout.MaxFileSize=10000KB   
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout   
log4j.appender.fileout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender   
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n   
# 日志输出级别,控制台输出,日志文件输出
log4j.rootLogger=DEBUG, stdout, fileout  


3、Mybatis-3.2.3 整合


3.1、只需要一个jar包:mybatis-3.2.3-SNAPSHOT.jar


3.2、添加一个Oracle数据库JDBC驱动:ojdbc14.jar


3.3、最好在 eclipse 中安装上 Mybatis Generator 插件,提高效率就靠它了呀:)


3.4、Mybatis Generator配置文件之一:ibatorConfig.properties,定义一些变量,在配置文件之二中要用到


project.lib = /home/guo/workspace_mt/BWJServer/WebContent/WEB-INF/lib
project.name = BWJServer


3.5、Mybatis Generator配置文件之二:generatorConfig.xml,建议每个数据源使用一个单独的配置文件,此文件的配置方式请参考官方文档


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
<properties resource="ibatorConfig.properties" />
<classPathEntry location="${project.lib}/ojdbc14.jar" />

<context id="ORATABLES" targetRuntime="MyBatis3">
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@192.168.0.163:1521:sa"
userId="lc0039999" password="password">
</jdbcConnection>

<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>

<javaModelGenerator targetPackage="com.mt.mybatis.model" targetProject="${project.name}/src">
<property name="trimStrings" value="true" />
</javaModelGenerator>

<sqlMapGenerator targetPackage="com.mt.mybatis.xml" targetProject="${project.name}/src_rs">
</sqlMapGenerator>

<javaClientGenerator type="XMLMAPPER" targetPackage="com.mt.mybatis.dao" targetProject="${project.name}/src">
</javaClientGenerator>

<!-- 
<table tableName="TB_SYS_USER"></table>

<table tableName="TB_SYS_USER_ROLE">
<generatedKey column="tsur001"
sqlStatement="select SEQ_SYS_USER_ROLE.nextval from dual" identity="false"
type="pre" />
</table>
<table tableName="TB_SYS_ROLE">
<generatedKey column="tsr001"
sqlStatement="select SEQ_SYS_ROLE.nextval from dual"
identity="false" type="pre" />
</table>
<table tableName="TB_SYS_ROLE_PERMISSION">
<generatedKey column="tsrp001"
sqlStatement="select SEQ_SYS_ROLE_PERMISSION.nextval from dual"
identity="false" type="pre" />
</table>
<table tableName="TB_SYS_PERMISSION">
<generatedKey column="tsp001"
sqlStatement="select SEQ_SYS_PERMISSION.nextval from dual"
identity="false" type="pre" />
</table>
<table tableName="TB_MOD_NOTE">
<generatedKey column="tmn001"
sqlStatement="select SEQ_MOD_NOTE.nextval from dual"
identity="false" type="pre" />
</table> 

<table tableName="ORGUSER" schema="AWSDB"></table>
<table tableName="VI_EMAIL" schema="AWSDB"></table>
<table tableName="VI_CMS" schema="AWSDB"></table>
<table tableName="VI_ELINK_DEPARTMENT" schema="AWSDB"></table>
<table tableName="VI_ELINK_MAP_DEP_EMP" schema="AWSDB"></table>-->
<table tableName="MSG_INBOX" schema="lc0039999"></table>


</context>
</generatorConfiguration>


3.6、Mybatis Generator配置文件之三:SqlMapConfig.xml,,建议每个数据源使用一个单独的配置文件,此文件的配置方式请参考官方文档


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="CS">
<environment id="Development">
<transactionManager type="JDBC" />
<dataSource type="JNDI">
<property name="initial_context" value="java:/comp/env" />
<property name="data_source" value="jdbc/MTMS" />
</dataSource>
</environment>
<environment id="CS">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.0.163:1521:sa" />
<property name="username" value="lc0039999" />
<property name="password" value="password" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mt/mybatis/xml/MsgInboxMapper.xml" />
</mappers>
</configuration>


3.7、在程序中针对不同的数据源定义多个 SQLMAP 获取类:SqlMapAll


package com.mt.mybatis;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;

import com.mt.mybatis.dao.MsgInboxMapper;
import com.mt.mybatis.model.MsgInboxExample;


public class SqlMapAll {

private static final SqlSessionFactory sqlMapper;
private static final Logger logger = Logger.getLogger(SqlMapAll.class);

static {
String resource = "SqlMapConfig.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (IOException e) {
throw new RuntimeException("Something bad happened while building the SqlMapClient instance.", e);
} finally {
if (reader!=null) {
try {
reader.close();
reader = null;
} catch (IOException e) {
logger.debug("",e);
}
}
}
}

public static SqlSessionFactory getInstance() {
return sqlMapper;
}

public static void main(String[] args) {

SqlSession session = SqlMapAll.getInstance().openSession();
try {
MsgInboxMapper mapper = session.getMapper(MsgInboxMapper.class);
int countByExample = mapper.countByExample(new MsgInboxExample());
System.out.println(countByExample);

session.commit(true);
} catch(Exception e){
e.printStackTrace();
session.rollback(true);
} finally {
session.close();
}
}

}


3.8、然后你就可以在 action 实现中使用 Mybatis3 了


package com.mt.rest.action;

import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONObject;

import com.mt.mybatis.SqlMapAll;
import com.mt.mybatis.dao.MsgInboxMapper;
import com.mt.mybatis.model.MsgInboxExample;
import com.mt.rest.ActionInterface;

public class GetBillAction implements ActionInterface {

private static final Logger logger = Logger.getLogger(GetBillAction.class);

@Override
public JSONObject execute(Map<String, Object> params) {
   
JSONObject rst = new JSONObject();

SqlSession session = SqlMapAll.getInstance().openSession();
try {
MsgInboxMapper mapper = session.getMapper(MsgInboxMapper.class);
int countByExample = mapper.countByExample(new MsgInboxExample());
rst.putOpt("countByExample", countByExample); 
logger.debug(rst);
session.commit(true);
} catch(Exception e){
e.printStackTrace();
session.rollback(true);
} finally {
session.close();
}
   
return rst;
}

}


3.9、解决chrome访问Json服务报 “Origin null is not allowed by Access-Control-Allow-Origin.”错误的问题和json包含的中文字符乱码的问题


修改 net.sf.serfj.RestServlet.java 中的 service(HttpServletRequest request, HttpServletResponse response)  方法如下:


protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Eliminamos de la URI el contexto
String url = request.getRequestURI().substring(request.getContextPath().length());
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("url => {}", url);
LOGGER.debug("HTTP_METHOD => {}", request.getMethod());
LOGGER.debug("queryString => {}", request.getQueryString());
LOGGER.debug("Context [{}]", request.getContextPath());
}


HttpMethod requestMethod = HttpMethod.valueOf(request.getMethod());
if (requestMethod == HttpMethod.POST) {
String httpMethodParam = request.getParameter(HTTP_METHOD_PARAM);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("param: http_method => {}", httpMethodParam);
}
if (httpMethodParam != null) {
requestMethod = HttpMethod.valueOf(httpMethodParam);
}
}
// Getting all the information from the URL
UrlInfo urlInfo = urlInspector.getUrlInfo(url, requestMethod);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("URL info {}", urlInfo.toString());
}

// 解决返回给浏览器JSON对象中中文乱码问题,add by guorui
response.setCharacterEncoding("utf-8");
// 解决chrome浏览器Ajax 跨域访报错问题,add by guorui
response.addHeader("Access-Control-Allow-Origin", "*");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
       response.addHeader("Access-Control-Allow-Credentials", "true");
   }

// Calling the controller's action
ResponseHelper responseHelper = new ResponseHelper(this.getServletContext(), request, response, urlInfo, config.getString(Config.VIEWS_DIRECTORY));
helper.invokeAction(urlInfo, responseHelper);
responseHelper.doResponse();
}






























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值