js变量,方法作用域的几个误区

发表于2年前(May 16, 2016 9:45:05 AM)  阅读 648  评论 0

分类: WEB前端 JS

标签: .ready 变量作用域 ajax.load

最近几个以前前端接触较少的同事在开发过程中经常碰到页面js找不到方法定义的类似错误,这都是因为页面js代码太多,各种回调,页面之间相互load,把自己绕晕了,不知道该如何写代码了,其实说到根本是没搞清楚js变量,方法定义的作用范围,下面笔者对容易出错的几个地方说明一下。

1、document ready方法

现在不管是传统项目还是互联网项目,jquery几乎成了必不可少的插件,jquery使用最多的除了各种选择器,估计可能要算document.ready方法了。笔者在08年接触jquery,真正用熟是几年后了,当初的理解跟现在理解有些不同,不知道当时理解有误还是大家都是那么用的。最初,笔者会在head里面将jquery引入,然后会在body前添加document.ready方法,形成了固有的编码习惯。后来,了解到性能优化相关的知识,也知道行业基本都是head引入css,body结束前引入js,不过对于jquery到底何时引入,还是要看具体情况的,如果在body结束前引入,势必要将document.ready方法也要滞后。一般来说,大家都知道

......

jquery load页面导致js重复加载

发表于2年前(May 11, 2016 1:03:36 PM)  阅读 1946  评论 0

分类: WEB前端 JS

标签: 缓存 jquery load js重复加载 事件重复监听 事件监听多次 ajaxSetup cache

1、问题发生场景:

主页包含两个div,div1,div2,div1采用jquery load了page1,div2采用jquery load了page2,page1与page2业务类似,共用一个js,主页可能同时显示page1和page2,这时发现js重复加载了。

2、问题分析:

打开chrome,查看network,在load page1时js后面自动加上了?_1462934775039参数,数字应该是时间戳,紧接着load page2时,js又load了一次,同样带了一个时间戳,和之前时间戳不一样。

首先,js后面带了时间参数是避免使用缓存,看来jquery load方法是默认给js不缓存。其次不管js是否是缓存,加载两次,里面的内容都会执行两次,如果是同名方法定义,后面的方法会覆盖前面的方法,如果是事件监听,则会出现添加多次的情况,这样就会有问题,其实发现这个问题就是因为笔者js里面的事件监听执行了多次,导致页面表现异常。例如如下代码就会导致执行两次:

......

bootstrap模态窗口modal使用remote加载数据的缓存问题

发表于2年前(May 10, 2016 9:16:51 AM)  阅读 5799  评论 0

分类: WEB前端 JS

标签: bootstrap modal remote 缓存 removeData show.bs.modal hidden.bs.modal

模态窗口是很常用的控件,经常用来装载复杂的表单,bootstrap提供的modal模态弹窗提供了data-remote属性,用来指定远程加载的页面。但是该功能有个问题,如果该弹窗实例已经运行一次,则不会加载远程url的内容了,也就是说,如果您使用他加载一个动态表单,加载一次以后,除非刷新页面,再次弹窗依然是上次加载的内容。这个问题也许并不一定是bug,可能作者就是为了性能考虑,特意做的缓存,如果能配置是否缓存就更加完美了。

为了解决缓存问题,有几下几种方案:

1、移除绑定数据

在打开modal之前(show.bs.modal)或者关闭modal之后(hidden.bs.modal)移除之前绑定的数据,可以单独针对一个modal操作,也可以添加全局的监听方法,如:

......

Spring MVC上下文与Spring上下文的关系

发表于2年前(May 4, 2016 8:44:22 AM)  阅读 801  评论 0

分类: Java

标签: spring上下文 spring-mvc WebApplicationContext WebApplicationContextUtils RequestContextUtils

用Spring容器管理Bean是我们一惯的做法,这里的Spring容器指的就是Spring上下文。一般来说,我们会使用注入的方式将所需要的Bean注入到目标Target,但有时还是会存在不适合注入的情况,例如动态获取之类的,这时我们可能会直接去Spring上下文中去取。笔者就经常使用ContextLoader.getCurrentWebApplicationContext().getBean("")的方式去获取Bean。

前两天笔者在项目中引入了hibernate-validate库,在Spring-MVC.xml配置文件中增加了hibernate-validate的相关配置,为了不影响之前固有接口,笔者准备使用编程式验证,将Spring-MVC中得validator注入到所有controller的共同父类中去。可是发现,竟然从Spring上下文中取不出validator来。

查了下资料,发现原来是有两个上下文,Spring上下文保存在ServetContext中,追查源码可以看到key是
String R

......

formhash的使用

发表于2年前(Apr 26, 2016 11:53:42 AM)  阅读 655  评论 0

分类: Java

标签: formhash htmlunit 投票

1、前言:

前几天朋友让帮忙网上投票,研究了一下投票的网站,投票的机制是同一ip每天只能投一票,这种机制比较弱,使用代理ip即可解决,或者在家用代码控制路由器重新拨号或重启获取新的ip,于是笔者就开始进一步抓取投票的服务地址。服务地址很容易提取,换ip进行测试投票,发现服务器拒绝了,说请求非法,经过仔细分析测试,发现服务地址中包含了formhash参数,值为固定8位字符,很像md5后取8位的字符,如:d952227a。请求页面时,将会生成formhash,提交请求时,后台将验证formhash的正确性,笔者分析了下,这里formhash的生成跟ip地址以及浏览器类型(可能是User-agent)有关,应该是这两者加混淆字符后8位md5,如果能解密出这个加密方法,生成formhash,问题就解决了,这涉及到密码学的问题,笔者想想难度应该还是挺大的,formhash在这就一定程度上防止了程序提交。

2、formhash:

在这里,formhash有点像不用用户自己输入的验证码,笔者搜索了一下,好像formhash最早是

......

指定参数名称,参数值查询数据的通用方法

发表于2年前(Apr 25, 2016 9:43:58 AM)  阅读 633  评论 0

分类: 框架 mybatis

标签: 动态sql findByParams

接上篇文章,继续完善BaseMapper。

1、BaseMapper.xml:

增加findByParams SQL

<select id="findByParams" parameterType="Map" resultType="Entity">
        SELECT * FROM ${__tableName__} t WHERE 1=1
        <foreach collection="params" index="index" item="item" open=" and " separator=" and " close="">
            ${item.name}=${item.value}
        &
......

搭建基于mybatis的后台框架

发表于2年前(Apr 18, 2016 11:51:17 AM)  阅读 1125  评论 0

分类: Java 框架 mybatis

标签: mybatis mapper Interceptor 框架搭建

1、前言

最近新搭建一个框架,以前用过mybatis,这次第一次自己搭建基于mybatis的框架,架构基本上沿袭以前hibernate的套路,说到这,笔者对两者的观念基本还是停留在hibernate自动生成SQL,mybatis需要自己写SQL,mybatis自己写SQL开发起来麻烦,但SQL语句写起来灵活,容易实现功能,性能也更容易优化,而hibernate其实大部分情况下性能也够用,优化起来确实需要一定功底,在hibernate有时不容易实现的功能,笔者实际上会结合jdbcTemplate一起使用,所以一直使用hibernate也没发现什么问题。这次选用mybatis,其实主要是一次尝试。

2、概述

所有的实体都必须实现Entity接口;
所有的Mapper都必须继承BaseMapper,BaseMapper是一个泛型类,有两个泛型参数,一个是该Mapper操作的实体类型,另一个是序列化id类型,BaseMapper里面定义了通用的Mapper接口;
所有的DAO接口都继承于IBaseDA

......

PageHelper不支持STATEMENT非预编译的SQL

发表于2年前(Apr 18, 2016 10:09:05 AM)  阅读 604  评论 0

分类: Java

标签: mybatis 分页 PageHelper statementType STATEMENT 预编译 非预编译 intercepts 拦截器 动态sql 动态表名 动态字段名

PageHelper是一个很方便的mybatis的分页组件,如果你正在使用mybatis,建议尝试使用PageHelper进行分页。PageHelper是使用mybatis的拦截器intercepts实现分页操作的。

但PageHelper并不支持STATEMENT非预编译的SQL的分页,笔者调试时观察了一下,应该是由于SQL里面的分页参数使用的?,PageHelper修改SQL的时候无法将参数正确设置,所以导致了语法错误,mybatis使用的很少,笔者也不知道这个问题是不是一个问题,能否解决,如果有读者也遇到该问题,请暂时想别的办法吧。

其实笔者之所以使用STATEMENT非预编译的SQL,是想实现一个通用的Mapper,动态传入表名和字段名,查看网上资料都表明需要设置statementType="STATEMENT",所以出现了上面的问题,但后来笔者实验发现,动态sql并不需要强制设置statementType="STATEMENT",在默认预编译环境下运行,笔者测试暂时未发现有什么问题,笔者自己

......

java类通过反射读写私有变量

发表于2年前(Apr 14, 2016 4:51:44 PM)  阅读 413  评论 0

分类: Java

标签: 反射 private 私有变量 私有方法 reflect

我们写代码时会出现很多private的属性和方法,不允许用户直接访问这些,而是通过public的接口来访问。根据软件设计的开闭原则,一般来说当软件需要修改时,是通过扩展来完成,而不是通过对原有代码修改,即对扩展开放,对修改关闭。

在使用别人写的类库时,可能会遇到需要读写私有变量,或方法的情况,出现这种情况通常都是因为该类库没有很好地考虑到用户可能遇到的情况,没提供扩展的方法,这时,我们可以通过java的放射机制来实现我们的需求。

设置私有变量工具类示例代码(其他类似):

package com.cangzhitao.common.util;

import java.lang.reflect.Field;

/**
 * Created by cangzhitao on 16/4/14.
 */
public class ReflectUtil {

    public static Object setFiled(Object tar
......

指定log4j配置文件路径

发表于2年前(Apr 13, 2016 2:56:57 PM)  阅读 865  评论 0

分类: Java

标签: log4j classpath classpath* Log4jConfigListener log4jConfigLocation

log4j是使用频率很高的java日志组件,一般项目中都会在class根目录创建一个log4j.properties配置文件,Spring容器会默认在class根目录中寻找log4j.properties,约定优于配置。但难免存在需要显示指定的情况,这时,我们可以在web.xml中进行如下配置:

<context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>
            WEB-INF/classes/log/log4j.properties
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.ut
......