知识点记录
KeepAlive的连接活跃时间当然是受KeepAliveTimeOut限制的。如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。
所以,一般情况下,图片较多的网站应该把KeepAlive设为On。但是KeepAliveTimeOut应该设置为多少秒就是一个值得讨论的问题了。
如果KeepAliveTimeOut设置的时间过短,例如设置为1秒,那么APACHE就会频繁的建立新连接,当然会耗费不少的资源;反过来,如果KeepAliveTimeOut设置的时间过长,例如设置为300秒,
那么 APACHE中肯定有很多无用的连接会占用服务器的资源,也不是一件好事。
所以,到底要把KeepAliveTimeOut设置为多少,要看网站的流量、服务器的配置而定。
其实,这和MySql的机制有点相似,KeepAlive相当于mysql_connect或mysql_pconnect,KeepAliveTimeOut相当于wait_timeout。
# Timeout: The number of seconds before receives and sends time out.
#Timeout:接收和发送数据的超时设置,秒数
比如Timeout=n 秒,是不是说,比如一个http的tcp连接建立好后,服务器端最多等待n秒,如果这n秒钟客户端没有发来请求,服务器端会断开连接?
8.eclipse中的refactor工具: Push Down 和 Pull Up,分别实现将类方法或者属性从一个类移动到其子类或父类中。 9.linux最大线程数 http://hi.baidu.com/dburu/blog/item/f4a61ffae4403d8059ee90bb.html 几个命令: 查看最大线程数:cat /proc/sys/kernel/threads-max ulimit -a 10.Node.js的应用场景: 但这些场景均不是Node所擅长的。Node更擅长处理体积小的请求以及基于事件的I/O,使用Node解决客户端和服务器之间的快速沟通,使用表单提交将大量的数据发送给服务器,使用PHP和Perl来处理重型数据库操作以及动态HTML页面的生成。使用Node运行于服务器端来处理体积不大的请求。不管是采用Rails还是Spring以及各式各样的服务端容器,只要按需索取即可。一定要明白你需要解决的问题是什么,基于此采取最佳解决方案,而不是基于你当下所掌握的技能来解决遇到的问题。 Node的简单的初衷 学习Node可能会有些吃力,但是非常值得的。为什么?因为你正在寻求基于JavaScript的web应用的解决方案。这意味着你已有的JavaScript编程技能不会丢掉,当你需要使用PHP或者Perl时,你必须重新学习一门新的语言,而Node不必如此大动干戈。学习新语言带来的问题比学习他们带来的好处要大的多。 学习Node所面临的挑战是,你需要更加活跃思维,将程序拆成低耦合的小片段,然后像组装数组一样的组装他们。但Node和基于事件的I/O并不能解决所有问题,但确定的是,很多关键问题,只能依靠Node来解决。 11.精而不散 当你越来越深入你的编程时,你会发现你不必每个工具、API和所使用的框架都达到精通。将刀用在刀刃上,不要将锤子当成钻头来使用。了解每个工具所适用的场景和能解决的问题,然后找到这个工具的最适合的应用场景。如果你想变成超人式的通才(程序员往往什么都想知道),你离“专家”也就越来越远,所谓专家,就是指在一两个方面达到非常精通。当然,每个老板都希望能找到超人式的通才,但这种人往往可遇不可求。 12.思科、华为等设备基本配置大全(强烈推荐) http://down.51cto.com/data/339087# 13.java编码规范: 注释规范: ① 代码的版权信息。 ② 类描述信息,描述类的主要职责和用处。 ③ 方法描述信息,描述方法是做什么的,如何调用,最好给出调用代码示例。 ④ JavaDoc tags ,用来生成 Html 形式的 API 文档 ⑤ 内部实现注释,用于描述复杂的算法,长方法,从为什么要这么做角度去 描述 1)尽可能在类描述中加入代码调用示例,使用<pre></pre>标记,提示JavaDoc 工具不要改变格式. 2)使用@deprecated 废弃方法,不要删掉它。 3)对一些基本数据类型和不太可能通过继承进行扩展的类,应声明为final,提高效率。 4)每个方法不超过25行 5)里氏代换原则是继承复用的基石。 6)编写代码前,先编写注释(可以认为是伪代码) ,先想后写 7) 8) 9) 10) 11) 12) 13) 14) 15) 16) 17) 18) 19) 20) 14.泛型方法签名相同,返回值相同,编译不通过,原因是是jvm支持签名相同,返回值相同的方法。 泛型方法签名相同,返回值不同,编译可通过,原因是是jvm支持签名不同,返回值相同的方法,只是java语法不支持,但是通过泛型又可以。 http://topic.csdn.net/u/20090912/22/faeba87b-25e8-4110-bc1b-791a8aca78e6.html 15.if(1>2) String a = "1"; //编译错误 原因:java语法限制,if后面要跟一个statement,而一个变量的声明却不能算作是一个statement,所以无法通过。 建议:所有if语句都用{}包围 16.form提交主要有下面3种方式:application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准的编码格式。这是默认的方式
multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。二进制数据传输方式,主要用于上传文件
text/plain:窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。 17.REST的优点
可以利用缓存Cache来提高响应速度
通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
浏览器即可作为客户端,简化软件需求
相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
不需要额外的资源发现机制
在软件技术演进中的长期的兼容性更好 18.servlet转发和重定向的底层实现区别: sendRedirect 转发 : 实际上指定的是浏览器的location,因此无论是不是绝对路径,最后都要被转化为绝对路径的形式, 对于参数的传递只通过URL。 forward 重定向: 实际上通过转发流完成。服务端对client的发送数据的过程是通过先将数据输出到缓冲区,然后将缓冲区发送到 client,合适缓冲区会发送呢?三种情况: 1).缓冲区满。2).request请求完成。3).程序调用flush等方法。 如果在<JSP:FORWORD>之前有很多输出, 前面的输出已使缓冲区满,将自动输出到客户端, 那么这种重定向方式将不起作用,这一点应该特别注意。 19.java序列化的到底是什么 请记住序列化机制只保存对象的类型信息,属性的类型信息和属性值,和方法没有什么关系,你就是给这个类增加10000个方法,序列化内容也不会增加任何东西,不要想当然的臆测自己不了解的知识,动手去做! 20.Ajax是否能跨域请求,解决的办法: http://blog.csdn.net/beidou321/article/details/6490479 21.遍历map的同时删除元素,如何避免ConcurrentModificationException. http://www.blogjava.net/EvanLiu/archive/2008/08/31/224453.html 产生ConcurrentModificationException的原因就是: 执行remove(Object o)方法之后,modCount和expectedModCount不相等了。 然后当代码执行到next()方法时,判断了checkForComodification(),发现两个数值不等, 就抛出了该Exception。要避免这个Exception,就应该使用remove()方法。 也是同样的原因,但没有对应的add()方法。 Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时, 这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。 22.java定时器,计划任务. Timer类的用法。 Timer time = new Timer(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { LiveUsers lu = LiveUsers.getInstance(); } }, 0, 15); 停止任务: time.cancle(); 23.关于Servlet的多线程是如何实现?
- Servlet是单例的,一个servlet只在此servlet被第一次请求时创建一个实例,而之后的操作都是由容器来管理,容器启动多个线程调用这个servlet。
- Servlet是运行在Servlet容器中的,由Servlet容器来负责Servlet实例的查找、创建以及整个生命周期的管理
- Servlet整个生命周期可以分为四个阶段:类装载及实例创建阶段、实例初始化阶段、服务阶段以及实例销毁阶段。
- struts中action跟servlet也是同样原理,单例,创建一次,使用N次。所以也要使用实例字段,除非不会改变的值。
struts2中action那就不一样了,他为每次请求都创建一次,使用一次,创建一次。 所以他可以把页面上表单写成自己实例字段。接受拦截器值注入。
- DAO的公共接口中的方法是否抛出检查过的异常?
- 如果是的话,抛出何种检查过的异常?
- 在DAO实现类中如何处理异常?
- DAO方法应该抛出有意义的异常。
- DAO方法不应该抛出 java.lang.Exception.java.lang.Exception 太一般化了。它不传递关于底层问题的任何信息。
- DAO方法不应该抛出 java.sql.SQLException.SQLException 是一个低级别的 JDBC 异常。一个DAO应该力争封装JDBC而不是将JDBC公开给应用程序的其余部分。
- 只有在可以合理地预期调用者可以处理异常时,DAO 接口中的方法才应该抛出检查过的异常。如果调用者不能以有意义的方式处理这个异常,那么考虑抛出一个未检查的(运行时)异常。
- 如果数据访问代码捕获了一个异常,不要忽略它。忽略捕获的异常的 DAO 是很难进行故障诊断的。
- 使用链接的异常将低级别的异常转化为高级别的异常。
- 考虑定义标准 DAO 异常类。Spring Framework (参阅 参考资料)提供了很好的一套预定义的 DAO 异常类。
- SCP 用法:http://www.cnblogs.com/codinglog/archive/2009/11/17/1605021.html
- 利用secureCRT自带工具 sz 和 rz,注:大文件rar等,加上参数 be 上传如 rz -be (b表示binary)不要用ascii
- 理工puzzty附带的exe :pscp 多用于windows向linux传东西 pscp file root@IP:/home
- 1. 资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2. 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3. 新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,几年钱也许还是个新鲜话题,对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用,那么…….快在设计文档中加上这部分的内容吧。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。
4. 统一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。一个最小化的数据库连接池实现: - 介绍及java实现 http://www.soft6.com/tech/8/89970.html
执行后 返回false 页面不跳转 保存在当前位置 38.直接定义action的目标,不写java类。相当于一个转发 <!-- 直接导航的的 Action 定义 --> <action name="index" > <result >/jsp/login.jsp</result> </action> 十分有用,对于拦截器只拦截jsp的问题 迎刃而解。 39.struts2 标签中插入css属性: struts2标签有两个应用css的属性:cssClass和cssStyle。cssClass是你在css文件中创建的class的名称;cssStyle是一个css格式化串(内联的style)。 使用示例如下: <s:checkbox cssClass="mycheckbox" label="checkbox test" name="checkboxField1" value="aBoolean" fieldValue="true"/> 这是css文件: <style> .mycheckbox{ /* Your style here */ } </style> 40.在Struts2中使用servlet : 我们若想在struts2中使用servlet只需要在struts2配置文件中加入一个constant即可: <constantname="struts.action.excludePattern"value="/YourServletPattern"/> 注: include在英语中是“包含” exclude是它的反义词 41.改变struts中的.action扩展名 <constant name="struts.action.extension" value="html"/>放于<struts 之后和<package 之前 42.struts2 的action实现SessionAware接口,获取 session的原理。 原来默认拦截器在处理过程中发现action实现了sessionaware接口,便会调用实现的setSession方法,将actioncontext中的session注入到目标Action 中的session。源码分析:http://hi.baidu.com/winters1224/blog/item/7299e907c2681798d43f7cc2.html 43.远程登录linux的shell,中文乱码问题 vi /etc/sysconfig/i18n 改为: LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN" SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT="lat0-sun16" 44.生成的.class字节码文件 当中一些名字中包含$之类的是什么? 45.全局拦截器过滤非法用户请求(未登录等) <interceptors> <!-- 配置未登录进行操作的拦截Q--> <interceptor name="loginInterceptor" class="cn.redcdn.scweb.interceptor.SessionInterceptor"> </interceptor> <!-- 重新封装一个默认的拦截器栈Q --> <interceptor-stack name="myDefaultStack"> <interceptor-ref name="loginInterceptor" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <!-- 为这个包设置默认的拦截器Q--> <default-interceptor-ref name="myDefaultStack" /> <!-- 设置全局的返回Z--> <global-results> <result name="gotologin">/index.jsp</result> </global-results> 如果要不拦截某个action那么,在某一个action中加入默认的拦截器就可以覆盖全局拦截器。 <action name="regist" class="cn.redcdn.scweb.action.RegistAction"> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success">/login_complete.jsp</result> <result name="error"></result> </action> 46.threadlocal是什么?用处及用法?绑定数据库连接的意义?弊端? 47.struts2 action 返回类型 result 有几种 。默认的不写是的是什么类型。参数传递相关? 48.默认的action,当访问不存在action时候就会访问默认action。否则会报一堆错误。 http://archive.cnblogs.com/a/2125048/ 49. 一个典型的log4j配置
log4j.rootLogger=DEBUG
#将DAO层log记录到DAOLog,allLog中 使用时可以get("DAO")
log4j.logger.DAO=DEBUG,A2,A4
#将逻辑层log记录到BusinessLog,allLog中
log4j.logger.Businesslog=DEBUG,A3,A4
#A1--打印到屏幕上
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n
#A2--打印到文件DAOLog中--专门为DAO层服务
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=DAOLog
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
#A3--打印到文件BusinessLog中--专门记录逻辑处理层服务log信息
log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A3.file=BusinessLog
log4j.appender.A3.DatePattern='.'yyyy-MM-dd
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
#A4--打印到文件alllog中--记录所有log信息
log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A4.file=alllog
log4j.appender.A4.DatePattern='.'yyyy-MM-dd
log4j.appender.A4.layout=org.apache.log4j.PatternLayout
log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
struts.properties配置文件
#指定Struts2处于开发状态
struts.devMode = false
#指定Struts 2 配置文件改变后, Web框架是否重新加载Struts 2配置文件
struts.configurations.xml.reload = true
开发状态是什么: Once you set this attribute to true Struts will check the config file for every request. This will save lot of development time as you need not restart server for struts.xml changes.转载于:https://www.cnblogs.com/biGpython/archive/2012/03/24/2415647.html
总结
- 上一篇: ESET最近发现了一款新的Android
- 下一篇: 使用Kinect制作变身钢铁侠