1、SSH:三大框架相关技能,Spring、Struts2、Hibernate;Struts2与Struts1的主要区别是什么?
struts1是单例模式存在线程安全问题;
struts2是多例模式不存在安全问题;
struts1的action依赖servlet的api,使得execute要在容器中进行;
struts2的action不依赖容器,使得execute可脱离容器执行;
struts1通过validate方法或valitor扩展校验;
struts2除了validate方法校验外还可以通过框架校验;
struts1要求action继承Action或DiapatcherAction
struts2一般继承ActionSupport
Struts1可以使用jstl和el表达式
struts2可以使用jstl和ognl表达式
2、Spring依赖注入的实现方式有哪3种?其特征都是什么?
set
构造器
接口
3、Socket编程的基本原理和注意事项;
Socket编程解决了不同主机进程间的相互通信问题
① 声明一个套接字类型的变量,需要在该变量定义中提供本机 IP 地址和通信端口并指明协议类型
② 向对方发出连接请求,连接时编程者需要提供对方 TCP/IP 地址和通信端口,
同时SOCKET实现程序会自动向对方提供本机 TCP/IP 地址和通信端口;
③ 如果连接成功,会收到对方的应答信号,这以后的通信就可以通过套接字的相关操作来实现了。
注意事项:
①s = new Socket(fm_ipaddr,fm_port); 这种写法,在对方端口当掉时,客户端会一直等待连接,并不会抛出异常。
推荐写法:
s = new Socket();
s.setSoTimeout(180000);//读取数据超时设置3m
s.connect(new InetSocketAddress(fm_ipaddr,fm_port), 2000);//建立连接超时设置
②s.sendUrgentData(0xFF);//判断一下网络是否断开
③是否关闭输出流和输入流
对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭。
所以一般不用关闭流,直接关闭socket就可以了。
④UDP发送数据的地址和接收数据的地址不一致的问题。
UDP 的客户端发送给服务器,如果服务器的用于接收的网络接口有多个 IP 地址,
那么服务器送响应的时候就会自动选择一个primary IP 地址回送给客户端。
primary IP 地址有可能和客户端发送的 IP 地址不一样。
如果客户端根据接收的响应的 IP 地址来判断是否是服务器发送的响应,那么就有可能出错。
解决办法,一个是改造客户端:不再用 IP 地址判断是否是一个服务器发送的数据包,而是根据 DNS 得到的域名来判断。
缺点是系统一定要有域名服务器,而且查询域名会影响效率;
一个办法是服务器不是用 wildcard 来绑定 socket ,而是为每一个 IP 地址绑定一个 socket 。
缺点是系统如果动态改变了 IP 地址就需要重新起动服务器,而且增加服务器必须 select(),用来检查所有的 socket 。
⑤socket 的端口号
客户端的 socket 很少调用 bind() 来指明 socket 的端口号。相反通常是让操作系统自动分配一个端口号。
TCP客户端 socket 的端口号是在调用了 connect() 之后,系统会自动分配端口号。
UDP客户端 socket 的端口号是在第一次调用 sendto() 之后,系统会自动分配端口号。
如果 UDP 的端口是自动分配的话,那么系统不会再改变这个端口号。
4、网络编程中的心跳机制原理和实现;
原理:
实现:
Client启动一个定时器,不断发心跳;
Server收到心跳后,给个回应;
Server启动一个定时器,判断Client是否存在:
时间差策略
收到一个心跳后,记录当前时间(记为recvedTime)。
判断定时器时间到达,计算多久没收到心跳的时间(T)=当前时间 - recvedTime(上面记录的时间)。
如果T大于某个设定值,就可以认为Client超时了。
5、过去工作中是否有接触过接口通信,报文发送等技术;具体原理和实现如何?
客户端:
接收:
InetAddress ip = InetAddress.getLocalHost();
int port = 8888;
DatagramSocket getSocket = new DatagramSocket(port, ip);
byte[] buf = new byte[1024];
DatagramPacket getPacket = new DatagramPacket(buf, buf.length);
getSocket.receive(getPacket);
发送:
String getMes = new String(buf, 0, getPacket.getLength());
SocketAddress sendAddress = getPacket.getSocketAddress();
String feedback = "接收方说:我收到了!";
byte[] backBuf = feedback.getBytes();
DatagramPacket sendPacket = new DatagramPacket(backBuf, backBuf.length, sendAddress);
getSocket.send(sendPacket);
getSocket.close();
服务端:
发送:
DatagramSocket sendSocket = new DatagramSocket();
String mes = "你好!接收方!";
byte[] buf = mes.getBytes();
int port = 8888;
InetAddress ip = InetAddress.getLocalHost();
DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip, port);
sendSocket.send(sendPacket);
接收:
byte[] getBuf = new byte[1024];
DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);
sendSocket.receive(getPacket);
String backMes = new String(getBuf, 0, getPacket.getLength());
System.out.println("接受方返回的消息:" + backMes);
sendSocket.close();
6、多线程的实现方式有哪2种?区别主要是什么?线程池等概念;
继承thread类: 不能资源共享。可以通过自身类的实例调用start
实现Runnable接口: 资源共享,同步快:synchronized (this) 。runnable接口没有start方法,需要调用Thread类的start方法
线程池:
调用线程的时候初使化一定数量的线程,有线程过来的时候,先检测初使化的线程还有空的没有,
没有就再看当前运行中的线程数是不是已经达到了最大数,如果没有,就新分配一个线程去处理;
但如果已经达到了最大数,另外的线程就只有等了,直到有新的“空闲线程”为止。
线程池减少了在创建和销毁线程上所花的时间以及系统资源的开销
// 创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
// 将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
// 关闭线程池
pool.shutdown();
7、过去开发的过程中代码是如何管理的?
8、请谈谈过去工作中自己认为比较有成就感的事情是什么?
9、对自己未来的职业如何规划?对当前新技术跟踪学习情况如何?
10、最新的JavaSE、JavaEE的版本是多少?都有哪些新的特征和改进?
jdk7相比jdk6增加了一些功能、优化了性能以及简化了语法,比如:
1.更简单的异常处理语句
6.jvm优化、支持非java语言、正式支持G1垃圾收集器
2.字符串支持switch
3.二进制值定义
4.泛型类型推断
5.多线程中增加了并行分解框架(fork/join),以前看的时候这个还在测试
11、Oracle 中一个存储过程的格式分成哪几部分
12、Ibatis 和 Hibernate 的区别
13、缓存怎样实现
14、SERVLET多线程怎样实现
servlet依赖于一个线程池来服务请求。
线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程.
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,
然后由该线程来执行Servlet的 service方法。
当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,
容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,
那么这个Servlet的service()方法将在多线程中并发执行。
Servlet容器是默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,
对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。
实现 SingleThreadModel 接口:
如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。
同步对共享数据的操作:
synchronized (this){XXXX}
避免使用实例变量
线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
15、从前项目中,Java和数据库之间用的是什么接口?怎样实现接口间传递数据
JDBC、JNDI
Class.forName(driver);
Connection con = DriverManager.getConnection(url , username , password) ;
preparedstatement ps = conn.preparestatement(sql);
ResultSet rs = ps.executeQuery(sql);
while(rs.next()){
...
}
16、什么是SQL中的左连接与右连接
select * from a left join b on a.aid = b.bid
struts1是单例模式存在线程安全问题;
struts2是多例模式不存在安全问题;
struts1的action依赖servlet的api,使得execute要在容器中进行;
struts2的action不依赖容器,使得execute可脱离容器执行;
struts1通过validate方法或valitor扩展校验;
struts2除了validate方法校验外还可以通过框架校验;
struts1要求action继承Action或DiapatcherAction
struts2一般继承ActionSupport
Struts1可以使用jstl和el表达式
struts2可以使用jstl和ognl表达式
2、Spring依赖注入的实现方式有哪3种?其特征都是什么?
set
构造器
接口
3、Socket编程的基本原理和注意事项;
Socket编程解决了不同主机进程间的相互通信问题
① 声明一个套接字类型的变量,需要在该变量定义中提供本机 IP 地址和通信端口并指明协议类型
② 向对方发出连接请求,连接时编程者需要提供对方 TCP/IP 地址和通信端口,
同时SOCKET实现程序会自动向对方提供本机 TCP/IP 地址和通信端口;
③ 如果连接成功,会收到对方的应答信号,这以后的通信就可以通过套接字的相关操作来实现了。
注意事项:
①s = new Socket(fm_ipaddr,fm_port); 这种写法,在对方端口当掉时,客户端会一直等待连接,并不会抛出异常。
推荐写法:
s = new Socket();
s.setSoTimeout(180000);//读取数据超时设置3m
s.connect(new InetSocketAddress(fm_ipaddr,fm_port), 2000);//建立连接超时设置
②s.sendUrgentData(0xFF);//判断一下网络是否断开
③是否关闭输出流和输入流
对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭。
所以一般不用关闭流,直接关闭socket就可以了。
④UDP发送数据的地址和接收数据的地址不一致的问题。
UDP 的客户端发送给服务器,如果服务器的用于接收的网络接口有多个 IP 地址,
那么服务器送响应的时候就会自动选择一个primary IP 地址回送给客户端。
primary IP 地址有可能和客户端发送的 IP 地址不一样。
如果客户端根据接收的响应的 IP 地址来判断是否是服务器发送的响应,那么就有可能出错。
解决办法,一个是改造客户端:不再用 IP 地址判断是否是一个服务器发送的数据包,而是根据 DNS 得到的域名来判断。
缺点是系统一定要有域名服务器,而且查询域名会影响效率;
一个办法是服务器不是用 wildcard 来绑定 socket ,而是为每一个 IP 地址绑定一个 socket 。
缺点是系统如果动态改变了 IP 地址就需要重新起动服务器,而且增加服务器必须 select(),用来检查所有的 socket 。
⑤socket 的端口号
客户端的 socket 很少调用 bind() 来指明 socket 的端口号。相反通常是让操作系统自动分配一个端口号。
TCP客户端 socket 的端口号是在调用了 connect() 之后,系统会自动分配端口号。
UDP客户端 socket 的端口号是在第一次调用 sendto() 之后,系统会自动分配端口号。
如果 UDP 的端口是自动分配的话,那么系统不会再改变这个端口号。
4、网络编程中的心跳机制原理和实现;
原理:
实现:
Client启动一个定时器,不断发心跳;
Server收到心跳后,给个回应;
Server启动一个定时器,判断Client是否存在:
时间差策略
收到一个心跳后,记录当前时间(记为recvedTime)。
判断定时器时间到达,计算多久没收到心跳的时间(T)=当前时间 - recvedTime(上面记录的时间)。
如果T大于某个设定值,就可以认为Client超时了。
5、过去工作中是否有接触过接口通信,报文发送等技术;具体原理和实现如何?
客户端:
接收:
InetAddress ip = InetAddress.getLocalHost();
int port = 8888;
DatagramSocket getSocket = new DatagramSocket(port, ip);
byte[] buf = new byte[1024];
DatagramPacket getPacket = new DatagramPacket(buf, buf.length);
getSocket.receive(getPacket);
发送:
String getMes = new String(buf, 0, getPacket.getLength());
SocketAddress sendAddress = getPacket.getSocketAddress();
String feedback = "接收方说:我收到了!";
byte[] backBuf = feedback.getBytes();
DatagramPacket sendPacket = new DatagramPacket(backBuf, backBuf.length, sendAddress);
getSocket.send(sendPacket);
getSocket.close();
服务端:
发送:
DatagramSocket sendSocket = new DatagramSocket();
String mes = "你好!接收方!";
byte[] buf = mes.getBytes();
int port = 8888;
InetAddress ip = InetAddress.getLocalHost();
DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip, port);
sendSocket.send(sendPacket);
接收:
byte[] getBuf = new byte[1024];
DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);
sendSocket.receive(getPacket);
String backMes = new String(getBuf, 0, getPacket.getLength());
System.out.println("接受方返回的消息:" + backMes);
sendSocket.close();
6、多线程的实现方式有哪2种?区别主要是什么?线程池等概念;
继承thread类: 不能资源共享。可以通过自身类的实例调用start
实现Runnable接口: 资源共享,同步快:synchronized (this) 。runnable接口没有start方法,需要调用Thread类的start方法
线程池:
调用线程的时候初使化一定数量的线程,有线程过来的时候,先检测初使化的线程还有空的没有,
没有就再看当前运行中的线程数是不是已经达到了最大数,如果没有,就新分配一个线程去处理;
但如果已经达到了最大数,另外的线程就只有等了,直到有新的“空闲线程”为止。
线程池减少了在创建和销毁线程上所花的时间以及系统资源的开销
// 创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
// 将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
// 关闭线程池
pool.shutdown();
7、过去开发的过程中代码是如何管理的?
8、请谈谈过去工作中自己认为比较有成就感的事情是什么?
9、对自己未来的职业如何规划?对当前新技术跟踪学习情况如何?
10、最新的JavaSE、JavaEE的版本是多少?都有哪些新的特征和改进?
jdk7相比jdk6增加了一些功能、优化了性能以及简化了语法,比如:
1.更简单的异常处理语句
6.jvm优化、支持非java语言、正式支持G1垃圾收集器
2.字符串支持switch
3.二进制值定义
4.泛型类型推断
5.多线程中增加了并行分解框架(fork/join),以前看的时候这个还在测试
11、Oracle 中一个存储过程的格式分成哪几部分
12、Ibatis 和 Hibernate 的区别
13、缓存怎样实现
14、SERVLET多线程怎样实现
servlet依赖于一个线程池来服务请求。
线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程.
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,
然后由该线程来执行Servlet的 service方法。
当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,
容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,
那么这个Servlet的service()方法将在多线程中并发执行。
Servlet容器是默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,
对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。
实现 SingleThreadModel 接口:
如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。
同步对共享数据的操作:
synchronized (this){XXXX}
避免使用实例变量
线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
15、从前项目中,Java和数据库之间用的是什么接口?怎样实现接口间传递数据
JDBC、JNDI
Class.forName(driver);
Connection con = DriverManager.getConnection(url , username , password) ;
preparedstatement ps = conn.preparestatement(sql);
ResultSet rs = ps.executeQuery(sql);
while(rs.next()){
...
}
16、什么是SQL中的左连接与右连接
select * from a left join b on a.aid = b.bid