从毕业后就没做过web开发,N年后,居然有公司还在用现成的开源代码在拼拼凑凑搭项目,坑爹的,我进入这个项目…… 太苦逼啊…… 一堆问题百度都百不到啊……
暂时想到了几个问题,现在有的还没解决掉,先放这儿,以后解决了再更新故障分析和解决办法,算是记个笔记。因为我是常常几月后再次遇到以前解决的问题时手足无措的家伙。
1. 用struts2的上传文件功能做文件上传,点确定上传后页面刷新,再次上传居然Action里面的File对象是空的null.导致报异常了。
分析:第一次点击控件上传文件,struts2能够获取到File对象,上传成功后刷新页面,此时页面上显示给用户的路径还在,但是文件对象此时已经被struts2的临时tmp文件替换了。如果第二次点击上传按钮,struts2是无法获取到刚刚的File对象的,所以为null,也就无法继续上传。
第二次上传,就类似于在一个文本框里输入文件路径上传文件,这种上传方式是不被允许的,基于路径上传文件是不安全的操作,所以只能通过上传的控件浏览选中文件后进行上传。所以,如果你的页面有人要继续点上传的确定按钮,那么提示他:“请重新使用控件选择文件上传!”
2.struts2的页面国际化,如果用到下拉框,希望headerkey 和headerValue是有默认值的,如果headerValue是国际化字段,想用嵌套标签显然不行
类似于<s:select name="myselect" headerkey="" headerValue="<s:text name="common_select_all" />"/> 这样是不行滴,因为struts会把headerValue里面的值完完全全当做字符串,你放什么进去,就显示什么出来。
正确的做法是:<s:select name="myselect" headerkey="" headerValue="%{getText('common_select_all')} "/>.
3.在html页面的表格中使用鼠标悬停提示,譬如在每行都能给个悬停提示叫做“双击行显示XX内容”,一般是在<tr>内用title属性给提示的。但是在jqGrid中,怎样给出这样的悬停提示呢?目前不知道有没有相关的属性可以用,只知道悬停的一个事件,但是事件能做别的事情,给不了那句提示让人看见呐。。。
4.新建的一个表,在insert一堆数据后,进行Truncate操作,居然删不掉了,什么情况?Truncate的速度非常慢,产生锁。为什么会这样?
5.怎样java sql 提高插入表数据的速度,使用批处理。批处理按一定数目进行分批提交。 这个在插入万条以上数据时有非常明显的效果。
6.串接多个字符串
public static String chainStr(String... strs)
{
StringBuffer sb = new StringBuffer();
for(int i=0 ; i<strs.length; I++)
{
sb.append(strs[i]);
sb.append(" ");
}
return sb.toString();
}
7.JSP页面修改代码后,刷新没反应,还是原来旧的代码:
原因1:引入了不存在的文件路径,请检查文件名或路径是否正确且存在。
原因2:代码里调用的部分标签不完整(或代码语法格式错误),标签不完整有可能页面会提示错误,也有可能不提示,但代码就是不更新。
8.JSP页面的一些国际化处理。
a.有时通过后台传递错误信息,刷新页面后,就可以在页面正确显示传递过来的提示信息。
b.页面不刷新,也想通过InnerHTML的方式显示提示信息,那就是后台传来一个标记值flag=1或2等,根据值去显示先前设定好的国际化信息。
c.页面不刷新,但国际化信息带有多个可变的参数,用拼凑法觉得拆开字段不值得,且浪费字段的使用效率,如果后台拼凑好再传回jsp却又会出现乱码。
这里告诉你,如何在jsp页面使用带多个参数的国际化信息:
c-1:建立两个国际化的JS文件,如:lang-en.js,lang-zh.js
在lang-zh.js中声明字串信息:
var $businesslogMsg={
"Report_xsl_maxinum_tip" : "当前查询记录{0}条,系统最大限制{1}条,请缩小范围重新导出。“,
"maxAdmin" : "提示:仲裁管理员数量不能超过{0}个。"
}
lang-en.js中如上同样声明,对应中文释义改为英文即可。
c-2:JSP页面调用lang-zh.js文件:
首先,获取当前系统的国际化环境
<%
String path = request.getContextPath();
String locale = request.getLocale().getLanguage(); //这里获取的locale值中文和英文环境就分别为"zh"和”en“.
%>
然后在jsp页面引入对应的js文件
<script type="text/javascript" src="<%=path%>/pages/js/lang-<%=locale%>.js"></script>
c-3: JSP的回调函数定义,及使用国际化信息。
<script type="text/javascript">
exportCallback = function(flag,size,count)
{
var displaydiv = $("#displaydiv");
if(flag == 1)
{
var msg = String.format($businesslogMsg.Report_xsl_maxinum_tip, size+"", count+"");
displaydiv.innerHTML = "<font color=\"red\" >" + msg + "</font>";
}
}
</script>
c-4.java后台如何调取上面自定义的回调函数,如果我们没有使用ajax.
HttpServletResponse res = ServletActionContext.getResponse();
try{
res.setCharacterEncoding("UTF-8");
res.getWriter().print(" <script> parent.exportCallback(1,"+size+","+count+");</script>");
}catch(IOException e){}
9.Tomcat Web服务页面至后台传递中文不出现乱码的解决方案。
9.1首先,保证工程内的编码统一为UTF-8
9.2 在TOMCAT服务器的工程对应端口配置参数中增加与编码类型有关的配置。
举例: 如server.xml的8080端口对应添加URIEncoding="UTF-8" 或 useBodyEncodingForURI="true" 的配置属性。
9.3 当然,有时候系统是多个不同分系统组成的,我们不能修改现场的tomcat配置,这个时候只能使用js和java结合的功能来实现乱码问题的解决了:
第一步,在jsp中添加utf-8的编码格式,如下:
<meta http-equiv="content-Type" content="text/html;charset=UTF-8">
第二步, js封装字段值,如下:
encodeURIComponent(str);
第三步, java处理类获取传过来的字段后解码,如下:
java.net.URIDecoder.decode(str,"UTF-8");
10.jqGrid隐藏subGrid列:
一般情况下使用jQuery的hideCol方法,参数为列名,subGrid=true时,jqGrid会在记录左侧添加一列带“+”号的列以提供字表的展开和收回,这列的列名称其实就叫subgrid,所以隐藏加号那列的js代码为:
jQuery("#grid_id").hideCol('subgrid');
当然对应的显示就为jQuery("#grid_id").showCol('subgrid');
11. js里面取出字符串前后的空格方法实现:
trim:function(s){
try{
return s.replace(/^\s+|\s+$/g,"");
}catch(e){
return s;
}
}
当然,若是jQuery那就好办了,直接调用jQuery里面的方法去除字串的前后空格: $.trim(s); 即 jQuery.trim(str);
12.jsp中有一组约5或N个相同name的时间列表文本输入框(id因其他情况限制不便于一对一给出时),要求判断每个文本框中的格式都按00:00样式填写,若有不符合格式要求的,
则需要给此文本框加一个样式来标红此输入框。
jquery加样式的代码参考:
$("[name='name_timeCheckbox']").each( // 这个name是输入框前面的一个checkbox的名称,
function (index, record) { //checkbox和input是一一对应的,所以可以共用index
if(record.checked) {
var timeInputVal = $("[name='name_timeInput']")[index].value; //这个name是输入框的名称
var time = /^([0-1][0-9]|[2][0-9]):([0-5][0-9])$/;
if(!time.test(timeInputVal)){
$($("[name='name_timeInput']").get(index)).addClass('table_input_red'); //table_input_red就是让文本框变红的样式
return false;
}
}
附input文本框报错样式即变红的css:
.table_input_red{ border:solid 1px #eb3d00;height:25px; line-height:25px; padding-left:5px; margin-bottom:5px; margin-top:5px}
13.
Js判断是否存在某个函数:
若函数名为 abc,那么typeof(abc) == “function” 说明存在abc这个函数。
如果typeof(abc) == “undefined”,说明abc这个函数不存在。
若是弹出框操作时判断父窗口是否存在函数abc,则判断typeof(parent.abc) ==”function”即可
14. js radio自带的onclick事件不被触发,页面加载或点击该事件的函数均不执行。
我自己遇到这个情况的时候,是因为radio的name名称定义和事件函数名相同了,导致事件不被触发,改成不同的就可以触发了。
<input name="allCheck" type="radio" value="1+" onClick="allPass()">全部通过</input>
<input name="${guid}" type="radio" value="1" onClick="allCheck()">通过</input>
如上两行代码,这个时候点“通过”的radio,并不能触发allCheck()方法调用,此时,只要把第一行的name="allCheck"改成name="别的名称"就可以解决allCheck()函数的调用触发问题。
15.js获取父元素中的属性信息
比如<div class="ppClass" title="ppTitle">
<span onclick="javascript:myClick()" class="ssClass"></span>
<span id="myid_1"> hello ferndean </span>
</div>
这个时候myClick()方法内操作的时候需要替换掉上层div的title值显示,那么获取父元素的属性值再修改就可以了。参考如下:
function myClick(){
$("#myid_1").parent("div").attr("title","this is new title"); //parent()里面一定要指定你所要得到的哪个元素,否则parent给你返回的就是一大串的父和子的html元素了。
}
示例很简单,点到为止。而实际应用中往往没那么简单,逻辑复杂性较高,这个时候往往一个核心的提示能帮大忙,其他的业务获取就依赖项目自身的业务逻辑了。
16. jquery的rules校验表单,获取校验的结果使用var validFlag = $("#userForm").validate().form();
在表单前调用上行代码,如果校验未通过则结果返回false,如果校验通过则结果返回true.
使用获取校验结果的代码,是为了方便程序在提交表单后继续根据结果处理其他逻辑,使用ajax后台提交可以单独将提交方法独立出来,再加入此校验结果的代码,整个代码简洁清晰。
17. 修改上一层div中的title的提示值:
$("#executeRecord_"+selectRow).parent("div").attr("title",$("#executeRecord_" + selectRow).text());
18.
jquery 下拉框控件 清除选中的数据便于重新加载(程序的背景是下拉框控件放在一个页面,初始加载时并不显示下拉框。点击某按钮时下拉框相关层才展示,选中某条记录后,关闭了下拉框相关层,重新打开的时候控件会记住上一次选中的信息,不方便再次选择同一条记录,除非选择其他记录,这样的情况不太好)
var manger=$("#userLoginId").ligerComboBox();
manger.setValue("");
以上两行代码即可使后续多次重新打开时的下拉框控件和第一次打开时一样的效果。
19.使用jQuery validate时给出正则表达式,jquery就可以在校验时给出定义好的提示。
但是有时候正则表达式不好给出,比如要校验某字串不能包含某些特定的字符或字符串,这个时候可以自定义校验方法,jquery的validate通过自定义的校验方法给出我们需要给出的提示信息。
举例,此刻需要校验一个字符串,使其不能包含中文的标点符号,Jquery校验定义如下:
$("#ferndeanId").rules("add", {
ferndeanCheck : true, //这里的ferndeanCheck就是自定义的校验方法名
messages : {
ferndeanCheck : "不能含有中文标点符号啊啊啊"
}
});
//自定义校验方法:
jQuery.validator.addMethod("ferndeanCheck",
function(value, element) {
return this.optional(element) || !(/([\u4E00-\u9FA5]|[\u3000-\u303f\ufb00-\ufffd]|[\u2018\u2019\u201c\u201d\u2014\u2026])+/.test(value));
});
20. java自定义方法废弃的注释标识 @Deprecated
21. jquery的一些取值方式
$(this).find("input[name=month][type=checkbox]").val(); --> 取名称为month,类型为checkbox的元素的值
$("input[type=text][name^month][class=xxxx]").customDatePicker(); 各个条件并列查询符合要求的元素。
name=^month -->表示名称以month为前缀
jQuery获取元素类型 if( $("#元素ID").attr("type") == "checkbox") 判断元素是否为checkbox类型
JQuery获取父窗口文本元素的值 $("#父窗口元素ID",window.parent.document).val();