jquery类库

[TOC]

jquery类库

jQuery的setter和getter

获取和设置html属性-attr()

获取和设置html属性。与之相关的是removeAttr()用来移除选中元素的某个属性。

# 获取a标签的href值
$("a").attr("href");

#设置src值
$("#img").attr("src","images/a.png");

#一次设置多个属性值
$("#banner").attr({src:"banner.png",alt:"图片",width:"200px",heigth:"200px"});

#连接在新窗口打开
$("a").attr("target","_blank");

#站内连接在本窗口,站外连接在新窗口打开
$("a").attr("target",function(){
    if(this.host==location.host)
        return "_slef";
    else
        return "_blank"
})
或者
$("a").attr(target:function(){
    ...//像这样传入函数
})

由上例子可看出,设置参数的值时,可以传入函数。

获取设置css值-css()

获取设置css值,用法与attr()类似。
不能获取font,margin,padding等复合样式的值,只能取单个值,比如”font-size”,”margin-left”等。

获取设置CSS类

jQuery中提供了一下四种方法来获取和设置CSS类。

addClass()
removeClass()

# 当元素没有某类时添加,反之删除
toggleClass()

# 用来判断某类是否存在,存在返回true
hasClass() 

获取设置HTML表单值-val()

val()用来获取HTML表单元素的value属性,也可用来获取和设置复选框、单选按钮以及select元素的选中状态。

#获取input值,select的选中值
$("id").val();

#获取选中的单选按钮的值
$("input:radio[name=ship]:checked").val();

获取设置元素内容

text(),html()获取和设置元素的纯文本和html内容

获取设置元素的位置和大小

offset():获取元素位置,返回的对象带有left,top属性,用来表示X和Y坐标

var node = $("div");//需要移动的元素
var position = node.offset();//元素当前位置
position.top +=100;//改变Y轴位置
node.offset(position);//设置新位置

获取元素高度:

#返回基本的宽度和高度,不含内外边距和边框
width(),heigth()

#返回包含内边距和边框的尺寸
innerWidth(),innerHeight()

#返回边框以内的尺寸,包括内边距,若向两个方法中的任意一个传入true值,它可以返回包括元素外边距的尺寸。
outerWidth(),outerHeight()

#左右外边距的和
var margin = body.outerWidth(true)-body.outerWidth();
# 左右边框的和
var border = body.outerWidth()-body.innerWidth();
#左右内边距的和
var padding = body.innerWidth()-body.width();

data()

<div data-test="this is test"></div>
$("div").data("test");//this is test

jQuery选择器

除了常见的id选择器,类选择器,元素选择器之外还有以下选择器:

表单选择器

  • :input
  • :radio
  • :text
  • :password
  • :checkbox
  • :submit
  • :image
  • :reset
  • :button
  • :file

    表单对象属性

  • :enabled
  • :disabled 匹配所有不可用元素
  • :checked 匹配所有选中的被选中元素(复选框、单选框等,select中的option),对于select元素来说,获取选中推荐使用 :selected
  • :selected 匹配所有选中的option元素

。。。
后续待补充

MVC、MVVM模式

[TOC]

MVC、MVVM模式

MVC

标准的MVC框架

一个标准的MVC框架中模型可以主动推送数据给视图进行更新(观察者模式),或者由控制器根据模型返回的数据选择合适的视图来展示如下图所示:

enter description here

  • model: 包括业务逻辑、数据模型的集合,也定义数据修改和操作的业务规则。
  • view: UI组件,例如CSS、HTML、JQuery等,负责从Controller接受数据,把model转化为UI。

  • Controller: 负责处理流入数据,通过View接受用户输入,利用model处理数据,最后把数据返回给用户。

Model和View之间采用Observer模式。
Controller和View之间采用策略模式。

WEB MVC框架

在WEB MVC框架中模型不能主动跟新用户界面。一般的web开发是请求-响应模式。例如:SpringMVC,详情请查看SpringMVC

enter description here

MVVM模式

enter description here

  • View和ViewModel数据进行双向绑定,使得ViewModel的状态改变可以自动传递给View。
  • ViewModel通过observer模式来讲ViewModel的变化通知给Model。
    如Angular,avalon(美团前端,司徒正美开发)

String解析

[TOC]

String类型是一个特殊的包装类,不属于8种的基本类型之一,对象的默认值是null,所以String的默认值也是null。

存放区域

字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。

比较

比较数值是否相等时,用’equals()’方法;比较引用值是否指向同一个对象时,用==。

这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是 比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。
new String()和new String(“ “)都是申明一个新的空字符串,是空串不是null。

两种不同初始化

String str = new String("aaa");
String str1 = "aaa";

String str = new String(“aaa”);

String str1 = "abc";   
String str2 = "abc";   
System.out.println(str1==str2); //true  

可以看出str1,str2指向同一个对象。
以上代码创建了一个对象,”abc”存储于字符串常量池中。两个引用str1和str2,指向”abc”。

String str1 = “aaa”;

String str1 =new String ("abc");   
String str2 =new String ("abc");   
System.out.println(str1==str2); // false  

用new的方式生成不同的对象。
以上代码创建了三个对象,’abc’存储于字符串常量池中,两个new String()对象位于堆中,栈中两个指向堆的引用str1,str2
所以第二种方法有利于节省内存空间,提高运行速度。

StringBuffer

StringBuffer:可变长度
String:不可变长度

Java内存分配浅析

[TOC]

Java内存分配浅析

计算机存储结构

先来简单了解下计算机的存储结构,计算机采用三级存储结构:

  • 高速缓冲存储器cache
  • 主存储器
  • 辅存储器

可看做两层:cache-主存,主存-辅存
细分的存储层次:

  • CPU(寄存器)
  • cache
  • 内存(RAM)
  • 硬盘(Hard Disk)

    java数据类型

    基本类型

    8bit = 1Byte
  • byte, 8bit
  • int, 32bit
  • short, 16bit
  • long, 64bit
  • boolean, 16bit
  • float, 32bit
  • double, 64bit
  • char, 16bit

    引用类型

    Array, String和对象,都位于堆中。

基本类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。

Java内存区域

java程序的运行在JVM中,运行时虚拟机会将它所管理的内存区域划分为若干不同的数据区域,这些区域都有各自的用途及创建销毁时间。

就速度来说,有如下关系:
寄存器 < 栈 < 堆 < 其他

寄存器(Register)

CPU内部元件,每个寄存器都有自己的名字,程序无法直接控制,高速读写速度。分为内部寄存器和外部寄存器。
内部寄存器也就是小小的存储单元。
可用来寻址或者计算

栈,堆

java将内存(RAM)分为栈内存和堆内存

栈(Stack)

存放基本类型的数据(如int,short,long,byte,boolean,float,double,char…)和引用类型的地址。引用类型本身存放在堆中。

当程序中定义一个变量时,就在栈中为变量分配一个内存空间,当变量超出作用域时,java会自动释放改变量的内存空间。

创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性

堆(Heap)

存放由new创建的数组和对象,有java虚拟机的垃圾回收机制自动回收。当堆中的数组和对象在没有引用变量指向它们的时候,才会变为垃圾,然后在随后一个不确定的时间被回收,这也是java比较占内存的原因。

运行时数据区,运行过程中动态分配内存的。

java堆是所有线程所共享的一块内存区域,该区域的唯一目就是存放对象。可以处于物理上不连续的空间,逻辑上连续即可
java中的指针:栈中的引用变量指向堆中的变量

区别

栈:存取速度快,仅次于寄存器,栈数据可以共享。存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
堆:运行时动态分配,存取速度慢。

String类型存放

字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。
详细内容请查看String解析一文

静态域(static storageb)

这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的。

常量池(constant pool)

常量池指在编译期被确定,并保存在已编译的.class文件中的一些数据,包括定义的基本常量数据,对象型(String及数组)和常量值(final)。
JVM必须为每个装载的类型维护一个常量池,常量池就是该类型所用到的常量的义序有序集合
在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float、int等)。另外,可以存储不经常改变的东西(public static final)。常量池中的数据可以共享。

非RAM存储

硬盘等永久存储空间,存放一些数据完全存活于程序之外,它可以不受程序的任何控制,在程序没有运行时也可以存在。

堆栈溢出

  1. 堆溢出简单,循环创建对象即可

    for(;;){
        ArrayList list = new ArrayList(2000);
    }
    
  2. 栈溢出
    实现栈溢出,需要调用递归

    public void test(){
        this.test();
    }
    
  3. JVM堆栈设置

    java –Xms128m //JVM占用最小内存
        –Xmx512m //JVM占用最大内存
        –XX:PermSize=64m //最小堆大小
        –XX:MaxPermSize=128m //最大堆大小
    

参考:
Java 内存分配全面浅析
深入Java核心 Java内存分配原理精讲
深入理解Java的栈与堆栈

@FormParam与@RequestParam

@FormParam 是 Jersey(JAX-RS) 的
@RequestParam 是 SpringMVC 的

RESTful

RESTful Web Service的实现方案有两种:

  • 一种是按照JAX-RS规范的标准实现,
  • 另外一种是按照自定义的方式实现。

JAX-RS标准实现的框架比较有名的有:Jersey、Apache Wink等,其中,Jersey是JAX-RS规范的参考实现,比较有代表性。

非标准实现的框架中比较有名的有:Spring MVC3.0、Restlet等,其中,Spring MVC3.0由于Spring框架在开发社区的影响力,使得它在非标准实现中比较有代表性,并且使用人群较多。
另外、除了这些成熟的开发框架以外,要实现REST Web Service也可以利用 Apache URL重写机制,HTTPClient开发包,Java Servlet等方式实现。

Jersey(JAX-RS)

JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。

@FormParam

form传递的参数 接受form传递过来的参数。比如:@FormParam(“name”) String userName

RequireJS模块化开发百度地图

[TOC]

加载百度地图

因为百度地图只能CDN加载,所以paths中直接配置CDN路径

安装async插件

requirejs-plugins中包含async,点击这里进行下载

可通过bower安装

bower install requirejs-plugins --save

require.config({
    paths: {
        async: 'requirejs-plugins/async',
        'BMap' : 'http://api.map.baidu.com/api?v=2.0&ak=Ua9wlu6LbqmNKVbMEGtkgSxvljqZC5fc'
    },
    shim: {
        'BMap': {
        deps: ['jquery'],
        exports: 'BMap'
    }
    }
}

//调用百度地图
define(['jquery','async!BMap'], function(){
    var map = new BMap.Map("map");
    var point = new BMap.Point(108.95344, 34.265664); // 创建点坐标
    map.centerAndZoom(point, 13); // 初始化地图,设置中心点坐标和地图级别
    map.centerAndZoom("西安", 13);
});

这里注意,不能写成:

define(['jquery','async!BMap'], function(jquery,BMap){
    ...
});

否则报错,BMap is undefined
enter description here

分析

至今为止,百度地图JS API暂时还没有很好地支持RequireJS,API并没有对AMD做特殊设置。暂不支持AMD或者CMD的加载方式。

RequireJS

[TOC]

RequireJS

插件

  1. RequireJS官方默认提供了一些插件,如:text,domReady,i18n。
    其他详情请查看RequireJS的插件列表
  2. requirejs-plugins插件

可通过bower安装

bower install requirejs-plugins --save

配置文件

requireJS的配置常用文件config.js:

requirejs.config({
    baseUrl : 'lib/',
    paths : {
        app : '../js/app',
        css : '../js/css.min',
        custom: '../js/custom',
        common: '../js/common',
        domReady: 'domReady/domReady',
        jquery : 'jquery/jquery.min',
        async: 'requirejs-plugins/async',
        react : 'react/react.min',
        angular : 'angular/angular',
        bootstrap : 'bootstrap/js/bootstrap.min',
        bootstrapTable : 'bootstrap-table/js/bootstrap-table.min',
        tableLanguage : 'bootstrap-table/locale/bootstrap-table-zh-CN.min',
        tableExport:'bootstrap-table/extensions/tableExport',
        bootstrapTableExport:'bootstrap-table/extensions/bootstrap-table-export.min',
        confirm : 'jquery-confirm2/jquery-confirm.min',
        'bootstrap-dialog' : 'bootstrap3-dialog/js/bootstrap-dialog.min',
        BMap : 'http://api.map.baidu.com/api?v=2.0&ak=Ua9wlu6LbqmNKVbMEGtkgSxvljqZC5fc'
    },
    shim : {
        jquery : {
            init : function() {
                return jquery.noConflict(true);
            },
            exports : 'jquery'
        },
        custom : {
            deps: ['jquery']
        },
        common : {
            deps: ['confirm', 'bootstrap-dialog']
        },
        index : {
            deps: ['jquery']
        },
        angular : {
            exports : 'angular'
        },

        bootstrap : {
            deps : [ 'jquery', 'css!../lib/bootstrap/css/bootstrap.min.css' ],
            exports : "$.fn.popover"
        },
        tableLanguage : {
            deps : [ 'bootstrapTable' ],
            exports : '$.fn.bootstrapTable.defaults'
        },
        bootstrapTable : {
            deps : ['bootstrap',
            exports : '$.fn.bootstrapTable'
        },
        tableExport : {
            deps: ['jquery'],
            exports : '$.fn.extend'
        },
        bootstrapTableExport:{
            deps:['bootstrapTable'],
            exports : '$.fn.bootstrapTable.defaults'
        },
        confirm : {
            deps : [ 'jquery','css!./jquery-confirm2/jquery-confirm.min.css' ]
        },
        'bootstrap-dialog' : {
            deps : ['bootstrap', 'css!./bootstrap3-dialog/css/bootstrap-dialog.min.css' ]
        },
        'BMap': {
            deps: ['jquery'],
            exports: 'BMap'
        }

    },
    //首先加载bootstrap
    deps: ['bootstrap'],
    //开发专用,阻止浏览器缓存
    urlArgs: "bust=" +  (new Date()).getTime(),
    //在放弃加载一个脚本之前等待的秒数。
    waitSeconds: 0
});

常用参数解析如下:

deps

配置首先加载的模块。

deps: ['bootstrap'],

urlArgs

开发中用来组织浏览器缓存

urlArgs: "bust=" +  (new Date()).getTime(),

waitSeconds

加载脚本的最长等待时间,设为0禁用等待超时。默认为7秒。

ReactJS初识

[toc]

ReactJS初识

组件周期

组件的生命周期可以分为三个阶段:Mounting, Updating, Unmonuting。
Mounting: 组件被插入DOM中
Updating:DOM数据被更新,组件需要重新渲染
Unmounting: 从DOM中杀出组件
React在每个阶段开始前提供了will方法用于在这一阶段开始前的操作。did方法用于执行每个阶段结束之后的操作。

Mounting阶段

首先在Mounting阶段,Component通过React.createClass被创建出来,然后调用 getInitialState 方法初始化 this.state。在 Component 执行 render 方法之前,通过调用 componentWillMount(方法修改 state 状态),然后执行 render。Reder的过程即是组件生成HTML结构的过程。在render之后,Component 会调用 componentDidMount 方法。在这个方法执行之后,开发人员才能通过 this.getDOMNode()获取到组件的 DOM 节点。

  • getInitialState()
  • componentWillMount(): mounting occurs之前立即调用
  • componentDidMount(): mounting occurs之后立即调用,需要初始化DOM节点的操作都在这里。

    Updating阶段

当 Component 在 mount 结束之后,它当中有任何数据修改导致的更新都会在 Updating 阶段执行。Component 的 componentWillReceiveProps 方法会监听组件中 props。监听到 props 发生修改,它会比对新的数据与之前的数据之间是否存在差别进而修改 state 的值。当比对的结果为数据变化需要对 Component 对应的 DOM 节点做出修改的时候,shouldCoponentUpdate 方法它会返回 true 用于触发 componentWillUpdate 和 componentDidUpdate 方法。在默认的情况下 shouldComponentUpdate 返回为 true。有些特殊的情况是当 component 中的 props 发生修改,但是其本身数据并没有改变,或者是开发人员手工设置 shouldComponentUpdate 为 false 时,React 就不会更新这个 component 对应的 DOM 节点了。与 componentWillMount 和 componentDidMount 相类似,componentWillUpdate 和 componentDidUpdate 也分别在组件更新的 render 过程前后执行。

Unmounting阶段

当开发人员需要将 component 从 DOM 中移除时,就会触发 UnMounting 阶段。在这个阶段中,React 只提供了一个 componentWillUnmount 方法在卸载和销毁这个 component 之前触发,用于删除 component 中的 DOM 元素等。

虚拟DOM

Web开发中,我们经常需要将数据的时时变化反应到前台页面上,而这样就会频繁的进行DOM操作,而复杂频繁的DOM操作是会产生性能瓶颈,ReactJS为此引入了虚拟DOM的概念。在浏览器端用javascript实现了一套DOM API。基于React进行开发时的所有操作都是对虚拟的DOM进行操作,每当数据变化时,React都会重新构造DOM树,然后与上次构造的DOM树进行对比,仅对变化的部分进行实际浏览器的DOM更新。
前端任何UI的改变,都需要通过浏览器整体刷新实现。

ref回调属性

render: function() {
return (
  <TextInput
    ref={function(input) {
      if (input != null) {
        input.focus();
      }
    }} />
);
},

或者使用ES6的arrow function

render: function() {
    return <TextInput ref={(c) => this._input = c} />;
  },
  componentDidMount: function() {
    this._input.focus();
  },

this callback will be executed immediately after the component is mounted
参考文献:

  1. React 介绍及实践教程
  2. 官网教程

OneToMany关系的实现

@OneToMany的实现

应项目需求,对举报信息添加回复功能,举报信息表(Uploadinfo)与回复表(reply)之间是1:n的关系。

Uploadinfo.java中添加

@OneToMany(targetEntity = Reply.class, cascade = { CascadeType.ALL })
@JoinColumn(name="itemid")
@OrderBy(value = "replyTime desc")
private Set<Reply> replyid = new HashSet<Reply>();

public Set<Reply> getReplyid() {
    return replyid;
}

public void setReplyid(Set<Reply> replyid) {
    this.replyid = replyid;
}

@OrderBy:排序,对关联的reply表的数据按照replyTime值倒序排列
itemid: 外键,若reply表中没有这个字段,会自动添加一个。

Reply.java

单向关系时,在reply方不做设置,以下是reply中定义的几个属性。

private Integer id;
private Integer itemid;
private String message;
private String replyTime;

取值:
enter description here

|