本文将通过一个小例子来完整的说明以上几个接口的使用方法:
首先说功能~很简单的就是我们现在打开决策平台要全屏一共有两个步骤,1.打开模板,2点击全屏,我们要教学的用的小例子就是把这两个功能合并为1步。
1.因为要改前端的交互,那肯定要先引入JS。
FR引入JS的接口很多,今天我们要说的是一个综合型接口PlateProvider
废话不多说上代码,一看就懂
- package com.midas.plugin.fullscreen.pub;
- import com.fr.fs.FSPlate;
- import com.fr.fs.fun.impl.AbstractPlateProvider;
- import com.midas.plugin.fullscreen.core.FullScreenPlate;
- public class FullScreenPlateProvider extends AbstractPlateProvider {
- @Override
- public Class<? extends FSPlate> classForPlate() {
- return FullScreenPlate.class;
- }
- @Override
- public String mark() {
- return "全屏";
- }
- }
复制代码 两个方法,classForPlate显而易见的就是返回我们一个平台模块对象的类,mark就是一个标记~随便写一个就可以。
纳尼~这里并没有我们引入JS的地方呀~往下看~就是我们的第二个类---FullScreenPlate 平台模块对象
- package com.midas.plugin.fullscreen.core;
- import com.fr.fs.DefaultPlate;
- import com.fr.stable.fun.Service;
- public class FullScreenPlate extends DefaultPlate {
-
- @Override
- public String[] getPlateJavaScriptFiles4WebClient() {
- return new String[]{
- "/com/midas/plugin/fullscreen/web/js/fs.fullscreen.js"
- };
- }
-
- @Override
- public Service[] service4Register() {
- return new Service[]{
- new FullscreenService()
- };
- }
- }
复制代码 看到没,这里我们仅仅用了这个接口的两功能,一个是引入JS一个是引入service,这个接口还可以引入css 国际化文件,数据库表等等等等。。。。有兴趣的可以自己翻看FR的JAVA文档~不清楚的可以加我的Q群问我(不加好友了,好友列表满了)
那么我们的JS如何实现两步并一步呢?有兴趣的同学可以翻看FR的JS文档查看相关的js源码~这里我直接贴结果了fs.fullscreen.js- ;$(function() {
- $.extend(FS,{
- loadContentByEntry: function (entry) {
- var conf = FS.Trans.ajax({url:FR.servletURL+"?op=fullscreen&cmd=load"});
- if( conf.success && conf.nodes.indexOf(entry.text)!=-1 ){
- var tabPane = this.tabPane;
- if (!tabPane.isExpanded()) {
- tabPane.setExpand(true);
- }
- tabPane._displayFullScreen(true,$('.fs-tab-menu-options>.nav-btn:lt(1)'));
- tabPane._expandMenu(false);
- }
- this.tabPane.addItem(entry);
- }
- });
- });
复制代码 这个JS里面可能我们最疑惑的就是ajax了~这个ajax如果是所有节点都直接点击全屏的话是不需要的,这里我流了一个控制就是我们可以自己配置哪些节点点击时需要全屏哪些不需要。这里就回到我们上面接口引入的service了
- package com.midas.plugin.fullscreen.core;
- import java.io.PrintWriter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.fr.fs.web.service.ServiceUtils;
- import com.fr.json.JSONObject;
- import com.fr.privilege.PrivilegeManager;
- import com.fr.stable.fun.impl.NoSessionIDService;
- import com.fr.web.core.ActionNoSessionCMD;
- import com.fr.web.core.WebActionsDispatcher;
- import com.fr.web.utils.WebUtils;
- import com.midas.plugin.fullscreen.core.action.*;
- public class FullscreenService extends NoSessionIDService {
- @Override
- public String actionOP() {
- return "fullscreen";
- }
-
- private ActionNoSessionCMD[] actions = {
- new LoadFullscreen(),
- new SetFullscreen()
- };
- @Override
- public void process(HttpServletRequest req, HttpServletResponse res, String op) throws Exception {
- WebActionsDispatcher.dealForActionNoSessionIDCMD(req, res, actions);
- }
-
- public static boolean isRootManager(HttpServletRequest req){
- String crtname = ServiceUtils.getCurrentUserName(req);
- String rootname = PrivilegeManager.getProviderInstance().getRootManagerName();
- return rootname.equals(crtname);
- }
-
- public static void printMessage( HttpServletResponse res, JSONObject message ) throws Exception {
- PrintWriter writer = WebUtils.createPrintWriter(res);
- writer.print(message.toString());
- writer.flush();
- writer.close();
- }
- }
复制代码 这个服务没啥特别的代码很简单,我们主要看这个服务提供了两个action~看名字就知道一个是读一个是写,就是读取和保存哪些节点需要一步全屏的,我们分别看两个类
- package com.midas.plugin.fullscreen.core.action;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.fr.json.JSONObject;
- import com.fr.web.core.ActionNoSessionCMD;
- import com.midas.plugin.fullscreen.core.FullscreenService;
- import com.midas.plugin.fullscreen.core.NodeManager;
- public class LoadFullscreen extends ActionNoSessionCMD {
- @Override
- public String getCMD() {
- return "load";
- }
-
- @Override
- public void actionCMD(HttpServletRequest req, HttpServletResponse res) throws Exception {
- JSONObject msg = NodeManager.getInstance().load();
- FullscreenService.printMessage(res, msg);
- }
- }
复制代码- package com.midas.plugin.fullscreen.core.action;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.fr.json.JSONObject;
- import com.fr.web.core.ActionNoSessionCMD;
- import com.fr.web.utils.WebUtils;
- import com.midas.plugin.fullscreen.core.FullscreenService;
- import com.midas.plugin.fullscreen.core.NodeManager;
- public class SetFullscreen extends ActionNoSessionCMD {
- @Override
- public String getCMD() {
- return "set";
- }
-
- @Override
- public void actionCMD(HttpServletRequest req, HttpServletResponse res) throws Exception {
- if(!FullscreenService.isRootManager(req)){
- FullscreenService.printMessage(res, JSONObject.create().put("success", false).put("msg", "没有权限"));
- return;
- }
- JSONObject msg = NodeManager.getInstance().save(WebUtils.getHTTPRequestParameter(req, "conf"));
- FullscreenService.printMessage(res, msg);
- }
-
- }
复制代码 是不是很简单,就是基本的request操作和用户判断,具体的读写我们又用了一个管理类来操作,这就是最后一个接口XML的引入和读写了XMLFileManager
个人习惯,我在FR的XMLFileManager上封装了一层AbstractXMLFileManager
- package com.midas.plugin.fullscreen.core;
- import java.io.IOException;
- import java.io.OutputStream;
- import com.fr.file.XMLFileManager;
- import com.fr.general.EnvProvider;
- import com.fr.general.FRLogger;
- import com.fr.general.GeneralContext;
- import com.fr.stable.project.ProjectConstants;
- import com.fr.stable.xml.XMLTools;
- public abstract class AbstractXMLFileManager extends XMLFileManager {
-
- private static final long serialVersionUID = 487717556956534807L;
- public synchronized boolean writeXMLFile() {
- OutputStream out = getResourceOutputStream(this.fileName());
- if (out != null) {
- try {
- XMLTools.writeOutputStreamXML(this, out);
- } catch (Exception e) {
- FRLogger.getLogger().error(e.getMessage(), e);
- return false;
- } finally {
- try {
- out.close();
- } catch (IOException e) {
- FRLogger.getLogger().error(e.getMessage(), e);
- }
- }
- return true;
- } else {
- return false;
- }
- }
-
- private OutputStream getResourceOutputStream(String resourceName) {
- EnvProvider currentEnv = GeneralContext.getEnvProvider();
- if (currentEnv != null) {
- try {
- OutputStream out = currentEnv.writeBean(resourceName, ProjectConstants.RESOURCES_NAME);
- return out;
- } catch (Exception e) {
- }
- }
- return null;
- }
- }
复制代码 然后看实例
- package com.midas.plugin.fullscreen.core;
- import com.fr.general.xml.GeneralXMLTools;
- import com.fr.json.JSONArray;
- import com.fr.json.JSONObject;
- import com.fr.stable.EncodeConstants;
- import com.fr.stable.xml.XMLPrintWriter;
- import com.fr.stable.xml.XMLableReader;
- public class NodeManager extends AbstractXMLFileManager {
-
- private JSONArray nodes = JSONArray.create();
-
- public JSONObject save(String conf){
- JSONObject rt = JSONObject.create();
- try{
- JSONObject jcf = new JSONObject(conf);
-
- JSONArray removes = jcf.optJSONArray("remove");
- for( int i=0, len=removes.length(); i<len; i++ ) {
- remove(removes.optString(i));
- }
-
- JSONArray adds = jcf.optJSONArray("add");
- for( int i=0, len=adds.length(); i<len; i++ ) {
- add(adds.optString(i));
- }
- writeXMLFile();
- rt.put("success", true);
- }catch(Exception e){
- try{
- rt.put("success", false);
- }catch(Exception e1){
-
- }
- }
- return rt;
- }
-
- public JSONObject load(){
- JSONObject rt = JSONObject.create();
- try{
- rt.put("nodes", nodes);
- rt.put("success", true);
- }catch(Exception e){
- try{
- rt.put("success", false);
- }catch(Exception e1){
-
- }
- }
- return rt;
- }
-
-
- private boolean have(String node){
- for( int i=0, len=nodes.length(); i<len; i++ ) {
- if(nodes.optString(i).equals(node)){
- return true;
- }
- }
- return false;
- }
-
- private void remove(String node){
- for( int i=0, len=nodes.length(); i<len; i++ ) {
- if(nodes.optString(i).equals(node)){
- nodes.remove(i);
- break;
- }
- }
- }
-
- private void add(String node){
- if(!have(node)){
- nodes.put(node);
- }
- }
-
- private static final long serialVersionUID = 4685641344004987584L;
-
-
-
- private static NodeManager SE = null;
-
- private NodeManager(){
- readXMLFile();
- }
-
- public synchronized static NodeManager getInstance(){
- if(null == SE){
- SE = new NodeManager();
- }
- return SE;
- }
-
- @Override
- public String fileName() {
- return "fsnode.xml";
- }
- @Override
- public void writeXML(XMLPrintWriter writer) {
- writer.startTAG("Nodes");
- try{
- GeneralXMLTools.writeByteArray(writer, nodes.toString().getBytes(EncodeConstants.ENCODING_UTF_8));
- }catch(Exception e){
-
- }
- writer.end();
- }
- @Override
- public void readXML(XMLableReader reader) {
- String tagname = reader.getTagName();
- if("Nodes".equals( tagname )){
- try{
- String value = new String(GeneralXMLTools.readByteArray(reader), EncodeConstants.ENCODING_UTF_8);
- nodes = new JSONArray(value);
- }catch(Exception e){
- nodes = JSONArray.create();
- }
- }
- }
- }
复制代码 这个类代码稍微长一点点~但是其实都是最基础打JAVA代码~我相信你一定能看懂的~我们通过load和save来装载和保存数据~通过read和write来实际从文件中读写数据
OK了~全部代码就这么一点点~
看看效果~
登陆管理员后通过这个请求就可以设置哪些节点需要一步到位了【界面懒得做,有这个请求你随便自己写个html或者做个模板之类的都可以搞定,当然也可以用上面的平台模块在管理系统里面加一个界面出来配置,这个就当留给大家思考的问题了】
额~效果比较简单~将就看看吧~
功能虽然出来了~但是其实因为仅仅是demo型的教学~所以我们很多设计是不合理的~大家可以下来自行思考和优化~
针对一步全屏这个功能~有的同学可能会说:我不会JAVA怎么办~纯JS其实也是可以的~不过方法需要大家自己去思考了~不想再写了~如果实在想不出来又想知道方法的~Q群找我~
PS:写个demo半个小时~写个帖子两个多小时~看来我不适合写这种东西~
|