2016-12-15 08:40

@nbjgl JFinal APO极简设计,作用是调用服务层CRUD。

2016-12-14 10:38

不需要,只是tomcat自动部署是带/xxx项目名为前缀,而已你用jetty部署是以/开头不带项目名。

2016-12-14 10:35

自己写个解析类,就可以了。如:package com.njsoft.njapp.util;

import org.apache.commons.io.IOUtils;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.net.ssl.SSLHandshakeException;


/**
* json工具解析类
*/
public class JsonUtils {

public static final ObjectMapper MAPPER = new ObjectMapper()
.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)//是否允许忽略未知异常。
.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, false)
.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)//是否允许单个值为数据
.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, false)//是否允许空的字符与对象
.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, false)//是否允许特殊字符
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); //是否允许单引号
// .configure(SerializationConfig.Feature.WRAP_ROOT_VALUE,true) //序列时允许自定义根元素
// .configure(SerializationConfig.Feature.INDENT_OUTPUT,true); //序列时是否缩放排列输出

/**
* 转换2集合
* @param type -转换类型
* @param bytes -传入数据
* @param
* @return
*/
public static List getList(Class type, byte[] bytes) {
if (null == bytes) {
return null;
}
List res = new ArrayList<>();
try {
T[] next = toBean(type, bytes);
if (null != next)
Collections.addAll(res, next);
} catch (Exception e){
e.printStackTrace();
return null;
};
return res;
}

/**
* 转换2集合
* @param type -转换类型
* @param data -传入数据
* @param
* @return
*/
public static List getList(Class type, String data) {
if (null == data) {
return null;
}
List res = new ArrayList<>();
try {
T[] objs = toBean(type, data);
if (null != objs)
Collections.addAll(res, objs);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return res;
}

/**
* 转换2对象
* @param type -转换类型
* @param bytes -传入数据
* @param
* @return
*/
public static T toBean(Class type, byte[] bytes) {
if (null == bytes) {
return null;
}
return toBean(type, new ByteArrayInputStream(bytes));
}

public static T toBean(Class type, InputStream is) {
T obj = null;
try {
obj = parse(is, type, null);
} catch (IOException e) {
e.printStackTrace();
}
return obj;
}

/**
* 转换2对象
* @param type -转换类型
* @param data -传入参数
* @param
* @return
*/
public static T toBean(Class type, String data) {
T obj = null;
try {
obj = parse(data, type, null);
} catch (IOException e) {
e.printStackTrace();
}
return obj;
}

/**
* 对获取到的网络数据进行处理
*
* @param inputStream -传入二进制流
* @param type -解析类型
* @param instance -解析实例
* @return
* @throws IOException
*/
private static T parse(InputStream inputStream, Class type, T instance) throws IOException {
InputStreamReader reader = null;
try {
reader = new InputStreamReader(inputStream);
String data = IOUtils.toString(reader);
// data = str2Json(data);
if (null != type) {
return MAPPER.readValue(data, type);
} else if (null != instance) {
return MAPPER.readerForUpdating(instance).readValue(data);
} else {
return null;
}
} catch (SSLHandshakeException e) {
throw new SSLHandshakeException("You can disable certificate checking by setting " +
"ignoreCertificateErrors on GitlabHTTPRequestor");
} finally {
IOUtils.closeQuietly(reader);
}
}

/**
* 对获取到的网络数据进行处理
* @param data -传入数据
* @param type -解析类型
* @param instance -解析实例
* @param
* @return
* @throws IOException
*/
private static T parse(String data, Class type, T instance) throws IOException {
try {
if (null != type) {
return MAPPER.readValue(data, type);
} else if (null != instance) {
return MAPPER.readerForUpdating(instance).readValue(data);
} else {
return null;
}
} catch (SSLHandshakeException e) {
throw new SSLHandshakeException("");
}
}

/**
* JSON字符串特殊字符处理,比如:“\A1;1300”
* @param strJson
* @return String
*/
public static String str2Json(String strJson) {
StringBuffer sb = new StringBuffer();
for(int i=0; i char ch = strJson.charAt(i);
switch(ch){
case '"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
//case '/':
// sb.append("\\/");
// break;
default:
if((ch >= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F') || (ch >= '\u2000' && ch <= '\u20FF')) {
String str = Integer.toHexString(ch);
sb.append("\\u");
for(int k=0; k<4-str.length(); k++) {
sb.append('0');
}
sb.append(str.toUpperCase());
}
else{
sb.append(ch);
}
}
}
return sb.toString();
}
}

注意:记得添加jackson包,然后用jackson的注解,你试试行不行。

2016-12-14 10:31

这个估计是你写路由问题,不可能说接收不到参数。

2016-12-14 10:25

@FS心情 不客户,多支持社区^_^!!

2016-12-13 20:30

这样写是没错的,但是如当第一条抛出异常是不会执行第一条更新语句,但是如果第一条sql执行成功,第二条语句执行失败的话就会导致一条成功一条失败,所以建议你把两都放到事物中去。

2016-12-13 11:09

@JFinal 既然有涉及到druid监控访问权限控制,就是想更好那么一点点着。^_^!!

2016-12-13 11:06

@JFinal 这个我就是扩展了,重写下就完事了,只是想JFinal更完美而已呢。哈哈

2016-12-09 22:22

@JFinal 波总辛苦了。

2016-12-03 17:21

@JFinal 对了,jFinal2.3这个生成二码的能自己定制参数格式和内嵌订制图片吗,这两天我玩人小小项目,就是有这个需求自己订制生成二维码的,不知JFinal2.3版本这个二维码生成是咋样的。另还有个问题就是否提供解析二维码的方法?

2016-12-02 20:43

@JFinal 好的明白了,谢谢波总。^_^^_^

2016-12-02 18:21

@JFinal 啊,这样子的呀,哈哈。