看题目可能是扯皮,其实还是有很多专业知识的。从最开始没有注意到设计原则,到后面的jquery实战技巧,都是今天一天碰到的问题。

每天整理一点点,每天收获一点点。

关于软件设计

在设计系统结构的时候,一些软件设计方法,还是很重要的。

比如开闭原则,开闭原则就是:

  • 对扩展是开放的
  • 对修改是关闭的

要做到上面两点,就需要在设计应用架构时,理清核心的需求点。完成一个解决问题需求的最小的、最核心的设计结构。其他的业务逻辑或者应用需求,应该都是基于这个核心结构进行扩展。

再来说说软件设计的6大原则:

  • 开闭原则:即扩展式开放的;修改是关闭的。
  • 单一职责原则:避免职责扩散,每个类都应该仅完成一个功能
  • 里氏代换原则:子类可以扩展父类的功能,但是不能改变父类原有的功能
  • 依赖倒置原则:解耦高层次与低层次实现的关系,采用接口之类的方法进行解耦
  • 接口隔离原则:客户端不应该实现不需要的接口方法
  • 迪米特法则:对象之间尽量保持最少的依赖关系

这几种法则,还得慢慢悟啊~

关于Java

在Java类中获取当前CLASS的路径

背景

核心包依赖于一个service,我通过Spring的方法获取到Spring mvc中的上下文,然后拿到bean。

public class BeanUtil {

	/**
* 获取当前web应用的spring上下文对象
* @return
*/
public static ApplicationContext getWebApplicationContext(){
return ContextLoader.getCurrentWebApplicationContext();
} /**
* 根据bean的id获取bean对象。
* @param beanId bean的id
* @return Object
*/
public static Object getBean(String beanId){
if (isEmpty(beanId)){
return null;
}
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
return wac.getBean(beanId);
} private static boolean isEmpty(String beanId) {
return beanId == null || beanId.trim().equals("");
}
}

由于设计上要求解耦核心包与运行时的依赖关系,所以不能使用这种方式。

于是就把service改造成了单例工厂,问题来了...单例工厂依赖于运行时的目录!这个目录是通过spring mvc获得的!这下难住我了...

试了一些方法:

System.getProperty("user.dir")

上面获取到的是JRE的目录,无法满足需求。

XXX.class.getClassLoader().getResource(File.separator.toString())

通过上面的方法就可以回去当前类编译出来的class的路径,通过这种方式也可以获得web容器发布后的地址。

String path = this.getClass().getClassLoader().getResource(File.separator.toString()).getPath();

Java中的回调

在Java中,其实也可以实现回调,不过就是传入一个接口而已!

interface ICallBack{
void run();
}
class CallBackClass implements ICallBack{
public void run(){
System.out.println(System.currentTimeMillis() );
}
}
class Controller{
public ICallBack CallBackObject = null;// 引用回调对象
Scanner input = new Scanner(System.in); //读取命令行输入
public Controller(ICallBack obj){
this.CallBackObject = obj;
}
public void Begin(){
while(input.next() != null){
CallBackObject.run();
}
}
}
public class Callback{
public static void main(String[] args) {
Controller obj = new Controller(new CallBackClass());
obj.Begin();
}
}

关于静态块引起的BUG

说来也巧,昨天刚看过《编程思想》,包含静态块的类加载的步骤,今天刚好遇到了这个问题。

简单描述下问题背景

我们在Java应用中需要使用嵌入式的Jruby,这样就需要启动ScriptContainer来编译ruby。而ScriptContainer在JVM只会维护一份,在我们的代码中是这样的:

static{
scriptContainer = new ScriptContainer();
}

由于之前使用Spring的上下文进行初始化,它会在web容器启动时就执行。后来改成单例工厂,就没有触发scriptContainer的初始化。

静态块在没有任何触发类加载的情况下,是不会执行。只有当你创建一个类的对象,或者访问了类的静态内容,才会触发。

因此投机取巧的使用下面这种方式就解决了问题:

//在类中添加静态变量
class XXX{
public static String a = "";
static{
//todo
}
}
//然后在容器初始化时执行:
XXX.a = "a";

关于Jquery

一般在使用JQuery的时候都会使用到大量的DOM操作,此时就容易出现各种性能问题。

减少DOM重绘

如果遇到大量的创建对象,应该减少DOM的重绘:

a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);

应该改成:

var html = xxx+xxx+xxx+xxx+xxx;
a.append(xxx);

使用事件捕获,避免大量的事件绑定

如果你有一个表格,表格会动态创建一些内容,那么如何为这些内容添加事件呢?

可以采用事件的机制:

$("#tableId").click(function(event){
var target = $(event.target);//包装成Jquery对象 if(event.target.nodeName === "TR"){//验证是否是点击到了某一行
//上面的校验方法不是很好,如果有其他更优美的方式,可以留言哈!
}
});

jquery验证、移除、添加class

$xxx.hasClass("classname");
$xxx.removeClass("classname");
$xxx.addClass("classname");

jquery添加CSS样式

$xxx.css("width","250px");

自适应高度的输入框

当你输入内容时,会自动计算高度:

//首先是html
<textarea class="form-control" id="textid" style="height:500px;" onpropertychange="this.style.height = this.scrollHeight + 'px';" oninput="this.style.height = this.scrollHeight + 'px';"></textarea> //然后是script
$textid = $("#textid");
$textid.change(function(){
$textid= $.parseJSON($textid.val());
$textid.css("height",$textid.scrollHeight+10+"px");
});

Java程序员的日常 —— 工作一天的收获的更多相关文章

  1. Java程序员的日常——经验贴(纯干货)

    工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar ...

  2. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

  3. Java程序员的日常 —— 多进程开发

    最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方 ...

  4. Java程序员的日常—— 《编程思想》关于类的使用常识

    Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...

  5. Java程序员的日常—— Properties文件的读写

    在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Prop ...

  6. Java程序员的日常——存储过程知识普及

    存储过程是保存可以接受或返回用户提供参数的SQL语句集合.在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装.可以在数据库中定义子程序,然后把子程序存储在数据库服务器, ...

  7. Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比

    早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的.中午虽然睡了半个小时,可是依然没有缓过来.整个下午都在混沌中....不过今天下载了一款手游--<剑侠情缘>,感觉不错,喜欢这种类型的游戏. 今 ...

  8. Java程序员的日常 —— 多进程开发IO阻塞问题

    本篇仍旧是源于最近的工作,总结一下纪念那些年埋下的坑... 背景故事 需求:"使用进程方式启动另一个程序!" 开发:"OK! Runtime.getRuntime().e ...

  9. Java程序员的日常 —— 《编程思想》持有对象

    集合框架可以说是Java里面必备的知识点了,日常的使用中也会遇到各种情况需要使用到集合.下面就简单介绍下各种集合的使用场景: List List可以看做是数组,实现的方式有两种: ArrayList ...

随机推荐

  1. 详解Oracle DELETE和TRUNCATE 的区别(摘)

    语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...

  2. protobuff 配合 libevent 在Linux 和windows 下的使用

    protobuff 配合 libevent 在Linux 和windows 下的使用待补全. libprotobuf.lib libproto-lite.lib libprotoc.lib

  3. [转载] Android.Hook框架xposed开发篇

    本文转载自: http://www.52pojie.cn/thread-396793-1-1.html 原帖:http://drops.wooyun.org/tips/7488 作者:瘦蛟舞 官方教程 ...

  4. return exit _exit

    (1)进程终止: C程序的终止分为两种:正常终止和异常终止. 正常终止分为: return, exit, _exit, _Exit, pthreade_exit. 异常中指分为: abort, SIG ...

  5. js灵活打印web页面区域内容的通用方法

      我们做网站,经常需要打印页面指定区域的内容,而网上关于这块的说法很多,各种各样的打印控件也不少.但许多打印方案都不怎么好,至少我不喜欢,要么封装复杂,要么难以维护.正好现在的项目也需要用到 ...

  6. 关于C# 窗体自动隐藏和加载的问题

    最近在写一个小项目,开发一个小程序配合其他软件使用,其中一款软件在使用工作时需要截图生成报告,此时不能有其他应用程式界面在显示器桌面显示,故需要自动隐藏和加载窗体,通过阅读Windows API实现了 ...

  7. NVelocity 表格行奇偶样式变换

    #foreach($test in $tests) #even <tr class="Test1"> #odd <tr class="Test2&quo ...

  8. sql sever 2008修改数据类型

    如果是新表,直接在表中修改: 如果不是新表,则须sql语句修改 附sql语句 alter table 表名 alter column 列名 新的数据类型

  9. ubuntu下完全安装mcrypt

    源文章: ubuntu下安装mcrypt 1.首先要下载三个软件 0libmcrypt-2.5.8.tar.gz 下载地址:http://sourceforge.net/project/showfil ...

  10. 《UML大战需求分析》阅读笔记3

    流程分析利器--活动图 活动图属于行为建模的一种.用来分析的不是系统中的某个属性,而是系统或是其中某个部分的活动.结构建模表达的是静态内容,行为建模表达的是动态内容. 在介绍活动图之前,先介绍一下行为 ...