iptv相关
几个概念 运营商、内容提供商
电信联通所涵盖的领域,各自的特点等
程序集
jsp如何转化为servlet
c# var的使用
jdk:
原理性的知识
数据库连接池的原理
threadlocal是什么,什么时候用,跟线程是什么关系
socket 同步异步的实现方式?
hibernate支持集群吗?如何实现集群?
迅雷面试题:http://www.iteye.com/topic/534019
JVM原理,http://developer.51cto.com/art/201009/227004.htm http://effort-fan.iteye.com/blog/1025819
内存溢出
就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出;
内存泄漏
就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源。
缺省情况下 mysql不支持事务,默认auto
mysql的特点
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,现在已经
被Sun公司收购,支持FreeBSD、Linux、MAC、Windows等多种操作系统
与其他的大型数据库例如Oracle、DB2、SQL Server等相比功能稍弱一些
1、可以处理拥有上千万条记录的大型数据
2、支持常见的SQL语句规范
3、可移植行高,安装简单小巧
4、良好的运行效率,有丰富信息的网络支持
5、调试、管理,优化简单(相对其他大型数据库)
两种创建线程的区别:
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
1.synchronized和lock的区别
1).Lock 的锁定是通过代码实现的,而 synchronized 是在 JVM 层面上实现的
synchronized 在锁定时如果方法块抛出异常,JVM 会自动将锁释放掉,不会因为出了异常没有释放锁造成线程死锁。但是 Lock 的话就享受不到 JVM 带来自动的功能,出现异常时必须在 finally 将锁释放掉,否则将会引起死锁。
2).在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好,不管用没用过5.0多线程包的程序员都能理解。
3).ReentrantLock:
ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。
4).Atomic:
和上面的类似,不激烈情况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。
2.Linux学习曲线:
学的是红帽的企业版本,初级学了基本的管理比如:组,用户,磁盘,软件安装,各种服务的搭建及配置。高级学了:安全,集群,负载均衡,虚拟化,存储,云计算,电子商务综合部署。(我们的课程是这样,但是我笨,没学好)
3.Apache服务器虚拟目录配置:
<VirtualHost localhost:8086>
<Directory "E:\zuma">
Options FollowSymLinks
AllowOverride All
Order Deny,Allow # 该行表示文件夹下文件可以被访问 而Order allow,deny 表示文件不可以访问 报403错误
Allow from all
</Directory>
</VirtualHost>
5.将java注册为windows服务的工具
6.多线程下载原理
多线程就是多个任务同时进行,比如总共100M,一个线程下1-10M,一个线程下11-20M,以此类推,当然,某一时刻还是只有一个线程在占用cpu,用时间片轮转,好像多个线程都在同时进行,除非是双核,那可以实现2个线程同时进行,等下载完后,会把资源再拼接起来,你看迅雷每次到99.9%的时候都要停顿相对较长的时间,我个人觉得应该是在拼接资源。
其实多线程下载是一个断点传输的扩展,断点传输是告诉服务器要下载文件的一段到某一段的内容,从而实现这次下不完,下次继续下载的可能性,而多线程就是利用个线程同时建立多个断点下载的过程,一般来说,访问服务器获得文件是200返回,但是断点的返回状态是206,客户端会根据返回状态来确定如何保持文件和服务器是否支持断点传输。
7.Apache 超时相关,似乎apache有必要开个专题
在APACHE的httpd.conf中,KeepAlive指的是保持连接活跃,类似于Mysql的永久连接。
换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。
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,分别实现将类方法或者属性从一个类移动到其子类或父类中。
几个命令:
查看最大线程数: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.思科、华为等设备基本配置大全(强烈推荐)
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支持签名相同,返回值相同的方法。
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是否能跨域请求,解决的办法:
21.遍历map的同时删除元素,如何避免ConcurrentModificationException.
产生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那就不一样了,他为每次请求都创建一次,使用一次,创建一次。 所以他可以把页面上表单写成自己实例字段。接受拦截器值注入。
24.servlet的执行流程:(原理)
servlet的功能离不开容器的支持。当web服务器(如apache)接收到一个http请求的时候,将请求交给servlet容器(通常是tomcat等),tomcat会对其请求的
url进行解析并根据web.xml中的配置关联到对应的servlet,同时将request和response对象交给他(request对象是在何时被封装的?)。然后就可以获取请求参数,并将返回信息封装到response中,返回到客户端,一旦请求处理完毕,容器就会刷新response对象,并将控制权交给web服务器。
25.Strust2中request先从valuestack中取值,如果取不到在去ActionContext中取值。
26.单例模式的标准三种写法
注意第三种双重检查锁模式,必须使用volatile关键字,保证线程不会从缓存中操作资源?(具体百度)
27.log4j的用法系列记录。
rootLogger 指定日志类别 如果是debug级别则所有日志都起作用,如果是error则只有error以上有效。
28.Dao(Data Acess Object)层的异常处理
考虑以下问题:
- DAO的公共接口中的方法是否抛出检查过的异常?
- 如果是的话,抛出何种检查过的异常?
- 在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 异常类。
29.SSH登陆服务器,不通过ftp上传文件的方式
30.jersey用法整理(一周后)
参考文章:
31.三大框架基础jar包都包括哪些,每个jar都是做什么的。一些common包的用处如io、loggin、dbcp等等
32.数据库连接池原理以及解决了什么问题?使用threadlocal的意义在于什么?他们之间的联系和区别以及分别是解决什么问题的?结合使用的意义?
33.AES算法当中,两种初始化写法导致结果完全不一样的原因是什么?
一种是指定密钥,就是128的字符串
另一种是随便的字符串,在初始化的时候 init(128,new SecureRandeom(key.getBytes());
感觉上第二种可能有某种规则填充不够位数的密钥?但不确定
34.session当中,多个用户登录问题,如何每个人用户资料保存在其肚子的session信息中??防止信息混乱?(Session概念不清 需复习)
35.tomcat配置数据源
36.Integer是一种不可修改(Immutable)的数据结构
创建完毕后不能修改值。
37.几种在<a href="">中调用javascript函数的方法区别。
href="javascritp:void(0);" onclick="youffucntion()"
void是个操作符 0表示返回undefined 地址不跳转 推荐写法
href="javascript:;" onclick="youffucntion()"
执行了一条空的js代码
href="#" onclick="youffucntion()"
执行后 跳到top
href="#" onclick="youffucntion();return false;"
执行后 返回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
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。否则会报一堆错误。
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
50.
配置struts.xml改变时 自动reload
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.