UDN-企业互联网技术人气社区

板块导航

浏览  : 13509
回复  : 49

[技术讨论] iUAP Mobile 学习笔记,持续更新....

[复制链接]
老V唐的头像 楼主
今天开始接触移动端应用,发现了不少坑,不过幸好我看到文档上提了一句 参考了JFinal ,哈哈天助我也,我也是JFinal 粉.欢迎大家回帖,提问,一起学习,一起进步.
=======================分割线下面开始今天的学习结果=======================
1 启动MAServer 后APP 连不上服务器?
答: 默认配置的127.0.0.1,需要改成你的具体IP.访问地址 http://IP:9090/umserver/core/ 有返回值那么就算对了
M1.jpg

2 怎么新建POJO或者说VO或者说Bean 或者说Model?
答:继承 com.yonyou.um.plugins.persist.SuperVO,不需要建表的字段,因为参考的JFinal ,所以这一特性保留了下来,
3 为什么用Mysql或Oracle 数据库无法使用,提示找不到表或视图?
答:这个就是集团坑的地方了,居然直接写死了只支持 PostgreSql.这个把我雷惨了,这个我必须要吐槽.
打开类 com.yonyou.um.web.UMWebContext ctrl+F PostgreSqlDialect
这里是设置数据源方言,
如果是 mysql 则改成 com.yonyou.um.plugins.persist.dialect.MysqlDialect
如果是 oracle 则改成 com.yonyou.um.plugins.persist.dialect.OracleDialect
当然你也可以根据jdbcUrl 设置成活的. 还要设置其他参数,比着下面抄.
  1. FileInputStream fis = null;
  2.                 Properties ps = new Properties();
  3.                 try {
  4.                         fis = new FileInputStream(dbConfig);
  5.                         ps.load(fis);
  6.                 }catch(Exception e){
  7.                         e.printStackTrace();
  8.                         throw new RuntimeException(e);
  9.                 }
复制代码
  1. arp.setDevMode(devMode); // 设置开发模式
  2.                 arp.setShowSql(devMode); // 是否显示SQL
  3.                 if (ps.getProperty("jdbcUrl").indexOf("postgresql") > -1) {
  4.                         log.info("configPlugin 使用数据库类型是 postgresql");
  5.                         arp.setDialect(new PostgreSqlDialect());
  6.                 }else if(ps.getProperty("jdbcUrl").indexOf("mysql") > -1) {
  7.                         log.info("configPlugin 使用数据库类型是 mysql");
  8.                         arp.setDialect(new MysqlDialect());
  9.                         arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));// 小写
  10.                 }else if(ps.getProperty("jdbcUrl").indexOf("oracle") > -1) {
  11.                         log.info("configPlugin 使用数据库类型是 oracle");
  12.                         dbPlugin.setValidationQuery("select 1 FROM DUAL");
  13.                         arp.setDialect(new OracleDialect());
  14.                         arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));// 配置属性名(字段名)大小写不敏感容器工厂
  15.                 }else{
  16.                         throw new RuntimeException("配置的jdbcUrl错误!");
  17.                 }
复制代码
4 默认C3p0连接池感觉不爽要改成其他的?
答:这个在集团来看,没保留Jfinal的特性,所以我自己改成了德鲁伊连接池,原因自己去度娘.
不多说直接贴代码,增加了一个类,又修改了 com.yonyou.um.web.UMWebContext源码.需要把德鲁伊连接池放目录UAPMobile_2.5.1.0220150602\MOB\ump_server\lib,然后重启studio
druid-1.0.14.rar (1.66 MB, 下载次数: 14)

相关帖子

老V唐的头像 楼主
发表于 2015-6-26 21:58:52 | 显示全部楼层
本帖最后由 老V唐 于 2015-7-5 19:58 编辑

5 如何使用日志?
答:配置一个日志模块,然后用com.yonyou.um.log.UMLogger去实例化 M2.png
  1. private static ILogger log = UMLogger.getLogger("gaojin");
复制代码
6 URL如何返回JSON,字符串格式信息?
答:调用服务端有3种方式,后面单独来细说,如果是APP根据控制类的完全限定类名和方法名调用,则方法直接返回JSON字符串即可,可用改过后的JSONTool, 如果是第三方要调用MAServer里的方法,参考问题8,返回数据用控制类的父类实际上实现了方法 renderJson 和 renderText,好吧我以为就这么完了,实际上我2Y2S,这里必须吐槽,我完全想不到集团居然又把这个功能太监了.
renderJson 直接写死的常见的部分对象的转换.不支持的继承了SuperVO的对象,看来我还得继续改啊!下面贴代码,先改了SuperVO,把getAttrs() 改成了public,实际上这么改不合理,因为这个取出来的对象是可以直接修改SuperVO的值的.但是我难得去SuperVO 同目录加一个代理类来处理这么一个功能.
  1. public Map<String, Object> getAttrs() {
复制代码

然后改了JSONTool支持SuperVO的特殊支持,
  1. package com.yonyou.um.common.util;

  2. import java.lang.reflect.Method;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;

  9. import com.yonyou.um.json.JSONArray;
  10. import com.yonyou.um.json.JSONException;
  11. import com.yonyou.um.json.JSONObject;
  12. import com.yonyou.um.plugins.persist.SuperVO;

  13. /**
  14. * Convert object to json string.
  15. *
  16. * Json java string java.lang.String number java.lang.Number true|false
  17. * java.lang.Boolean null null array java.util.List object java.util.Map
  18. */
  19. @SuppressWarnings({ "rawtypes", "unchecked" })
  20. public class JSONTool {

  21.         private static int convertDepth = 8;
  22.         private static String timestampPattern = "yyyy-MM-dd HH:mm:ss";
  23.         private static String datePattern = "yyyy-MM-dd";

  24.         public static void setConvertDepth(int convertDepth) {
  25.                 if (convertDepth < 2)
  26.                         throw new IllegalArgumentException(
  27.                                         "convert depth can not less than 2.");
  28.                 JSONTool.convertDepth = convertDepth;
  29.         }

  30.         public static void setTimestampPattern(String timestampPattern) {
  31.                 if (timestampPattern == null || "".equals(timestampPattern.trim()))
  32.                         throw new IllegalArgumentException(
  33.                                         "timestampPattern can not be blank.");
  34.                 JSONTool.timestampPattern = timestampPattern;
  35.         }

  36.         public static void setDatePattern(String datePattern) {
  37.                 if (datePattern == null || "".equals(datePattern.trim()))
  38.                         throw new IllegalArgumentException("datePattern can not be blank.");
  39.                 JSONTool.datePattern = datePattern;
  40.         }

  41.         public static String mapToJson(Map map, int depth) {
  42.                 if (map == null)
  43.                         return "null";

  44.                 StringBuilder sb = new StringBuilder();
  45.                 boolean first = true;
  46.                 Iterator iter = map.entrySet().iterator();

  47.                 sb.append('{');
  48.                 while (iter.hasNext()) {
  49.                         if (first)
  50.                                 first = false;
  51.                         else
  52.                                 sb.append(',');

  53.                         Map.Entry entry = (Map.Entry) iter.next();
  54.                         toKeyValue(String.valueOf(entry.getKey()), entry.getValue(), sb,
  55.                                         depth);
  56.                 }
  57.                 sb.append('}');
  58.                 return sb.toString();
  59.         }

  60.         private static String toKeyValue(String key, Object value,
  61.                         StringBuilder sb, int depth) {
  62.                 sb.append('\"');
  63.                 if (key == null)
  64.                         sb.append("null");
  65.                 else
  66.                         escape(key, sb);
  67.                 sb.append('\"').append(':');

  68.                 sb.append(toJson(value, depth));

  69.                 return sb.toString();
  70.         }

  71.         public static String listToJson(List list, int depth) {
  72.                 if (list == null)
  73.                         return "null";

  74.                 boolean first = true;
  75.                 StringBuilder sb = new StringBuilder();
  76.                 Iterator iter = list.iterator();

  77.                 sb.append('[');
  78.                 while (iter.hasNext()) {
  79.                         if (first)
  80.                                 first = false;
  81.                         else
  82.                                 sb.append(',');

  83.                         Object value = iter.next();
  84.                         if (value == null) {
  85.                                 sb.append("null");
  86.                                 continue;
  87.                         }
  88.                         sb.append(toJson(value, depth));
  89.                 }
  90.                 sb.append(']');
  91.                 return sb.toString();
  92.         }

  93.         /**
  94.          * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters
  95.          * (U+0000 through U+001F).
  96.          */
  97.         private static String escape(String s) {
  98.                 if (s == null)
  99.                         return null;
  100.                 StringBuilder sb = new StringBuilder();
  101.                 escape(s, sb);
  102.                 return sb.toString();
  103.         }

  104.         private static void escape(String s, StringBuilder sb) {
  105.                 for (int i = 0; i < s.length(); i++) {
  106.                         char ch = s.charAt(i);
  107.                         switch (ch) {
  108.                         case '"':
  109.                                 sb.append("\\\"");
  110.                                 break;
  111.                         case '\\':
  112.                                 sb.append("\\\\");
  113.                                 break;
  114.                         case '\b':
  115.                                 sb.append("\\b");
  116.                                 break;
  117.                         case '\f':
  118.                                 sb.append("\\f");
  119.                                 break;
  120.                         case '\n':
  121.                                 sb.append("\\n");
  122.                                 break;
  123.                         case '\r':
  124.                                 sb.append("\\r");
  125.                                 break;
  126.                         case '\t':
  127.                                 sb.append("\\t");
  128.                                 break;
  129.                         case '/':
  130.                                 sb.append("\\/");
  131.                                 break;
  132.                         default:
  133.                                 if ((ch >= '\u0000' && ch <= '\u001F')
  134.                                                 || (ch >= '\u007F' && ch <= '\u009F')
  135.                                                 || (ch >= '\u2000' && ch <= '\u20FF')) {
  136.                                         String str = Integer.toHexString(ch);
  137.                                         sb.append("\\u");
  138.                                         for (int k = 0; k < 4 - str.length(); k++) {
  139.                                                 sb.append('0');
  140.                                         }
  141.                                         sb.append(str.toUpperCase());
  142.                                 } else {
  143.                                         sb.append(ch);
  144.                                 }
  145.                         }
  146.                 }
  147.         }

  148.         public static String toJson(Object value) {
  149.                 return toJson(value, convertDepth);
  150.         }

  151.         public static String toJson(Object value, int depth) {
  152.                 if (value == null || (depth--) < 0)
  153.                         return "null";

  154.                 if (value instanceof String)
  155.                         return "\"" + escape((String) value) + "\"";

  156.                 if (value instanceof Double) {
  157.                         if (((Double) value).isInfinite() || ((Double) value).isNaN())
  158.                                 return "null";
  159.                         else
  160.                                 return value.toString();
  161.                 }

  162.                 if (value instanceof Float) {
  163.                         if (((Float) value).isInfinite() || ((Float) value).isNaN())
  164.                                 return "null";
  165.                         else
  166.                                 return value.toString();
  167.                 }

  168.                 if (value instanceof Number)
  169.                         return value.toString();

  170.                 if (value instanceof Boolean)
  171.                         return value.toString();

  172.                 if (value instanceof java.util.Date) {
  173.                         if (value instanceof java.sql.Timestamp)
  174.                                 return "\""
  175.                                                 + new SimpleDateFormat(timestampPattern).format(value)
  176.                                                 + "\"";
  177.                         if (value instanceof java.sql.Time)
  178.                                 return "\"" + value.toString() + "\"";
  179.                         return "\"" + new SimpleDateFormat(datePattern).format(value)
  180.                                         + "\"";
  181.                 }

  182.                 if (value instanceof Map) {
  183.                         return mapToJson((Map) value, depth);
  184.                 }

  185.                 if (value instanceof List) {
  186.                         return listToJson((List) value, depth);
  187.                 }
  188.                 //tanghxa 2015-06-29
  189.                 String result = otherToJson(value, depth);
  190.                 if (result != null)
  191.                         return result;
  192.                 return "\"" + escape(value.toString()) + "\"";
  193.         }
  194.         /**
  195.          * 还原了JFinal 的转Bean 和SuperVO 的功能
  196.          * tanghxa 2015-06-29
  197.          * @param value
  198.          * @param depth
  199.          * @return
  200.          */
  201.         private static String otherToJson(Object value, int depth) {
  202.                 if (value instanceof Character) {
  203.                         return "\"" + escape(value.toString()) + "\"";
  204.                 }
  205.                
  206.                 if (value instanceof SuperVO) {
  207.                         Map map = ((SuperVO)value).getAttrs();
  208.                         return mapToJson(map, depth);
  209.                 }
  210. //                if (value instanceof Record) {
  211. //                        Map map = ((Record)value).getColumns();
  212. //                        return mapToJson(map, depth);
  213. //                }
  214.                 if (value instanceof Object[]) {
  215.                         Object[] arr = (Object[])value;
  216.                         List list = new ArrayList(arr.length);
  217.                         for (int i=0; i<arr.length; i++)
  218.                                 list.add(arr[i]);
  219.                         return listToJson(list, depth);
  220.                 }
  221.                 if (value instanceof Enum) {
  222.                         return "\"" + ((Enum)value).toString() + "\"";
  223.                 }
  224.                
  225.                 return beanToJson(value, depth);
  226.         }
  227.         
  228.         public static String beanToJson(Object model, int depth) {
  229.                 Map map = new HashMap();
  230.                 Method[] methods = model.getClass().getMethods();
  231.                 for (Method m : methods) {
  232.                         String methodName = m.getName();
  233.                         int indexOfGet = methodName.indexOf("get");
  234.                         if (indexOfGet == 0 && methodName.length() > 3) { // Only getter
  235.                                 String attrName = methodName.substring(3);
  236.                                 if (!attrName.equals("Class")) { // Ignore Object.getClass()
  237.                                         Class<?>[] types = m.getParameterTypes();
  238.                                         if (types.length == 0) {
  239.                                                 try {
  240.                                                         Object value = m.invoke(model);
  241.                                                         map.put(StringTool.firstCharToLowerCase(attrName),
  242.                                                                         value);
  243.                                                 } catch (Exception e) {
  244.                                                         throw new RuntimeException(e.getMessage(), e);
  245.                                                 }
  246.                                         }
  247.                                 }
  248.                         } else {
  249.                                 int indexOfIs = methodName.indexOf("is");
  250.                                 if (indexOfIs == 0 && methodName.length() > 2) {
  251.                                         String attrName = methodName.substring(2);
  252.                                         Class<?>[] types = m.getParameterTypes();
  253.                                         if (types.length == 0) {
  254.                                                 try {
  255.                                                         Object value = m.invoke(model);
  256.                                                         map.put(StringTool.firstCharToLowerCase(attrName),
  257.                                                                         value);
  258.                                                 } catch (Exception e) {
  259.                                                         throw new RuntimeException(e.getMessage(), e);
  260.                                                 }
  261.                                         }
  262.                                 }
  263.                         }
  264.                 }
  265.                 return mapToJson(map, depth);
  266.         }

  267.         /**
  268.          * add new json content to old json data
  269.          * @param json
  270.          * @param addedContent
  271.          * @return
  272.          * @throws JSONException
  273.          */
  274.         public static String addContentToJson(String json, JSONObject addedContent)
  275.                         throws JSONException {
  276.                 if (StringTool.isBlank(json)) {
  277.                         json = "{}";
  278.                 }
  279.                 if (addedContent != null && addedContent.length() > 0) {
  280.                         JSONObject paramsJson = new JSONObject(json);
  281.                         for (Iterator<String> iterator = addedContent.keys(); iterator.hasNext();) {
  282.                                 String key = iterator.next();
  283.                                 paramsJson.put(key, addedContent.get(key));
  284.                         }
  285.                         return paramsJson.toString();
  286.                 }
  287.                 return json;
  288.         }
  289.         
  290.         /**
  291.          * format the string of json, value of json be all changed to the string
  292.          * type
  293.          *
  294.          * @param String
  295.          * @return
  296.          * @throws JSONException
  297.          */
  298.         public static String formatJSONObjectString(String strJSON)
  299.                         throws JSONException {
  300.                 try {
  301.                         JSONObject json = new JSONObject(strJSON);
  302.                         json = formatJSONObject(json);
  303.                         return json.toString();
  304.                 } catch (Exception e) {
  305.                         e.printStackTrace();
  306.                         throw new JSONException(
  307.                                         "formatJSONObjectString failed! the input parameter string: "
  308.                                                         + strJSON);
  309.                 }
  310.         }

  311.         /**
  312.          * format the json object, the value of json object be all changed to the
  313.          * string type
  314.          *
  315.          * @param json
  316.          * @return
  317.          * @throws JSONException
  318.          */
  319.         public static JSONObject formatJSONObject(JSONObject json)
  320.                         throws JSONException {
  321.                 try {
  322.                         Iterator it = json.keys();
  323.                         while (it.hasNext()) {
  324.                                 String key = it.next().toString();
  325.                                 Object val = json.get(key);

  326.                                 if (val == null) {
  327.                                         json.put(key, "");
  328.                                 } else if (val instanceof Boolean || val instanceof Number
  329.                                                 || val instanceof Integer || val instanceof Float) {
  330.                                         json.put(key, val.toString().toLowerCase());
  331.                                 } else if (val instanceof JSONObject) {
  332.                                         formatJSONObject((JSONObject) val);
  333.                                 } else if (val instanceof JSONArray) {
  334.                                         formatJSONArray((JSONArray) val);
  335.                                 }
  336.                         }
  337.                 } catch (Exception e) {
  338.                         throw new JSONException(e.getMessage());
  339.                 }
  340.                 return json;
  341.         }

  342.         /**
  343.          * format the json Array, the value of json object be all changed to the
  344.          * string type
  345.          *
  346.          * @param jsonArray
  347.          * @return
  348.          * @throws JSONException
  349.          */
  350.         private static void formatJSONArray(JSONArray array) throws JSONException {
  351.                 for (int i = 0, len = array.length(); i < len; i++) {
  352.                         Object obj = array.get(i);
  353.                         if(obj instanceof JSONObject){
  354.                                 formatJSONObject((JSONObject) obj);
  355.                         }
  356.                 }
  357.         }
  358.         
  359.         public static Map<String, Object> jsonToMap(JSONObject json) {
  360.                 Map<String, Object> retMap = new HashMap<String, Object>();
  361.                 if (json != null) {
  362.                         for (Iterator it = json.keys(); it.hasNext();) {
  363.                                 Object key = it.next();
  364.                                 try {
  365.                                         retMap.put(key.toString(), json.get(key.toString()));
  366.                                 } catch (JSONException e) {
  367.                                         throw new RuntimeException(
  368.                                                         "UmControllerException: json exception", e);
  369.                                 }
  370.                         }
  371.                 }
  372.                 return retMap;
  373.         }

  374. }
复制代码


7 调用SuperVO 的 paginate 等系列方法报空指针错误?
答:com.yonyou.um.plugins.persist.Db的 pro 属性未初始化,默认为空,哎这个也是集团留的坑,JFinal在启动项目的时候加载Table信息,然后Db.init(),集团直接干掉了.将就到用.
修改源码 com.yonyou.um.plugins.persist.Db
  1. private static DbPro pro =  DbPro.use();
复制代码
JFinal 设计的多数据源支持,不晓得被集团改的是否还支持,不过如果谁要用到多数据源的话,可以去才看JFinal的多数据源使用,然后 修改 UMWebContext 试试.



使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:04 | 显示全部楼层
本帖最后由 老V唐 于 2015-6-29 17:10 编辑

4 问题的继续,东西太多了.UAPMobile_2.5.1.0220150602\MOB\ump_server\hotwebs\umserver\WEB-INF\webxml 配置德鲁伊的信息,例如 管理员帐号 admin 密码 gaojin 用户在Cookie中的key 为 gaojin.user ,配置完了后的访问地址为 http://IP:9090/umserver/druid/index.html
  1. <!-- Druid 数据源查看 -->
  2.         <servlet>
  3.                 <servlet-name>DruidStatView</servlet-name>
  4.                 <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  5.                 <init-param>
  6.                         <param-name>resetEnable</param-name>
  7.                         <param-value>false</param-value>
  8.                 </init-param>
  9.                 <init-param>
  10.                         <param-name>loginUsername</param-name>
  11.                         <param-value>admin</param-value>
  12.                 </init-param>
  13.                 <init-param>
  14.                         <param-name>loginPassword</param-name>
  15.                         <param-value>gaojin</param-value>
  16.                 </init-param>
  17.         </servlet>
  18.         <servlet-mapping>
  19.                 <servlet-name>DruidStatView</servlet-name>
  20.                 <url-pattern>/druid/*</url-pattern>
  21.         </servlet-mapping>
  22.         
  23.         <filter>
  24.             <filter-name>DruidWebStatFilter</filter-name>
  25.             <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  26.             <init-param>
  27.                 <param-name>exclusions</param-name>
  28.                 <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  29.             </init-param>
  30.             <init-param>
  31.                 <param-name>principalSessionName</param-name>
  32.                 <param-value>gaojin.user</param-value>
  33.             </init-param>
  34.             <init-param>
  35.                     <param-name>profileEnable</param-name>
  36.                     <param-value>true</param-value>
  37.                 </init-param>
  38.         </filter>
  39.         <filter-mapping>
  40.           <filter-name>DruidWebStatFilter</filter-name>
  41.           <url-pattern>/*</url-pattern>
  42.         </filter-mapping>
复制代码


  1. package com.yonyou.um.plugins.druid;

  2. import java.sql.SQLException;
  3. import java.util.ArrayList;
  4. import java.util.List;

  5. import javax.sql.DataSource;

  6. import com.alibaba.druid.filter.Filter;
  7. import com.alibaba.druid.pool.DruidDataSource;
  8. import com.yonyou.um.common.util.StringTool;
  9. import com.yonyou.um.plugin.IPlugin;
  10. import com.yonyou.um.plugins.persist.IDataSourceProvider;

  11. /**
  12. * DruidPlugin.
  13. */
  14. public class DruidPlugin implements IPlugin, IDataSourceProvider {
  15.         
  16.         // 基本属性 url、user、password
  17.         private String url;
  18.         private String username;
  19.         private String password;
  20.         private String driverClass = null;        // 由 "com.mysql.jdbc.Driver" 改为 null 让 druid 自动探测 driverClass 值
  21.         
  22.         // 初始连接池大小、最小空闲连接数、最大活跃连接数
  23.         private int initialSize = 10;
  24.         private int minIdle = 10;
  25.         private int maxActive = 100;
  26.         
  27.         // 配置获取连接等待超时的时间
  28.         private long maxWait = DruidDataSource.DEFAULT_MAX_WAIT;
  29.         
  30.         // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  31.         private long timeBetweenEvictionRunsMillis = DruidDataSource.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
  32.         // 配置连接在池中最小生存的时间
  33.         private long minEvictableIdleTimeMillis = DruidDataSource.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
  34.         // 配置发生错误时多久重连
  35.         private long timeBetweenConnectErrorMillis = DruidDataSource.DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS;
  36.         
  37.         /**
  38.          * hsqldb - "select 1 from INFORMATION_SCHEMA.SYSTEM_USERS"
  39.          * Oracle - "select 1 from dual"
  40.          * DB2 - "select 1 from sysibm.sysdummy1"
  41.          * mysql - "select 1"
  42.          */
  43.         private String validationQuery = "select 1";
  44.         private boolean testWhileIdle = true;
  45.         private boolean testOnBorrow = false;
  46.         private boolean testOnReturn = false;
  47.         
  48.         // 是否打开连接泄露自动检测
  49.         private boolean removeAbandoned = false;
  50.         // 连接长时间没有使用,被认为发生泄露时长
  51.         private long removeAbandonedTimeoutMillis = 300 * 1000;
  52.         // 发生泄露时是否需要输出 log,建议在开启连接泄露检测时开启,方便排错
  53.         private boolean logAbandoned = false;
  54.         
  55.         // 是否缓存preparedStatement,即PSCache,对支持游标的数据库性能提升巨大,如 oracle、mysql 5.5 及以上版本
  56.         // private boolean poolPreparedStatements = false;        // oracle、mysql 5.5 及以上版本建议为 true;
  57.         
  58.         // 只要maxPoolPreparedStatementPerConnectionSize>0,poolPreparedStatements就会被自动设定为true,使用oracle时可以设定此值。
  59.         private int maxPoolPreparedStatementPerConnectionSize = -1;
  60.         
  61.         // 配置监控统计拦截的filters
  62.         private String filters;        // 监控统计:"stat"    防SQL注入:"wall"     组合使用: "stat,wall"
  63.         private List<Filter> filterList;
  64.         
  65.         private DruidDataSource ds;
  66.         
  67.         public DruidPlugin(String url, String username, String password) {
  68.                 this.url = url;
  69.                 this.username = username;
  70.                 this.password = password;
  71.         }
  72.         
  73.         public DruidPlugin(String url, String username, String password, String driverClass) {
  74.                 this.url = url;
  75.                 this.username = username;
  76.                 this.password = password;
  77.                 this.driverClass = driverClass;
  78.         }
  79.         
  80.         public DruidPlugin(String url, String username, String password, String driverClass, String filters) {
  81.                 this.url = url;
  82.                 this.username = username;
  83.                 this.password = password;
  84.                 this.driverClass = driverClass;
  85.                 this.filters = filters;
  86.         }
  87.         
  88.         /**
  89.          * 设置过滤器,如果要开启监控统计需要使用此方法或在构造方法中进行设置
  90.          * <p>
  91.          * 监控统计:"stat"
  92.          * 防SQL注入:"wall"
  93.          * 组合使用: "stat,wall"
  94.          * </p>
  95.          */
  96.         public DruidPlugin setFilters(String filters) {
  97.                 this.filters = filters;
  98.                 return this;
  99.         }
  100.         
  101.         public synchronized DruidPlugin addFilter(Filter filter) {
  102.                 if (filterList == null)
  103.                         filterList = new ArrayList<Filter>();
  104.                 filterList.add(filter);
  105.                 return this;
  106.         }
  107.         
  108.         public boolean start() {
  109.                 ds = new DruidDataSource();
  110.                
  111.                 ds.setUrl(url);
  112.                 ds.setUsername(username);
  113.                 ds.setPassword(password);
  114.                 if (driverClass != null)
  115.                         ds.setDriverClassName(driverClass);
  116.                 ds.setInitialSize(initialSize);
  117.                 ds.setMinIdle(minIdle);
  118.                 ds.setMaxActive(maxActive);
  119.                 ds.setMaxWait(maxWait);
  120.                 ds.setTimeBetweenConnectErrorMillis(timeBetweenConnectErrorMillis);
  121.                 ds.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  122.                 ds.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  123.                
  124.                 ds.setValidationQuery(validationQuery);
  125.                 ds.setTestWhileIdle(testWhileIdle);
  126.                 ds.setTestOnBorrow(testOnBorrow);
  127.                 ds.setTestOnReturn(testOnReturn);
  128.                
  129.                 ds.setRemoveAbandoned(removeAbandoned);
  130.                 ds.setRemoveAbandonedTimeoutMillis(removeAbandonedTimeoutMillis);
  131.                 ds.setLogAbandoned(logAbandoned);
  132.                
  133.                 //只要maxPoolPreparedStatementPerConnectionSize>0,poolPreparedStatements就会被自动设定为true,参照druid的源码
  134.                 ds.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
  135.                
  136.                 if (StringTool.notBlank(filters))
  137.                         try {ds.setFilters(filters);} catch (SQLException e) {throw new RuntimeException(e);}
  138.                
  139.                 addFilterList(ds);
  140.                 return true;
  141.         }
  142.         
  143.         private void addFilterList(DruidDataSource ds) {
  144.                 if (filterList != null) {
  145.                         List<Filter> targetList = ds.getProxyFilters();
  146.                         for (Filter add : filterList) {
  147.                                 boolean found = false;
  148.                                 for (Filter target : targetList) {
  149.                                         if (add.getClass().equals(target.getClass())) {
  150.                                                 found = true;
  151.                                                 break;
  152.                                         }
  153.                                 }
  154.                                 if (! found)
  155.                                         targetList.add(add);
  156.                         }
  157.                 }
  158.         }
  159.         
  160.         public boolean stop() {
  161.                 if (ds != null)
  162.                         ds.close();
  163.                 return true;
  164.         }
  165.         
  166.         public DataSource getDataSource() {
  167.                 return ds;
  168.         }
  169.         
  170.         public DruidPlugin set(int initialSize, int minIdle, int maxActive) {
  171.                 this.initialSize = initialSize;
  172.                 this.minIdle = minIdle;
  173.                 this.maxActive = maxActive;
  174.                 return this;
  175.         }
  176.         
  177.         public DruidPlugin setDriverClass(String driverClass) {
  178.                 this.driverClass = driverClass;
  179.                 return this;
  180.         }
  181.         
  182.         public DruidPlugin setInitialSize(int initialSize) {
  183.                 this.initialSize = initialSize;
  184.                 return this;
  185.         }
  186.         
  187.         public DruidPlugin setMinIdle(int minIdle) {
  188.                 this.minIdle = minIdle;
  189.                 return this;
  190.         }
  191.         
  192.         public DruidPlugin setMaxActive(int maxActive) {
  193.                 this.maxActive = maxActive;
  194.                 return this;
  195.         }
  196.         
  197.         public DruidPlugin setMaxWait(long maxWait) {
  198.                 this.maxWait = maxWait;
  199.                 return this;
  200.         }
  201.         
  202.         public DruidPlugin setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
  203.                 this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
  204.                 return this;
  205.         }
  206.         
  207.         public DruidPlugin setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
  208.                 this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
  209.                 return this;
  210.         }
  211.         
  212.         /**
  213.          * hsqldb - "select 1 from INFORMATION_SCHEMA.SYSTEM_USERS"
  214.          * Oracle - "select 1 from dual"
  215.          * DB2 - "select 1 from sysibm.sysdummy1"
  216.          * mysql - "select 1"
  217.          */
  218.         public DruidPlugin setValidationQuery(String validationQuery) {
  219.                 this.validationQuery = validationQuery;
  220.                 return this;
  221.         }
  222.         
  223.         public DruidPlugin setTestWhileIdle(boolean testWhileIdle) {
  224.                 this.testWhileIdle = testWhileIdle;
  225.                 return this;
  226.         }
  227.         
  228.         public DruidPlugin setTestOnBorrow(boolean testOnBorrow) {
  229.                 this.testOnBorrow = testOnBorrow;
  230.                 return this;
  231.         }
  232.         
  233.         public DruidPlugin setTestOnReturn(boolean testOnReturn) {
  234.                 this.testOnReturn = testOnReturn;
  235.                 return this;
  236.         }
  237.         
  238.         public DruidPlugin setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
  239.                 this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
  240.                 return this;
  241.         }
  242.         
  243.         public final void setTimeBetweenConnectErrorMillis(long timeBetweenConnectErrorMillis) {
  244.                 this.timeBetweenConnectErrorMillis = timeBetweenConnectErrorMillis;
  245.         }
  246.         
  247.         public final void setRemoveAbandoned(boolean removeAbandoned) {
  248.                 this.removeAbandoned = removeAbandoned;
  249.         }
  250.         
  251.         public final void setRemoveAbandonedTimeoutMillis(long removeAbandonedTimeoutMillis) {
  252.                 this.removeAbandonedTimeoutMillis = removeAbandonedTimeoutMillis;
  253.         }
  254.         
  255.         public final void setLogAbandoned(boolean logAbandoned) {
  256.                 this.logAbandoned = logAbandoned;
  257.         }
  258. }
复制代码

  1. package com.yonyou.um.web;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.net.URL;
  6. import java.util.ArrayList;
  7. import java.util.Enumeration;
  8. import java.util.List;
  9. import java.util.Properties;

  10. import com.alibaba.druid.filter.logging.Log4jFilter;
  11. import com.alibaba.druid.filter.stat.StatFilter;
  12. import com.yonyou.um.common.util.PathTool;
  13. import com.yonyou.um.core.Config;
  14. import com.yonyou.um.core.Plugins;
  15. import com.yonyou.um.core.UMContext;
  16. import com.yonyou.um.log.ILogger;
  17. import com.yonyou.um.log.UMLogger;
  18. import com.yonyou.um.plugin.IPlugin;
  19. import com.yonyou.um.plugin.spring.SpringPlugin;
  20. import com.yonyou.um.plugins.druid.DruidPlugin;
  21. import com.yonyou.um.plugins.persist.ActiveRecordPlugin;
  22. import com.yonyou.um.plugins.persist.CaseInsensitiveContainerFactory;
  23. import com.yonyou.um.plugins.persist.dialect.MysqlDialect;
  24. import com.yonyou.um.plugins.persist.dialect.OracleDialect;
  25. import com.yonyou.um.plugins.persist.dialect.PostgreSqlDialect;
  26. import com.yonyou.um.web.server.IServer;
  27. import com.yonyou.um.web.server.ServerFactory;
  28. import com.yonyou.um.webmvc.controller.Routes;
  29. import com.yonyou.um.webmvc.controller.UMModelConfig;
  30. import com.yonyou.um.webmvc.controller.WebAction;
  31. import com.yonyou.um.webmvc.controller.WebActionMapping;

  32. public class UMWebContext extends Config {
  33.         private static ILogger log = UMLogger.getLogger("gaojin");
  34.         private Routes routes = new Routes();
  35.         private WebActionMapping actionMapping;

  36.         public UMWebContext() {
  37.                 super();
  38.                 configUMModel();
  39.                 initActionMapping();
  40.         }

  41.         @Override
  42.         public void configEnv() {
  43.                 // 配置环境信息
  44.         }

  45.         @Override
  46.         public void configPlugin(Plugins me) {
  47.                 List<String> xmlFiles = new ArrayList<String>();
  48.                 try {
  49.                         Enumeration<URL> urls = getClass().getClassLoader().getResources(
  50.                                         "serviceConfig.xml");
  51.                         while (urls.hasMoreElements()) {
  52.                                 xmlFiles.add(urls.nextElement().getFile());
  53.                         }
  54.                 } catch (IOException e) {
  55.                         e.printStackTrace();
  56.                 }

  57.                 IPlugin iocplugin = new SpringPlugin(xmlFiles.toArray(new String[0]));
  58.                 me.add(iocplugin);

  59.                 // 暂时配置默认的数据持久化
  60.                 String serverHome = PathTool.getHomePath();
  61.                 File dbConfig = new File(serverHome + File.separator + "config"
  62.                                 + File.separator + "dbConfig.properties");
  63.                 if (!dbConfig.exists()) {
  64.                         throw new RuntimeException(
  65.                                         "the config file of database is not exist!");
  66.                 }
  67.                 //begin tanghxa 2015-06-26  原产品为 C3P0连接池,改为德鲁伊连接池,更方便查看数据库使用情况
  68. //                C3p0Plugin dbPlugin = new C3p0Plugin(dbConfig);
  69.                
  70.                 FileInputStream fis = null;
  71.                 Properties ps = new Properties();
  72.                 try {
  73.                         fis = new FileInputStream(dbConfig);
  74.                         ps.load(fis);
  75.                 }catch(Exception e){
  76.                         e.printStackTrace();
  77.                         throw new RuntimeException(e);
  78.                 }
  79.                 DruidPlugin dbPlugin = new DruidPlugin(ps.getProperty("jdbcUrl"), ps.getProperty("user"),
  80.                                 ps.getProperty("password"), ps.getProperty("driverClass"));
  81.                 log.info("configPlugin 配置Druid数据库连接池大小");
  82.                 dbPlugin.set(toInt(ps.getProperty("initialPoolSize")),
  83.                                 toInt(ps.getProperty("minPoolSize")),
  84.                                 toInt(ps.getProperty("maxPoolSize")));
  85.                 StatFilter filter=new StatFilter();//SQL 监听
  86.                 //http://IP:9090/umserver/druid/index.html
  87.                 dbPlugin.addFilter( filter);
  88.                
  89.                 log.info("configPlugin 配置ActiveRecord插件");
  90.                
  91.                 //end tanghxa
  92.                 me.add(dbPlugin);
  93.                
  94.                 ActiveRecordPlugin arp = new ActiveRecordPlugin(dbPlugin);
  95.                
  96.                 //begin tanghxa 2015-06-26
  97.                 boolean devMode=false;
  98.                 if(ps.getProperty("devMode").equals("true")){//配置文件增加配置,是否是开发模式
  99.                         devMode=true;
  100.                 }
  101.                 UMContext.getInstance().putValue("devMode",devMode);//把是否开发环境,放入全局变量
  102.                 arp.setDevMode(devMode); // 设置开发模式
  103.                 arp.setShowSql(devMode); // 是否显示SQL
  104.                 if (ps.getProperty("jdbcUrl").indexOf("postgresql") > -1) {
  105.                         log.info("configPlugin 使用数据库类型是 postgresql");
  106.                         arp.setDialect(new PostgreSqlDialect());
  107.                 }else if(ps.getProperty("jdbcUrl").indexOf("mysql") > -1) {
  108.                         log.info("configPlugin 使用数据库类型是 mysql");
  109.                         arp.setDialect(new MysqlDialect());
  110.                         arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));// 小写
  111.                 }else if(ps.getProperty("jdbcUrl").indexOf("oracle") > -1) {
  112.                         log.info("configPlugin 使用数据库类型是 oracle");
  113.                         dbPlugin.setValidationQuery("select 1 FROM DUAL");
  114.                         arp.setDialect(new OracleDialect());
  115.                         arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));// 配置属性名(字段名)大小写不敏感容器工厂
  116.                 }else{
  117.                         throw new RuntimeException("配置的jdbcUrl错误!");
  118.                 }

  119.                 // end tanghxa
  120.                 me.add(arp);
  121.                 // IPlugin daoPlugin = new JPAPlugin("design", null);
  122.                 // me.add(daoPlugin);
  123.         }

  124.         private void configUMModel() {
  125.                 // 获取所有的modelConfig.propeties文件,注意区分class和classLoader
  126.                 try {
  127.                         Enumeration<URL> urls = getClass().getClassLoader().getResources(
  128.                                         "modelConfig.properties");
  129.                         while (urls.hasMoreElements()) {
  130.                                 URL url = urls.nextElement();
  131.                                 Properties prop = new Properties();
  132.                                 prop.load(url.openStream());
  133.                                 String configClass = prop.getProperty("modelConfig");
  134.                                 if (configClass != null) {
  135.                                         UMModelConfig uc = (UMModelConfig) Class.forName(
  136.                                                         configClass.trim()).newInstance();
  137.                                         this.routes.add(uc.getRoutes());
  138.                                 }
  139.                         }
  140.                 } catch (InstantiationException e) {
  141.                         e.printStackTrace();
  142.                 } catch (IllegalAccessException e) {
  143.                         e.printStackTrace();
  144.                 } catch (ClassNotFoundException e) {
  145.                         e.printStackTrace();
  146.                 } catch (IOException e) {
  147.                         e.printStackTrace();
  148.                 }
  149.         }

  150.         private void initActionMapping() {
  151.                 actionMapping = new WebActionMapping(routes);
  152.                 actionMapping.buildActionMapping();
  153.                
  154.         }
  155.         

  156.         public WebAction getAction(String url, String[] urlPara) {
  157.                 return actionMapping.getAction(url, urlPara);
  158.         }
  159.         
  160.         public static void main(String[] args) {
  161.                 IServer server = null;
  162.                 if (args == null || args.length == 0) {
  163.                         server = ServerFactory.getServer();
  164.                         server.start();
  165.                 } else {
  166.                         String webAppDir = args[0];
  167.                         int port = Integer.parseInt(args[1]);
  168.                         String context = args[2];
  169.                         int scanIntervalSeconds = Integer.parseInt(args[3]);
  170.                         server = ServerFactory.getServer(webAppDir, port, context,
  171.                                         scanIntervalSeconds);
  172.                         server.start();
  173.                 }
  174.         }
  175.         private Integer toInt(String str) {
  176.                 return Integer.parseInt(str);
  177.         }
  178. }
复制代码

使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:11 | 显示全部楼层
本帖最后由 老V唐 于 2015-7-1 12:49 编辑

8 如何增加控制类,自定义URL?
答 我想写成/app/XXX结果搞不出来,看了web.xml 走Spring 过滤的  /* 改成/core/ 也不行 ,最后我只有去跟代码,发现可以这么去调用.然后我发现,居然全部的控制类都没做权限控制.,如果要做权限控制,后面讲,应该可以做一个全局拦截器.或者是集团做了某个拦截器,只是我在控制类那里没去注解,希望集团没把拦截器砍掉.
  1. http://192.168.1.9:9090/umserver/core?tp=none&data={"appcontext":{},"serviceid":"umCommonService"}&viewid=com.yonyou.gaojin.controller.TestUMController&actionname=index&jsonstr="{"name":"张三"}"
复制代码
data={"appcontext":{},"serviceid":"umCommonService"} 必须要有,可以就现在这样写死
viewid=com.yonyou.gaojin.controller.TestUMController 为控制类完全限定类名,必须继承 com.yonyou.um.webmvc.controller.UMController
actionname=index 为 控制类里的方法名
jsonstr="{"name":"张三"}" 是我自己传的测试json数据, 在index 方法里可以 String jsonstr=getPara("jsonstr"); 获取

最后吐槽一下,集团的这种封装搞得很不安全,类名方法名都出来了.
还不如在 JFinal 基础上加一个自动绑定路由的插件类,加2个注解,注解分别可注解在控制类和方法名上,
扫描代码,把继承UMController 类的 控制类扫描出来自动注入到路由器里,
至于集团预置的 des 加解密,完全可以用全局过滤器进行处理,APP上直接配置控制类上注解的路径+方法名|方法名上注解的路径  这样可以保证现基础上的功能封装,又能增强框架的灵活性,至少看到的可以是 /app/pay/abc/XXX 类似的 地址.
PS:通过修改源码,实现了真真意义的自定义URL ,但是意义不大.我以最小改动实现,但是,URL只能2层,Spring 那里配制成3层就不行了直接404.
还有就是没法返回XX.jsp 那么如果要返回一个页面而不是json 就只有用renderText并且全部的html元素都得自己用String 拼凑.这个更坑.
我放弃解决这个问题了,如果要真正意义上解决工作量太大了.要把Spring 换成自己建的Filter 还得去看是否有其他初始化的全局变量.
M5.jpg
M6.png M7.png

m8.png


使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:17 | 显示全部楼层
本帖最后由 老V唐 于 2015-6-30 00:19 编辑

9 如何查看APP提交了什么信息,出了什么异常?
答: 下图4的位置是提交的信息,如果有异常,那里也会显示.比如网络连接失败.

M4.png


使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:23 | 显示全部楼层
本帖最后由 老V唐 于 2015-7-5 23:00 编辑

10 根据appid和serviceid 调用服务端接口
答:/core?data=XXX 这个JSON 字符串 data 里面 server_type 不为空的时候,会根据 appid和serviceid实例化一个handler类,然后调用,但是不知道这个配置文件的格式是什么.找集团帮助ing
  1. http://192.168.1.9:9090/umserver/core?tp=none&data={"appcontext":{appid:"gaojin"},"serviceid":"testService",server_type:"sso",servicecontext:{}}
复制代码
appid:"gaojin" 是文件夹名称 例如 MOB\ump_server\configure\gaojin
serviceid:"testService" 服务ID 配置路径 MOB\ump_server\configure\gaojin\service.xml
server_type:"sso" 不为空字符即可.可以用来划分调用者是谁第三方哪个系统.
servicecontext:{} 写死即可,不写会空指针,集团的东西你懂的.,你也可以把传递的数据约定第三方就放servicecontext 里面.

具体的 service.xml 和 provider.xml 怎么配置还等集团确定,目前跟代码,发现,现在Spriing 实例化的时候,失败了,提示找不到 服务ID.



M9.png m10.png






使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:30 | 显示全部楼层
本帖最后由 老V唐 于 2015-7-5 23:25 编辑

11 昨天还能启动,第二天就不能启动了?
答:
1.检查是否连接了网络,或DHCP未分配IP .
2.检查IP和昨天相比是否变化了;


12 不能访问数据库,表现为访问数据库就异常?
答: 确定数据库 驱动 地址 用户密码 都正确的情况下,任然一访问数据库就异常,
则检查
  1. ump_server\config\dbConfig.properties
复制代码
是否是把jdbcUrl 配置到了第一行,在某些未知情况下,会读取不到第一行,有人说是因为文件格式是 UTF8+BOM 的原因,此处不去深究它就当做
  1. java.util.Properties
复制代码
的一个BUG,所以只需要用# 号注释掉第一行,让有效的配置从第二行开始即可.


使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:37 | 显示全部楼层
本帖最后由 老V唐 于 2015-8-26 20:20 编辑

13 如何更方便的使用Redis?
答:整理ing




使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:45 | 显示全部楼层
本帖最后由 老V唐 于 2015-8-26 20:20 编辑

14 如何用浏览器直接调试接口?
答:
  1. 192.168.9.194:9090/umserver/core?tp=none&data={"appcontext":{},"serviceid":"umCommonService","servicecontext":{"viewid":"控制类完全限定类名","actionname":"方法名","params":{"参数KEY":"参数值","参数KEY2":"参数值2"}}}
复制代码





使用道具 举报

回复

老V唐的头像 楼主
发表于 2015-6-26 21:59:54 | 显示全部楼层
占楼回复8
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部