1、
problem:创建maven project 出现“The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path” 原因是 Javaweb工程类中没有添加Web 容器Runtime相关类导致.
solution:在pom.xml中添加如下配置即可:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
2.
problem:net不是内部或外部命令,原因是系统变量未指向你window系统下的system32
solution:我的电脑属性/高级/环境变量/在系统变量里找到path/编辑/ 将;%SystemRoot%\system32加到最后即可
3.
problem:判断为空 XX.equals(null) 和 XX==null
xxx.equals(null)和xxx == null
区别就是,如果程序能正常运行下去的话
xxx.equals(null)一定只能返回false
xxx == null可能返回true,也可能返回false
因为如果xxx是null的话
xxx.equals(null)会抛出NullPointerException
xxx == null返回true
solution:应该是XX.equals(“”) 和 XX==null
4
problem:弹出框中设置表单 提交给后台处理
solution:页面中设置一个div,在div中设置表单数据,隐藏,点击按钮显示该div(使用innerHTML)
5
problem:动态下拉列表
solution:
<select name="xxx">
<c:forEach items="${result}" var="user">
<option>${user.username }</option>
</c:forEach>
</select>
6
problem:重定向 传值
solution:重定向return new ModelAndView("redirect:/xxx.do")
传值:将值封装在ModelMap中
ModelMap mav = new ModelMap();
mav.addAttribute("attributeName", attributeValue);
return new ModelAndView("redirect:/xxx.do","attributeName");
传值在另一个方法中通过request.getParameter("username")获得
7
problem: javascript写在<head>和<body>里的区别
solution:
<body>中
当浏览器载入网页Body部分的时候,就执行其中的Javascript语句,执行之后输出的内容就显示在网页中。
<head>中
有时候并不需要一载入HTML就运行Javascript,而是用户点击了HTML中的某个对象,触发了一个事件,才需要调用Javascript。这时候,通常将这样的Javascript放在HTML的<head></head>里。
7 jquery内置的validate表单验证
$(function() {
$("form").validate({
submitHandler : function(form) {//必须写在验证前面,否则无法ajax提交
ly.ajaxSubmit(form,{//验证新增是否成功
type : "post",
dataType:"json",
success : function(data) {
if (data=="success") {
layer.confirm('添加成功!是否关闭窗口?', function(index) {
parent.grid.loadData();
parent.layer.close(parent.pageii);
return false;
});
$("#form")[0].reset();
} else {
layer.msg('添加失败!');
}
}
});
},
rules : {
"dataSourceFormMap.name" : {
required : true
}
},
messages : {
"dataSourceFormMap.name" : {
required : "数据源名称不能为空"
}
},
//.l_err为页面中自定义的一个div
//如<div class="l_err" style="width: 100%; margin-top: 2px;"></div>
errorPlacement : function(error, element) {//自定义提示错误位置
$(".l_err").css('display','block');
//element.css('border','3px solid #FFCCCC');
$(".l_err").html(error.html());
},
success: function(label) {//验证通过后
$(".l_err").css('display','none');
}
});
});
8
problem: jquery内置的validate表单验证 使用a标签会直接跳过(使用button submit可以执行)
solution:取巧的方法是将submit 隐藏 通过a调用
如:<input type='submit' style='display:none' id='ssss' />
<a href='javascript:' onclick='$("#ssss").click()' class="btn-dark">提交</a>
9.map 排序
public class MapSortDemo {
public static void main(String[] args) {
Map<String, Float> map = new TreeMap<String, Float>();
map.put("KFC", (float) 123);
map.put("WNBA", (float) 234);
map.put("NBA", (float) 345);
map.put("CBA", (float) 231);
Map<String, Float> resultMap = sortMapByValue(map); //按Value进行排序
for (Map.Entry<String, Float> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
public static Map<String, Float> sortMapByValue(Map<String, Float> map) {
if (map == null || map.isEmpty()) {
return null;
}
Map<String, Float> sortedMap = new LinkedHashMap<String, Float>();
List<Map.Entry<String, Float>> entryList = new ArrayList<Map.Entry<String, Float>>(map.entrySet());
Collections.sort(entryList, new MapValueComparator());
Iterator<Map.Entry<String, Float>> iter = entryList.iterator();
Map.Entry<String, Float> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
return sortedMap;
}
}
public class MapValueComparator implements Comparator<Map.Entry<String, Float>> {
public int compare(Entry<String, Float> me1, Entry<String, Float> me2) {
return me1.getValue().compareTo(me2.getValue());
}
}
10 map 遍历取值
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
11.File file =new File(path);
//如果文件夹不存在则创建
if (!file.exists() && !file.isDirectory())
{
//System.out.println("//不存在");
file .mkdir();
}
/如果文件不存在则创建
File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm");
if(!file.exists())
{
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
12.按钮点击不可用
$("#btn_change_datasource").attr('disabled',false);//设置disabled属性为false,按钮可用
$("#btn_change_datasource").attr('disabled',true);//设置disabled属性为true,按钮不可用
$('#btn_change_datasource‘).removeattr("disabled"); //移除disabled属性
13.mybatis 关于插入查询自动增长主键问题
1. <insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id">
2. Insert into tb_table(xxxx)//xxx为非主键
3. values (#{xxxx})
4. </insert>
14.正则表达式验证str是否包含汉字
var x=/[\u4e00-\u9fa5]/g;
X.test(str);
15.正则表达式验证str是否包含特殊字符(只允许有-、_、英文字母、数字)
str.replace(/^[\da-zA-Z\-\_]+$/, "").length==0
16.文本框字数显示不全 鼠标移上去显示tip
onmousemove= "if(this.title!=this.value)this.title=this.value"
17.request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可通过HTML表单或在网页地址后面提供参数的方法提交 数据,然后通过request对象的相关方法来获取这些数据。request的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。
18.平时写程序的时候,很多时候提示文件找不到,而抛出了异常,现在整理如下
一 相对路径的获得
说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)
String relativelyPath=System.getProperty("user.dir");
上述相对路径中,java项目中的文件是相对于项目的根目录
web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于 tomcat安装目录\bin)
二 类加载目录的获得(即当运行时某一类时获得其装载目录)
1)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)
InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt");
(test.txt文件的路径为 项目名\src\test.txt;类TestAction所在包的第一级目录位于src目录下)
上式中将TestAction,test.txt替换成对应成相应的类名和文件名字即可
2)通用方法二 (此方法和1中的方法类似,不同的是此方法必须以'/'开头)
InputStream is=Test1.class.getResourceAsStream("/test.txt");
(test.txt文件的路径为 项目名\src\test.txt,类Test1所在包的第一级目录位于src目录下)
三 web项目根目录的获得(发布之后)
1 从servlet出发
可建立一个servlet在其的init方法中写入如下语句
ServletContext s1=this.getServletContext();
String temp=s1.getRealPath("/"); (关键)
结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\ (002_ext为项目名字)
如果是调用了s1.getRealPath("")则输出D:\工具\Tomcat-6.0\webapps\002_ext(少了一个"\")
2 从httpServletRequest出发
String cp11111=request.getSession().getServletContext().getRealPath("/");
结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\
19.输入框中提示信息:获得焦点,输入框提示信息消失,光标闪烁
<input type="text" id="name" placeholder="请输入指标名称" onBlur="if(this.value=='') this.placeholder='请输入指标名称';"onFocus="if(this.value=='') this.placeholder='';"/>
恢复默认 的时候要设置文本框的placeholder
20.
Object 转String
var str = JSON.stringify(jsObj);
从JSON字符串转为对象
var jsObj = {};
jsObj.testArray = [1,2,3,4,5];
jsObj.name = 'CSS3';
jsObj.date = '8 May, 2011';
var str = JSON.stringify(jsObj);
var str1 = JSON.parse(str);
alert(str1);
21.java判断是否为数字
1)用JAVA自带的函数
public static boolean isNumeric(String str){
for (int i = str.length();--i>=0;){
if (!Character.isDigit(str.charAt(i))){
return false;
}
}
return true;
}
2)用正则表达式
public static boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}
3)用ascii码
public static boolean isNumeric(String str){
for(int i=str.length();--i>=0;){
int chr=str.charAt(i);
if(chr<48 || chr>57)
return false;
}
return true;
}
JS判断是否为数字 isNaN(xxx)
22.取昨天的日期,本想的截出来日期减一就好了。又一想不对,如果今天是一号怎么办?
现有两个办法
1:Date as = new Date(new Date().getTime()-24*60*60*1000);
SimpleDateFormat matter1 = new SimpleDateFormat("yyyy-MM-dd");
String time = matter1.format(as);
System.out.println(time);
取出数字型的时间 再减去24*60*60*1000,就得到昨天的时间了;
这个有点过时了!
2:Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
String yesterday = new SimpleDateFormat( "yyyy-MM-dd ").format(cal.getTime());
System.out.println(yesterday);
这个方法很方便,年月日都可以随心所欲的变!
3,用apache的DateUtils( 需要 import org.apache.commons.lang.time.DateUtils;)
Date currentTime = AppUtils.getCurrentDate();
//获取昨天时间
Date backupTime=DateUtils.addDays(currentTime, -1);
4.sql 查询条件包含时间的处理方法:
select * from TBIMC1 where CREATE_DATE_<to_date( to_char(sysdate-1,'yyyy-mm-dd'),'yyyy-mm-dd')
23.controller 向 mybatis传数据,mybatis用#{xxx} 或 ${xxx}获取,其中#{}会带xxx数据类型,如传入的string,在mybatis中以“xxx”形式出现;而${xxx}只是获取值xxx;
24.文本框改变事件(对所有ie使用onpropertychange,其他浏览器用oninput:)
var element = document.getElementById("mytext");
if("\v"=="v")
{
element.onpropertychange = webChange;
}
else
{
element.addEventListener("input",webChange,false);
}
function webChange()
{
alert(element.value);
}
25.正则验证只能包含中文、字母、数字、下划线
/^[\u4e00-\u9fa5\A-Za-z0-9\_]*$/
26身份证正则:
//身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
//身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)
最新手机号码正则表达式:
var tel = $("#telNo").val(); //获取手机号
var telReg = !!tel.match(/^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/);
//如果手机号码不能通过验证
if(telReg == false){
}
其他
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
提取信息中的中国手机号码:(86)*0*13\d{9}
提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
提取信息中的中国身份证号码:\d{18}|\d{15}
提取信息中的整数:\d+
提取信息中的浮点数(即小数):(-?\d*)\.?\d+
提取信息中的任何数字 :(-?\d*)(\.\d+)?
提取信息中的中文字符串:[\u4e00-\u9fa5]*
提取信息中的双字节字符串 (汉字):[^\x00-\xff]*
27.判断文件上传大小
· var maxsize = 2*1024*1024;//2M
· var errMsg = "上传的附件文件不能超过2M!!!";
· var tipMsg = "您的浏览器暂不支持计算上传文件的大小,确保上传文件不要超过2M,建议使用IE、FireFox、Chrome浏览器。";
· var browserCfg = {};
· var ua = window.navigator.userAgent;
· if (ua.indexOf("MSIE")>=1){
· browserCfg.ie = true;
· }else if(ua.indexOf("Firefox")>=1){
· browserCfg.firefox = true;
· }else if(ua.indexOf("Chrome")>=1){
· browserCfg.chrome = true;
· }
· function checkfile(){
· try{
· var obj_file = document.getElementById("fileuploade");
· if(obj_file.value==""){
· alert("请先选择上传文件");
· return;
· }
· var filesize = 0;
· if(browserCfg.firefox || browserCfg.chrome ){
· filesize = obj_file.files[0].size;
· }else if(browserCfg.ie){
· var obj_img = document.getElementById('tempimg');
· obj_img.dynsrc=obj_file.value;
· filesize = obj_img.fileSize;
· }else{
· alert(tipMsg);
· return;
· }
· if(filesize==-1){
· alert(tipMsg);
· return;
· }else if(filesize>maxsize){
· alert(errMsg);
· return;
· }else{
· alert("文件大小符合要求");
· return;
· }
· }catch(e){
· alert(e);
· }
· }
28.联合表查询,不需要再controller中进行,可以在mapping.xml中配置
如:
<!-- kpi_key, -->
(select k.kpi_name from tb_kpi k where k.kpi_key = tb_diagnosis_policy.kpi_key) kpi_name
表中字段为key,但是想要显示的是name ,可以在<sql id="selectId"></sql>设置字段的时候直接通过sql查询获得
29.获取两个时间段的天数差
· public static int daysBetween(String smdate,String bdate) throws ParseException{
· SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
· Calendar cal = Calendar.getInstance();
· cal.setTime(sdf.parse(smdate));
· long time1 = cal.getTimeInMillis();
· cal.setTime(sdf.parse(bdate));
· long time2 = cal.getTimeInMillis();
· long between_days=(time2-time1)/(1000*3600*24);
·
· return Integer.parseInt(String.valueOf(between_days));
· }
30.Mysql分页:
Limit用法如下:
第一个参数是指要开始的地方,第二个参数是指每页显示多少条数据;注意:第一页用0表示。
select * from tableName where 条件 limit 当前页码*页面容量-1 , 页面容量
当数据量多的时候,比如查500页,limit(500*20-1),20 即
limit 9999,20 意思是扫描满足条件的10019行,扔掉前面的9999行,返回最后的20行,问题就在这里,在一个高并发的应用里,每次查询需要扫描超过1W行,性能肯定大打折扣。
根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索
子查询:
SELECT * FROM tableName WHERE id <=(SELECT id FROM tableName ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize
limit n性能是没问题的,因为只扫描n行。
子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率
31.Mysql子查询缺点:
mysql的子查询的优化不是很友好,一直有受业界批评比较多.
关于mysql的查询有两个知识点:
第一个为mysql在处理所有的查询的时候都强行转换为联接来执行,将每个查询包括多表中关联匹配,关联子查询,union,甚至单表的的查询都处理为联接,接着mysql执行联接,把每个联接在处理为一个嵌套循环(oracle-nest-loop);
第二个知识点:在mysql在处理子查询的时候,会将将子查询改写,通常情况下,我们希望由内到外,先完成子查询的结果,然后在用子查询来驱动外查询的表,完成查询,例如:
Select * from test where test_id in(select fk_test_id from sub_test where group_id=10)
通常我们会想到该sql的执行顺序为:
sub_test表中根据group_id取得fk_test_id(2,3,4,5,6),然后在到test中,带入test_id=2,3,4,5,6取得查询数据,但是实际mysql的处理方式为:
Select * from test where exists (
select * from sub_test where group_id=10 and sub_test.test_id=test.id)
mysql将会扫描test中的所有数据,每条数据将会传到子查询中与sub_test关联,子查询不能首先被执行,如果test表很大的话,那么性能上将会出现问题;
这时候就需要改写查询了:
select t1.* from test t1,(select fk_test_id from sub_test where group_id=10 ) t2 where t1.test_id=t2.fk_test_id ;
或
select t1.* from test t1 inner join sub_test t2 on t1.test_id=t2.test_id where group_id=10;
32.js中replaceAll 方法:
js中只有replace()方法,replaceAll可以通过正则表达式实现:
x.replace(new RegExp(/(one)/g),'two');
将x中所有one 替换为 two
==========to be continue===========