作者: kukey-admin

  • jsp学习

    设置cookie:

    https://www.cnblogs.com/binwine/p/14319818.html

     

    同时设置客户端和服务端的编码格式:

    response.setContentType(“text/html;charset=utf-8”);

     

    设置服务端的编码格式:

    response.setCharacterEncoding(“UTF-8”);

    设置客户端的编码格式和响应的MIME类型:

    response.setHeader(“Content-type”, “text/html;charset=UTF-8”);

    https://www.cnblogs.com/sevents/articles/15708945.html

     

     

    JSP(全称:Java Server Page)

    idea编译器jsp环境配置,需要先安装jdk和tomcat,并配置jdk和tomcat的环境变量,然后再去idea新建jsp项目

    (你的tomcat最好没有配置过其他的项目,若配置过其他项目,就整一个新的tomcat,把环境变量配置成新的tomcat路径。不干净的tomcat可能会导致idea的jsp项目运行之后,不会自动跳转到浏览器)

    https://blog.csdn.net/llplllll/article/details/116903198

    https://www.likecs.com/show-203515634.html

    idea 2020 如何创建jsp项目?

    https://blog.csdn.net/weixin_44797182/article/details/124745744

    新创建的jsp文件防止乱码?

    https://blog.csdn.net/hb1993/article/details/122837790

    JSP++IDEA+Servlet+Tomcat应用开发,Servlet全解与案例实战

    https://www.bilibili.com/video/BV18b4y1Z7qA

    jsp 引入vue

    https://blog.csdn.net/chenlim87/article/details/109629076

     

     

    三类脚本元素

    脚本标签(可定义局部变量、编写语句等) <% java source code %>

    表达式标签 <%= statement %>

    声明标签(全局变量、方法、类等) <%! field or method declaration %>

     

    普通脚本可以使用所有java语法,除了定义函数。

    脚本与脚本之间不可嵌套,脚本与html标签不可嵌套。

    声明脚本声明的变量是全局变量。

    声明脚本的内容必须在普通脚本<% %>中调用。

    如果声明脚本中的函数具有返回值,使用输出脚本调用<%= %>。

    输出脚本可以输出带有返回值的函数

    输出脚本中不能加;

     

    jsp注释(注释内容不会被发送至浏览器甚至不会被编译)

    <%– 注释 –%>

    html注释(通过浏览器查看网页源代码可以看见注释内容)

    <!– 注释 –>

     

    jsp指令

    用来设置与整个jsp页面相关的属性。

    <%@page…%> 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等

    <%@include…%> 包含其他文件

    <%@taglib…%> 引入标签库的定义,可以是自定义标签

    属性及描述

    https://blog.csdn.net/pengmm1990/article/details/63684965

    page指令语法:

    <%page attribute1=”value1″ attribute2=”value2″%>

    page指令为容器提供当前页面的使用说明。一个jsp页面可以包含多个page指令。

    <%@include file=”要包含的文件路径(相对路径)” %>

    例如

    静态包含

    <%@include file=”include.jsp” %>

    <%@include file=”include.html” %>

    静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在servlet引擎转译时,就把此文
    件内容包含了进去(两个文件的源代码整合到一起,全部放到jspService方法中),所以只生成了一个servlet,
    所以两个页面不能有同名的变量。运行效率高一点点。耦合性较高,不够灵活。

    动态包含

    <jsp:include page=”04-herder.jsp”><jsp:include>

    <jsp:include page=”05-footer.jsp”><jsp:include>

    特点:

    1.动态包含相当于方法的调用

    2.动态包含会生成多个源码文件

    3.可以定义同名变量

    4.效率高,耦合度高

    注:

    当动态包含不需要传递参数时,include双标签之间不要有任何内容,包含换行和空格。

    使用动态包含传递参数

    <jsp:include page=”要包含的页面路径”>

    注:page不能为空,否则报错

     

    <jsp:param name=”参数名” value=”参数值”/><jsp:include>

    注:name属性不支持表达式,value属性支持表达式

    获取参数:

    request.getParameter(name);通过指定参数名获取参数值

     

     

    jsp隐式对象

     

     

    jsp四大作用域

    page 表示在当前作用于有效

    request 表示在一次请求中有效

    session 表示在一次会话中有效

    application 表示在整个应用程序中有效

     

    jsp EL表达式

    可以操作域对象,获取域对象的值

     

    JSTL

    常用标签

    if标签

    choose、when和otherwise标签

    forEach标签

    foramtDate标签

  • fr-js

    js插入行

    var id = $("td[id^=A]:last").attr("id");
    //获取A列最后一行的单元格编号
    //id^=A代表A列,last代表最后一行
    _g().appendReportRC(1, id);
    //插入1行

     

    自由调整单元格插件调整顺序后按照调整后的序号入库,需要在填报Web属性里设置加载结束事件

    //const tableBody = document.querySelector('.rows-height-counter')
    
    const tableBody = document.querySelector('#frozen-center>.x-table>tbody');
    new Sortable(tableBody, {
    	sort: true,
         animation: 150,
         onEnd: function (evt) {
          			console.log(evt);
                        var itemEl = evt.item; 
                        evt.to;    
                        evt.from;  
                        evt.oldIndex;  
                        evt.newIndex;  
                        evt.clone 
                        evt.pullMode;  
    var $tds =$('.x-table td[col=1][idx=0]:visible:not([fmt="T"])');
    //获取第1列中可见的序号单元格(A列) 
    var n = 0;
    $tds.each(function(i, e) {
    	n = n + 1;
    	var row = $(e).attr("row");
    	//获取行号
    	_g().setCellValue(0, 1, row, n);
    	//将当前编号重新设置
    //	需要将td[col=1]和_g().setCellValue(0, 1, row, n)中的1对应,两个数字需要相同。对应单元格的索引,填报单元格索引从0开始
    })
                                        }
       
    });

     

     

    普通报表-填报预览-获取控件单元格所在位置

    var city=contentPane.getWidgetByName("txt3").options.location;
    alert(city);
    返回值:A5

     

    设置uuid为主键,智能提交,在uuid那一列上,加条件属性:如果当前值($$$)的长度为0,则生成一个uuid,否则就是当前值($$$)。

     

    获取数据集P_S_FMEA_DETAIL_V与B3单元格对应的字段TASKID所对应的值

    value('P_S_FMEA_DETAIL_V', 'TASKID', B3);
    /**
    * 发起流程
    * accountid VALUE('SYS_BPMUSER',1,2,$fine_username)
    * fabid $doc_fab
    * versionnum $doc_version
    * txt1 'http://crm-finereport.crmicro.com/webroot/decision/view/report?viewlet=TEST%252F1.frm'
    * fmeadomian $fmeadomain
    */
    let sid;
    var accountid = accountid.toString();
    try {
    // 获取frm里网页框里的cpt的单元格的值
    sid = top.document.getElementsByName('RHIFRAME0')[0].contentWindow._g().getCellValue(0, 1, 0)
    }
    catch {
    sid = $(".bi-iframe:visible", window.top.document)[0].contentWindow.document.getElementsByName('RHIFRAME0')[0].contentWindow._g().getCellValue(0, 1, 0);
    }
    var nurl = fmeadomian + decodeURIComponent(decodeURIComponent(txt1)).replace(/^(?:[^/]*\/){3}(.*)$/, "$1");
    var conf = '<MyField><uuid>' + sid + '</uuid><fabid>' + fabid + '</fabid><pstatus>' + 1 + '</pstatus><fstatus>' + 2 + '</fstatus><txt1>' + '<![CDATA[' + nurl + ']]>' + '</txt1><versionnum>' + 1 + '</versionnum></MyField>';
    //alert(conf);
    send(accountid, 'P_A_EXPORT001', conf);
    frm点击网网页框中的cpt的按钮控件(cpt中的按钮控件需要设置控件名称)
    let a = _g().getWidgetByName('doc_export_type').getValue().toString();
    try {
      if (a == 'PDF') {
        top.document.getElementsByName('RHIFRAME0')[0].contentWindow.contentPane.getWidgetByName('btn_export_pdf').fireEvent("click");
      } else {
        top.document.getElementsByName('RHIFRAME0')[0].contentWindow.contentPane.getWidgetByName('btn_export_excel').fireEvent("click");
      }
    
    
    } catch {
      if (a == 'PDF') {
        $(".bi-iframe:visible", window.top.document)[0].contentWindow.document.getElementsByName('RHIFRAME0')[0].contentWindow.contentPane.getWidgetByName('btn_export_pdf').fireEvent("click");
      } else {
        $(".bi-iframe:visible", window.top.document)[0].contentWindow.document.getElementsByName('RHIFRAME0')[0].contentWindow.contentPane.getWidgetByName('btn_export_excel').fireEvent("click");
    
    
      }
    }
    //关闭当前弹窗
    window.top.layer.closeAll("iframe");

     

    frm内使用url向网页框传值

    var paras = _g().getWidgetByName('doc_more_paras').getValue();
    var fab = _g().getWidgetByName('doc_fab').getValue();
    var fmea_code = _g().getWidgetByName('doc_fmea_code').getValue();
    var product = _g().getWidgetByName('doc_product').getValue();
    var process_platform = _g().getWidgetByName('doc_process_platform').getValue();
    var core_team = _g().getWidgetByName('doc_core_team').getValue();
    var owner = _g().getWidgetByName('doc_owner').getValue();
    var date_start = _g().getWidgetByName('doc_date_start').getValue();
    var date_modify = _g().getWidgetByName('doc_date_modify').getValue();
    var status = _g().getWidgetByName('doc_status').getValue();
    var colname = _g().getWidgetByName('r_btn_select_col_1').getValue();
    _g().getWidgetByName('rHIframe0').setValue(url + '&colname=' + paras + colname + '&doc_fab=' + fab + '&doc_fmea_code=' + fmea_code + '&doc_product=' + product + '&doc_product=' + product + '&doc_process_platform=' + process_platform + '&doc_core_team=' + core_team + '&doc_owner=' + owner + '&doc_date_start=' + date_start + '&doc_date_modify=' + date_modify + '&doc_status=' + status);

     

     

    frm网页框里的cpt向上传值

    parent._g().getWidgetByName('doc_export_flow_conf').setValue(conf);

     

     

    获取组件的可见与不可见状态

    _g().getWidgetByName('r_btn_select_col_1').isVisible();

     

     

    js点击网页框里的按钮

    document.getElementById('rHIframe0').contentWindow._g().getWidgetByName('btn_export_pdf').fireEvent('click');

     

    导出插件的语法示例(会把你的文件存到指定的目录里,文件名自定义,文件路径自定义。目前语法只能放在cpt里用,只支持pdf和excel)

    FR.backExport(sessionID, "excel", "D://tomcat//webapps//webroot//fmea_file//", "创建FMEA (1).xlsx");

     

    获取网页框的url

    alert(_g().getWidgetByName("rHIframe0").getValue());

     

     

    获取当前url-导出表-显示URL(字段)

    alert(window.location.href);

     

     

    按钮点击事件-设置回调函数(提示 成功或失败)

    if (fr_submitinfo.success) {
    	FR.Msg.toast('提交成功');
    } else {
    	FR.Msg.toast('提交失败,错误信息为:' + fr_submitinfo.failinfo);
    }

    当前列全选

    var flag = this.getValue();
    //获取当前值
    var boxes = _g().getWidgetsByName("box");
    //获取当前页的复选按钮控件数组
    if (typeof(boxes[0]) != "undefined") {
    	var configs = [];
    	for (i = 0; i < boxes.length; i++) {
    		var cr=FR.cellStr2ColumnRow(boxes[i].options.location);
    		//获取行列号对象
    		configs.push({reportIndex:0,col:cr.col,row:cr.row,value:flag});
    		//如果控件大于1个,则遍历将行列号以及值信息插入数组中
    		_g().setCellsQuick(configs);
    		//批量赋值
    		//如果模板存在冻结,且被赋值单元格的行高列宽会改变,则需要替换此句为:_g().setCellsValueInBatch(configs);
    	}
    } else {
    	var cr=FR.cellStr2ColumnRow(boxes.options.location);
    	//获取行列号对象
    	_g().setCellValue(0,cr.col,cr.row,flag);
    	//如果控件只有1个,则直接赋值
    }

     

     

     

    消除选中黑色边框线

    //消除选中黑色边框线。在填报WEB属性-事件编辑-加载结束
    _g().curLGP.hideSelectFrame();

     

    使用js点击填报报表的提交按钮(已经确定,元素固定):

    //点击网页框1里面的cpt提交按钮
    document.getElementsByName('RHIFRAME0')[0].contentWindow._g().verifyAndWriteReport(true);
    //点击网页框2里面的cpt提交按钮
    document.getElementsByName('RHIFRAME0_C')[0].contentWindow._g().verifyAndWriteReport(true);
    相关链接:
    https://help.fanruan.com/finereport/doc-view-4279.html
    (链接里主要关注,右边的目录,比如函数verifyAndWriteReport(true))
    
    
    //弃用,能不用就不用DOM元素
    $(function(){
       document.querySelector("#fr-btn-Submit > div > em > button").click();
    });

    隐藏工具栏(创建一个js文件,在模板Web属性中引入即可)

    (因为要调用cpt的提交按钮,但是帮助文档里的隐藏工具栏的方法都是直接整个div没了,网页中连工具栏的元素都找不到了,就没办法使用提交按钮了)

    / * 通过高度为0隐藏工具栏,但是页面上还是有工具栏的元素 * /
    $(function () {
    	setTimeout(function(){
    		document.querySelector("#id_container > div.x-toolbar.ui-state-enabled.fs-tab-content-top-toolbar").style.height=0;
    	},50)
    })

     

    隐藏组件-设置组件事件

    _g().getWidgetByName('report0').setVisible(false);

    JS实现点击超链切换Tab块

    _g().getWidgetByName("tabpane0").showCardByIndex(0);

    跑马灯并隐藏滚动条

    setTimeout(function(){
    _g().getWidgetByName('report1').setVScrollBarVisible(false);//滚动条自动隐藏
    _g().getWidgetByName('report1').startMarquee({//跑马灯
    offset: 2,
    interval: 0.2
    })
    }, 500)

    使时间刷新不会有间隙

    FR.HtmlLoader.loadingEffect=function(){}

    使组件透明度为50%

    setTimeout(function() {
    $("div[widgetname=R_1_2]").css({
    'opacity': '0.5'
    });
    }, 50);

    js调用背景图片

    setTimeout(function() {
    $('.content-container').css({"background": "url(/webroot/help/image/INDEX/body.png)no-repeat","background-size":"100% 100%"});//body背景
    $("div[widgetname=R_1_1]").css({"background","url(/webroot/help/image/INDEX/R_1_1.png;)center center / 100% 100% no-repeat"}); //顶部标题-背景
    $("div[widgetname=R_1_2]").css({"background","url(/webroot/help/image/INDEX/R_1_2.png;)center center / 100% 100% no-repeat"}); //顶部标题-小图片标题
    }, 1000);

    Tomcat下通过IP直接访问数据决策系统后,报表块如何调用图片,比如你按照帆软教程设置的话,那么报表块调用图片时,图片的路径把webroot删掉即可。

    $("div[widgetname=R_1_1]").css({"background","url(/help/image/INDEX/R_1_1.png;)center center / 100% 100% no-repeat"});

    关于window.location.href的用法

    javascript中的location.href有很多种用法,主要如下。
    
    self.location.href="/url" 当前页面打开URL页面location.href="/url" 当前页面打开URL页面windows.location.href="/url" 当前页面打开URL页面,前面三个用法相同。this.location.href="/url" 当前页面打开URL页面parent.location.href="/url" 在父页面打开新页面top.location.href="/url" 在顶层页面打开新页面
    
    如果页面中自定义了frame,那么可将parent self top换为自定义frame的名称,效果是在frame窗口打开url地址
    
    此外,window.location.href=window.location.href;和window.location.Reload()和都是刷新当前页面。区别在于是否有提交数据。当有提交数据时,window.location.Reload()会提示是否提交,window.location.href=window.location.href;则是向指定的url提交数据
    
    资料来源:https://www.cnblogs.com/huifeidezhuzai/p/10334813.html

    点击组件跳转页面

    window.open('/webroot/..............','_self');

    点击刷新当前页面到新的url(不新建标签页)

    window.location.href="url"

    柱形图点击不同的柱子下钻到不同的页面(特效-交互属性-添加链接-JavaScript,记住要在js界面添加参数)

    if(val == "存货"){
    	window.parent.FS.tabPane.addItem({title:"存货分析",src:"${servletURL}?viewlet=test/存货分析.frm"})
    	}else{
    	window.parent.FS.tabPane.addItem({title:"应收账款分析",src:"${servletURL}?viewlet=test/应收账款分析.frm"})
    }

    获取当前控制值

    this.getValue();
    
    this.options.form.getWidgetByName("c1").getValue();

    获取当前行号

    var widget = _g().getWidgetByCell(FR.columnRow2CellStr({
    col: 2,
    row: ro
    }));

    数据集里的参数为空则查询全部,否则按照条件查询

    SELECT * FROM 销量  ${if(len(area) == 0,"","where 地区 = '" + area + "'")} 

    下拉复选框查询为空显示全部

    SELECT * FROM 订单 where 1=1  ${if(len(area) == 0,"","and 货主地区 in ('" + area + "')")}

    根据账号权限来控制填报工具栏上的按钮是否可用

    (例如,重大事项有一个超级管理员,有若干分块管理员。想让分块管理员无法使用原样导出和增量导入的功能。)

    (原理:根据工具栏上的位置来识别是第几个按钮,然后设置其不可用,工具栏上的按钮位置索引从0开始)

    (特殊提醒:但凡是根据权限控制什么的事情,写js时,设置一个参数获取角色名称用来判断)

    setTimeout(
    	function() {
    		if (user != '纪检管理') {
    			//_g().getToolbar().getWidgetByName("Verify").setEnable(false); 
    			contentPane.toolbar.options.items[2].setEnable(false); //工具栏的第3个按钮 
    			contentPane.toolbar.options.items[3].setEnable(false); //工具栏的第4个按钮 
    		}
    	}, 1000);

    js跳转页面

    window.parent.FS.tabPane.addItem({title:"零部件产销存分析看板",src:"${servletURL}?viewlet=mobile/零部件产销分析看板_mobile.frm"})
    
    window.location = encodeURI(encodeURI("${servletURL}?viewlet=mobile/零部件产销分析看板_mobile.frm"));
    
    window.open('');
    
    FR.doHyperlinkByGet({url:'ReportServer?formlet=mobile/零部件产销分析看板_mobile.frm',title:'TITLE_NAME'});

    横向跑马灯

    当前单元格插入公式、单元格属性-其他-高级-显示内容:用HTML显示内容

    "<marquee id='affiche' style='text-align:center;display:table-cell;vertical-align:middle;' behavior='scroll'  bgcolor='#ffffff' direction='left' height='100%' width='500px' hspace='0' vspace='2' loop='-1' scrollamount='10'   scrolldelay='80' onMouseOut='this.start()' onMouseOver='this.stop()'>" + REPLACE(J10,","," ") + "</marquee>"

    cpt自定义按钮 点击事件 插入行

    _g().appendReportRC(1);//点击按钮新增一行
    contentPane.deleteReportRC();//点击按钮删除一行

    单个组件控件修改样式

    setTimeout(function() {
    $("div[widgetname=TEXTEDITOR0]").find('.fr-texteditor').css('background-color', 'blue');
    $("div[widgetname=TEXTEDITOR0]").find('.fr-texteditor').css('color', 'white');
    }, 100);