FR接口综合教学篇 -【平台接口,服务接口,XML文件接口,平台JS引入】

楼主
我是社区第55902位番薯,欢迎点我头像关注我哦~
本文将通过一个小例子来完整的说明以上几个接口的使用方法:

首先说功能~很简单的就是我们现在打开决策平台要全屏一共有两个步骤,1.打开模板,2点击全屏,我们要教学的用的小例子就是把这两个功能合并为1步。

1.因为要改前端的交互,那肯定要先引入JS。
FR引入JS的接口很多,今天我们要说的是一个综合型接口PlateProvider
废话不多说上代码,一看就懂
  1. package com.midas.plugin.fullscreen.pub;

  2. import com.fr.fs.FSPlate;
  3. import com.fr.fs.fun.impl.AbstractPlateProvider;
  4. import com.midas.plugin.fullscreen.core.FullScreenPlate;

  5. public class FullScreenPlateProvider extends AbstractPlateProvider {

  6.         @Override
  7.         public Class<? extends FSPlate> classForPlate() {
  8.                 return FullScreenPlate.class;
  9.         }

  10.         @Override
  11.         public String mark() {
  12.                 return "全屏";
  13.         }

  14. }
复制代码
两个方法,classForPlate显而易见的就是返回我们一个平台模块对象的类,mark就是一个标记~随便写一个就可以。
纳尼~这里并没有我们引入JS的地方呀~往下看~就是我们的第二个类---FullScreenPlate 平台模块对象
  1. package com.midas.plugin.fullscreen.core;

  2. import com.fr.fs.DefaultPlate;
  3. import com.fr.stable.fun.Service;

  4. public class FullScreenPlate extends DefaultPlate {
  5.         
  6.         @Override
  7.         public String[] getPlateJavaScriptFiles4WebClient() {
  8.         return new String[]{
  9.                 "/com/midas/plugin/fullscreen/web/js/fs.fullscreen.js"
  10.         };
  11.     }
  12.         
  13.         @Override
  14.         public Service[] service4Register() {
  15.                 return new Service[]{
  16.                         new FullscreenService()        
  17.                 };
  18.         }
  19. }
复制代码
看到没,这里我们仅仅用了这个接口的两功能,一个是引入JS一个是引入service,这个接口还可以引入css 国际化文件,数据库表等等等等。。。。有兴趣的可以自己翻看FR的JAVA文档~不清楚的可以加我的Q群问我(不加好友了,好友列表满了)
那么我们的JS如何实现两步并一步呢?有兴趣的同学可以翻看FR的JS文档查看相关的js源码~这里我直接贴结果了fs.fullscreen.js
  1. ;$(function() {
  2.         $.extend(FS,{
  3.                 loadContentByEntry: function (entry) {
  4.                         var conf = FS.Trans.ajax({url:FR.servletURL+"?op=fullscreen&cmd=load"});
  5.                         if( conf.success && conf.nodes.indexOf(entry.text)!=-1 ){
  6.                                 var tabPane = this.tabPane;
  7.                                 if (!tabPane.isExpanded()) {
  8.                                         tabPane.setExpand(true);
  9.                     }
  10.                                 tabPane._displayFullScreen(true,$('.fs-tab-menu-options>.nav-btn:lt(1)'));
  11.                                 tabPane._expandMenu(false);
  12.                         }
  13.                 this.tabPane.addItem(entry);
  14.             }
  15.         });
  16. });
复制代码
这个JS里面可能我们最疑惑的就是ajax了~这个ajax如果是所有节点都直接点击全屏的话是不需要的,这里我流了一个控制就是我们可以自己配置哪些节点点击时需要全屏哪些不需要。这里就回到我们上面接口引入的service了
  1. package com.midas.plugin.fullscreen.core;

  2. import java.io.PrintWriter;

  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;

  5. import com.fr.fs.web.service.ServiceUtils;
  6. import com.fr.json.JSONObject;
  7. import com.fr.privilege.PrivilegeManager;
  8. import com.fr.stable.fun.impl.NoSessionIDService;
  9. import com.fr.web.core.ActionNoSessionCMD;
  10. import com.fr.web.core.WebActionsDispatcher;
  11. import com.fr.web.utils.WebUtils;
  12. import com.midas.plugin.fullscreen.core.action.*;

  13. public class FullscreenService extends NoSessionIDService {

  14.         @Override
  15.         public String actionOP() {
  16.                 return "fullscreen";
  17.         }
  18.         
  19.         private ActionNoSessionCMD[] actions = {
  20.                 new LoadFullscreen(),
  21.                 new SetFullscreen()
  22.         };

  23.         @Override
  24.         public void process(HttpServletRequest req, HttpServletResponse res, String op) throws Exception {
  25.                 WebActionsDispatcher.dealForActionNoSessionIDCMD(req, res, actions);
  26.         }
  27.         
  28.         public static boolean isRootManager(HttpServletRequest req){
  29.             String crtname = ServiceUtils.getCurrentUserName(req);
  30.         String rootname = PrivilegeManager.getProviderInstance().getRootManagerName();
  31.             return rootname.equals(crtname);
  32.     }
  33.         
  34.         public static void printMessage( HttpServletResponse res, JSONObject message ) throws Exception {
  35.                 PrintWriter writer = WebUtils.createPrintWriter(res);
  36.                 writer.print(message.toString());
  37.         writer.flush();
  38.         writer.close();
  39.         }

  40. }
复制代码
这个服务没啥特别的代码很简单,我们主要看这个服务提供了两个action~看名字就知道一个是读一个是写,就是读取和保存哪些节点需要一步全屏的,我们分别看两个类
  1. package com.midas.plugin.fullscreen.core.action;

  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;

  4. import com.fr.json.JSONObject;
  5. import com.fr.web.core.ActionNoSessionCMD;
  6. import com.midas.plugin.fullscreen.core.FullscreenService;
  7. import com.midas.plugin.fullscreen.core.NodeManager;

  8. public class LoadFullscreen extends ActionNoSessionCMD {

  9.         @Override
  10.         public String getCMD() {
  11.                 return "load";
  12.         }
  13.         
  14.         @Override
  15.         public void actionCMD(HttpServletRequest req, HttpServletResponse res) throws Exception {
  16.                 JSONObject msg = NodeManager.getInstance().load();
  17.                 FullscreenService.printMessage(res, msg);
  18.         }

  19. }
复制代码
  1. package com.midas.plugin.fullscreen.core.action;

  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;

  4. import com.fr.json.JSONObject;
  5. import com.fr.web.core.ActionNoSessionCMD;
  6. import com.fr.web.utils.WebUtils;
  7. import com.midas.plugin.fullscreen.core.FullscreenService;
  8. import com.midas.plugin.fullscreen.core.NodeManager;

  9. public class SetFullscreen extends ActionNoSessionCMD {

  10.         @Override
  11.         public String getCMD() {
  12.                 return "set";
  13.         }
  14.         
  15.         @Override
  16.         public void actionCMD(HttpServletRequest req, HttpServletResponse res) throws Exception {
  17.                 if(!FullscreenService.isRootManager(req)){
  18.                         FullscreenService.printMessage(res, JSONObject.create().put("success", false).put("msg", "没有权限"));
  19.                         return;
  20.                 }
  21.                 JSONObject msg = NodeManager.getInstance().save(WebUtils.getHTTPRequestParameter(req, "conf"));
  22.                 FullscreenService.printMessage(res, msg);
  23.         }
  24.         
  25. }
复制代码
是不是很简单,就是基本的request操作和用户判断,具体的读写我们又用了一个管理类来操作,这就是最后一个接口XML的引入和读写了XMLFileManager
个人习惯,我在FR的XMLFileManager上封装了一层AbstractXMLFileManager
  1. package com.midas.plugin.fullscreen.core;

  2. import java.io.IOException;
  3. import java.io.OutputStream;

  4. import com.fr.file.XMLFileManager;
  5. import com.fr.general.EnvProvider;
  6. import com.fr.general.FRLogger;
  7. import com.fr.general.GeneralContext;
  8. import com.fr.stable.project.ProjectConstants;
  9. import com.fr.stable.xml.XMLTools;

  10. public abstract class AbstractXMLFileManager extends XMLFileManager {
  11.         
  12.         private static final long serialVersionUID = 487717556956534807L;

  13.         public synchronized boolean writeXMLFile() {
  14.                 OutputStream out = getResourceOutputStream(this.fileName());
  15.         if (out != null) {
  16.             try {
  17.                 XMLTools.writeOutputStreamXML(this, out);
  18.             } catch (Exception e) {
  19.                 FRLogger.getLogger().error(e.getMessage(), e);
  20.                 return false;
  21.             } finally {
  22.                 try {
  23.                         out.close();
  24.                 } catch (IOException e) {
  25.                     FRLogger.getLogger().error(e.getMessage(), e);
  26.                 }
  27.             }
  28.             return true;
  29.         } else {
  30.             return false;
  31.         }
  32.     }
  33.         
  34.         private OutputStream getResourceOutputStream(String resourceName) {
  35.         EnvProvider currentEnv = GeneralContext.getEnvProvider();
  36.         if (currentEnv != null) {
  37.             try {
  38.                     OutputStream out = currentEnv.writeBean(resourceName, ProjectConstants.RESOURCES_NAME);
  39.                 return out;
  40.             } catch (Exception e) {
  41.             }
  42.         }
  43.         return null;
  44.     }


  45. }
复制代码
然后看实例
  1. package com.midas.plugin.fullscreen.core;

  2. import com.fr.general.xml.GeneralXMLTools;
  3. import com.fr.json.JSONArray;
  4. import com.fr.json.JSONObject;
  5. import com.fr.stable.EncodeConstants;
  6. import com.fr.stable.xml.XMLPrintWriter;
  7. import com.fr.stable.xml.XMLableReader;

  8. public class NodeManager extends AbstractXMLFileManager {
  9.         
  10.         private JSONArray nodes = JSONArray.create();
  11.         
  12.         public JSONObject save(String conf){
  13.                 JSONObject rt = JSONObject.create();
  14.                 try{
  15.                         JSONObject jcf = new JSONObject(conf);
  16.                         
  17.                         JSONArray removes = jcf.optJSONArray("remove");
  18.                         for( int i=0, len=removes.length(); i<len; i++ ) {
  19.                                 remove(removes.optString(i));
  20.                         }
  21.                         
  22.                         JSONArray adds = jcf.optJSONArray("add");
  23.                         for( int i=0, len=adds.length(); i<len; i++ ) {
  24.                                 add(adds.optString(i));
  25.                         }
  26.                         writeXMLFile();
  27.                         rt.put("success", true);
  28.                 }catch(Exception e){
  29.                         try{
  30.                                 rt.put("success", false);
  31.                         }catch(Exception e1){
  32.                                 
  33.                         }
  34.                 }
  35.                 return rt;
  36.         }
  37.         
  38.         public JSONObject load(){
  39.                 JSONObject rt = JSONObject.create();
  40.                 try{
  41.                         rt.put("nodes", nodes);
  42.                         rt.put("success", true);
  43.                 }catch(Exception e){
  44.                         try{
  45.                                 rt.put("success", false);
  46.                         }catch(Exception e1){
  47.                                 
  48.                         }
  49.                 }
  50.                 return rt;
  51.         }
  52.         
  53.         
  54.         private boolean have(String node){
  55.                 for( int i=0, len=nodes.length(); i<len; i++ ) {
  56.                         if(nodes.optString(i).equals(node)){
  57.                                 return true;
  58.                         }
  59.                 }
  60.                 return false;
  61.         }
  62.         
  63.         private void remove(String node){
  64.                 for( int i=0, len=nodes.length(); i<len; i++ ) {
  65.                         if(nodes.optString(i).equals(node)){
  66.                                 nodes.remove(i);
  67.                                 break;
  68.                         }
  69.                 }
  70.         }
  71.         
  72.         private void add(String node){
  73.                 if(!have(node)){
  74.                         nodes.put(node);
  75.                 }
  76.         }
  77.         

  78.         private static final long serialVersionUID = 4685641344004987584L;
  79.         
  80.         
  81.         
  82.         private static NodeManager SE = null;
  83.         
  84.         private NodeManager(){
  85.                 readXMLFile();
  86.         }
  87.         
  88.         public synchronized static NodeManager getInstance(){
  89.                 if(null == SE){
  90.                         SE = new NodeManager();
  91.                 }
  92.                 return SE;
  93.         }
  94.         
  95.         @Override
  96.         public String fileName() {
  97.                 return "fsnode.xml";
  98.         }

  99.         @Override
  100.         public void writeXML(XMLPrintWriter writer) {
  101.                 writer.startTAG("Nodes");
  102.                 try{
  103.                         GeneralXMLTools.writeByteArray(writer, nodes.toString().getBytes(EncodeConstants.ENCODING_UTF_8));
  104.                 }catch(Exception e){
  105.                         
  106.                 }
  107.                 writer.end();
  108.         }

  109.         @Override
  110.         public void readXML(XMLableReader reader) {
  111.                 String tagname = reader.getTagName();
  112.                 if("Nodes".equals( tagname )){
  113.                         try{
  114.                                 String value = new String(GeneralXMLTools.readByteArray(reader), EncodeConstants.ENCODING_UTF_8);
  115.                                 nodes = new JSONArray(value);
  116.                         }catch(Exception e){
  117.                                 nodes = JSONArray.create();
  118.                         }
  119.                 }
  120.         }

  121. }
复制代码
这个类代码稍微长一点点~但是其实都是最基础打JAVA代码~我相信你一定能看懂的~我们通过load和save来装载和保存数据~通过read和write来实际从文件中读写数据
OK了~全部代码就这么一点点~
看看效果~

登陆管理员后通过这个请求就可以设置哪些节点需要一步到位了【界面懒得做,有这个请求你随便自己写个html或者做个模板之类的都可以搞定,当然也可以用上面的平台模块在管理系统里面加一个界面出来配置,这个就当留给大家思考的问题了】

额~效果比较简单~将就看看吧~
功能虽然出来了~但是其实因为仅仅是demo型的教学~所以我们很多设计是不合理的~大家可以下来自行思考和优化~

针对一步全屏这个功能~有的同学可能会说:我不会JAVA怎么办~纯JS其实也是可以的~不过方法需要大家自己去思考了~不想再写了~如果实在想不出来又想知道方法的~Q群找我~
PS:写个demo半个小时~写个帖子两个多小时~看来我不适合写这种东西~











分享扩散:
参与人数 +1 F豆 +666 理由
星痕 + 666 师傅,太厉害了

查看全部评分

沙发
发表于 2018-3-29 21:31:01
来自手机
师傅好厉害
板凳
发表于 2018-3-29 21:32:22
地板
发表于 2018-3-29 21:49:53
看了也不会系列
5楼
发表于 2018-3-29 22:29:51

这么直白的代码~
6楼
发表于 2018-3-30 08:33:39
一脸懵逼的进来,一脸懵逼的离开
7楼
发表于 2018-3-30 08:38:43
一脸懵逼的进来,一脸懵逼的离开
8楼
发表于 2018-3-30 08:44:50
高手高手
9楼
发表于 2018-3-30 08:46:42
66666
10楼
发表于 2018-3-30 09:38:15
11楼
发表于 2018-3-30 09:39:24
yiminglian 发表于 2018-3-30 08:33
一脸懵逼的进来,一脸懵逼的离开

说是不是懒
12楼
发表于 2018-3-30 09:39:31
grateful-fr 发表于 2018-3-30 08:38
一脸懵逼的进来,一脸懵逼的离开

说是不是懒
13楼
发表于 2018-3-30 09:41:36

我的java知识都喂猪了
14楼
发表于 2018-3-30 13:56:01
别看在外行眼中看起来像是十分复杂的样子,在我们专业的人看来也是一脸懵逼
15楼
发表于 2018-3-30 13:59:12
deafire 发表于 2018-3-30 13:56
别看在外行眼中看起来像是十分复杂的样子,在我们专业的人看来也是一脸懵逼

16楼
发表于 2018-3-31 14:03:40
迈神出手了。。。。
17楼
发表于 2018-3-31 14:04:06
yiminglian 发表于 2018-3-30 09:41
我的java知识都喂猪了

你可以把猪吃了。报复回来
18楼
发表于 2018-4-2 12:57:59
mark一下。回头再看。
19楼
发表于 2018-4-11 10:50:46
厉害了
20楼
发表于 2018-4-19 20:52:19
来自手机
看完脑子里只有看不懂的代码和迈神“一看就懂”“这个服务没啥特别的代码很简单”这种言语造成的暴击伤害
21楼
发表于 2018-5-2 00:21:24
好強,謝謝分享
22楼
发表于 2019-4-1 13:37:43
高手,虽然看不大懂
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

21回帖数 1关注人数 13847浏览人数
最后回复于:2019-4-1 13:37

返回顶部 返回列表