1、JDK是什么?有什么用?

JDK(Java Development Kit)顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了
很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

2、JRE是什么?有什么用?

JRE(Java Runtime Environment)顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

3、jstack指令

jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项”-J-d64”,Windows的jstack使用方式只支持以下的这种方式:jstack [-l] pid。详见

4、Java指令有哪些

C:>java -help 用法: java [-options] class [args…] 
 (执行类) 或 java [-options] -jar jarfile [args…] 
 (执行 jar 文件) 其中选项包括: 
 -d32 使用 32 位数据模型 (如果可用) 
 -d64 使用 64 位数据模型 (如果可用) 
 -server 选择 “server” VM 
 -hotspot 是 “server” VM 的同义词 [已过时] 
 默认 VM 是 server.-cp <目录和 zip/jar 文件的类搜索路径> 
 -classpath <目录和 zip/jar 文件的类搜索路径> 
 用 ; 分隔的目录, JAR 档案 
 和 ZIP 档案列表, 用于搜索类文件。 
 -D<名称>=<值> 
 设置系统属性 
 -verbose:[class|gc|jni] 
 启用详细输出 
 -version 输出产品版本并退出 
 -version:<值> 
 需要指定的版本才能运行 
 -showversion 输出产品版本并继续 
 -jre-restrict-search | -no-jre-restrict-search 
 在版本搜索中包括/排除用户专用 JRE

5、java单元测试

使用JUnit,

6、JDBC的基本过程

(1)、加载JDBC驱动程序:
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),
这通过java.lang.Class类的静态方法forName(String className)实现。
例如:

try{    
   //加载MySql的驱动类    
   Class.forName("com.mysql.jdbc.Driver") ;   
    }catch(ClassNotFoundException e){     
  System.out.println("找不到驱动程序类 ,加载驱动失败!");   
    e.printStackTrace() ;     
  }

成功加载后,会将Driver类的实例注册到DriverManager类中。
(2)、提供JDBC连接的URL
•连接URL定义了连接数据库时的协议、子协议、数据源标识。
•书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始 子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:
(MySql的连接URL)

jdbc:mysql:           //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;    
  useUnicode=true:

表示使用Unicode字符集。如果characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。

characterEncoding=gbk:字符编码方式。
(3)、创建数据库的连接
•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数

据库的连接。
•使用DriverManager的getConnectin(String url , String username , String password )方法传入

指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。
例如:

//连接MySql数据库,用户名和密码都是root      
  String url = "jdbc:mysql://localhost:3306/test" ;      
   String username = "root" ;   
     String password = "root" ; 
       try{       
Connection con = DriverManager.getConnection(url , username , password ) ;     
   }catch(SQLException se){      
 System.out.println("数据库连接失败!");   
    se.printStackTrace() ;    
    }

(4)、创建一个Statement
•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式:

Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement(sql);
CallableStatement cstmt = con.prepareCall("{CALL demoSp(?,?)}");

(5)、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。具体实现的代码:

ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; 
  int rows = stmt.executeUpdate("INSERT INTO ...") ; 
  boolean flag = stmt.execute(String sql) ;

(6)、处理结果两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据:

while(rs.next()){
    String name = rs.getString("name") ;
    String pass = rs.getString(1) ; // 此方法比较高效
}

(列是从左到右编号的,并且从列1开始)
(7)、关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:

1、关闭记录集
2、关闭声明
3、关闭连接对象

if(rs != null){   // 关闭记录集       
    try{         
      rs.close() ;  
         }catch(SQLException e){    
           e.printStackTrace() ;   
        }            
 }        
     if(stmt != null){   // 关闭声明        
   try{           
    stmt.close() ;   
        }catch(SQLException e){  
             e.printStackTrace() ;  
         }         
    }           
  if(conn != null){  // 关闭连接对象    
        try{            
   conn.close() ;         
   }catch(SQLException e){        
       e.printStackTrace() ;  
          }           
  }

7、Java线程安全的类有哪些

vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在

web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

statck:堆栈类,先进后出

hashtable:就比hashmap多了个线程安全

enumeration:枚举,相当于迭代器

除了这些之外,其他的非线程安全的类和接口。
线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。

8、计算机有什么数据结构

常用的结构:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)

9、排序算法

稳定算法:
冒泡排序(bubble sort)
鸡尾酒排序 (Cocktail sort, 双向的冒泡排序)
插入排序 (insertion sort)
桶排序 (bucket sort)
计数排序 (counting sort)
合并排序 (merge sort)
原地合并排序
二叉排序树排序 (Binary tree sort)
鸽巢排序 (Pigeonhole sort)
基数排序 (radix sort)
Gnome 排序
图书馆排序

不稳定算法:
选择排序(selection sort)
希尔排序(shell sort)
组合排序
堆排序 (heapsort)
平滑排序
快速排序(quicksort)
内省排序 (Introsort)
Patience sorting

不实用算法:
Bogo排序
Stupid sort
珠排序(Bead sort)

10、除了Hibernate外,还有什么ORM的框架

(1)Hibernate 全自动 需要些hql语句
(2)iBATIS 半自动 自己写sql语句,可操作性强,小巧
(3)EclipseLink
ORM(Object-Relation Mapping,对象-关系映射),是一种为了解决面向对象与关系数据库存在的互一匹配的现象的技术。 就是model类与表中的列对应起来,将程序中的对象自动持久化到关系数据库中。

11、如何面向接口编程

首先面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
好处:
首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好地降低程序各模块之间的耦合,从而提高系统的可扩展性和可维护性。基于这种原则,通常推荐“面向接口”编程,而不是面向实现类编程,希望通过面向接口编程来降低程序的耦合。降低程序耦合度,提高系统的可扩展性和维护性。

12、MySQL如何优化百万级数据

http://www.2cto.com/database/201306/222839.html

13、登录流程怎么实现?怎样保证安全?

HTTPS是让请求,截获不了~~(叙述不准确,其实也是截获了没有用)。客户端混淆是截获了没有用。
从截获了没有用的思路上说,简单的单向Hash确实意义不大,攻击者伪造一模一样的POST(重放攻击)就能成功登陆。所以要使用加盐(SALT)Hash。服务器发送给客户端的登陆页面里嵌上一个一次性且有时效性的字符串Salt,客户端在传回密码时将Salt和密码连接在一起进行Hash再提交。这样客户端每次登录,由于获取到的Salt不同,产生的Hash值也不同,且登录后本次使用的Salt/Hash值立刻作废,攻击者无法通过重放截获的信息登录。
但是仍然并不是真正的安全:攻击者可以拦截客户端的登录请求使之不能到达服务器,然后自己提交拦截的登录

请求,从而以用户的身份登录。(也算是中间人攻击了吧)

14、如何防止SQL注入

普通用户与系统管理员用户的权限要有严格的区分;
强迫使用参数化语句;
加强对用户输入的验证;
多多使用数据库自带的安全参数;
必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点;
拒绝Cookie验证方式。

15、为什么要用PrepareStatement,原理

一、代码的可读性和可维护性
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次;
二、PreparedStatement尽最大可能提高性能
三、最重要的一点是极大地提高了安全性

16、MySQL、Oracle如何查询前几条记录

SQL Server 的语法:SQL Server中使用topSELECT TOP number|percent column_name(s) FROM table_name QL 语法:MySQL使用limit关键字

SELECT column_name(s) FROM table_name LIMIT number

例子

SELECT * FROM Persons LIMIT 5

Oracle 语法:Oracle中使用 ROWNUM关键字

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

例子1:查询Persons表中的前5条记录

SELECT * FROM Persons WHERE ROWNUM <= 5

例子2:查询procedure_no的最大值

SELECT  procedure_no  FROM (SELECT  *  FROM process_card_procedure where process_card_id=421 order 
by cast(procedure_no as int) desc) where rownum<=1

17、servlet要覆盖哪些方法

(1) init() 方法在 Servlet 的生命期中,仅执行一次 init() 方法。
(2) service() 方法service() 方法是 Servlet 的核心
(3) destroy() 方法destroy() 方法仅执行一次,即在服务器停止且卸装 Servlet 时执行该方法
(4) GetServletConfig()方法GetServletConfig ()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和 ServletContext 。
(5) GetServletInfo()方法GetServletInfo ()方法是一个可选的方法,它提供有关 servlet 的信息,如作者、版本、版权。当服务器调用 sevlet 的 Service ()、 doGet ()和 doPost ()这三个方法时,均需要 “请求”和“响应”对象作为参数。

18、JSP有哪些内置对象

JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
  1.request对象
  客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
  序号 方 法 说 明

1 object getAttribute(String name) 返回指定属性的属性值
  2 Enumeration getAttributeNames() 返回所有可用属性名的枚举
  3 String getCharacterEncoding() 返回字符编码方式
  4 int getContentLength() 返回请求体的长度(以字节数)
  5 String getContentType() 得到请求体的MIME类型
  6 ServletInputStream getInputStream() 得到请求体中一行的二进制流
  7 String getParameter(String name) 返回name指定参数的参数值
  8 Enumeration getParameterNames() 返回可用参数名的枚举
  9 String[] getParameterValues(String name) 返回包含参数name的所有值的数组
  10 String getProtocol() 返回请求用的协议类型及版本号
  11 String getScheme() 返回请求用的计划名,如:http.https及ftp等
  12 String getServerName() 返回接受请求的服务器主机名
  13 int getServerPort() 返回服务器接受此请求所用的端口号
  14 BufferedReader getReader() 返回解码过了的请求体
  15 String getRemoteAddr() 返回发送此请求的客户端IP地址
  16 String getRemoteHost() 返回发送此请求的客户端主机名
  17 void setAttribute(String key,Object obj) 设置属性的属性值
  18 String getRealPath(String path) 返回一虚拟路径的真实路径

  2.response对象
  response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
  序号 方 法 说 明
  

1 String getCharacterEncoding() 返回响应用的是何种字符编码
2 ServletOutputStream getOutputStream() 返回响应的一个二进制输出流
3 PrintWriter getWriter() 返回可以向客户端输出字符的一个对象
4 void setContentLength(int len) 设置响应头长度
5 void setContentType(String type) 设置响应的MIME类型
6 sendRedirect(java.lang.String location) 重新定向客户端的请求

  3.session对象
  session对象指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
  序号 方 法 说 明
  

1 long getCreationTime() 返回SESSION创建时间
2 public String getId() 返回SESSION创建时JSP引擎为它设的惟一ID号
3 long getLastAccessedTime() 返回此SESSION里客户端最近一次请求时间
4 int getMaxInactiveInterval() 返回两次请求间隔多长时间此SESSION被取消(ms)
5 String[] getValueNames() 返回一个包含此SESSION中所有可用属性的数组
6 void invalidate() 取消SESSION,使SESSION不可用
7 boolean isNew() 返回服务器创建的一个SESSION,客户端是否已经加入
8 void removeValue(String name) 删除SESSION中指定的属性
9 void setMaxInactiveInterval() 设置两次请求间隔多长时间此SESSION被取消(ms)

  4.out对象
  out对象是JspWriter类的实例,是向客户端输出内容常用的对象
  序号 方 法 说 明

1 void clear() 清除缓冲区的内容
2 void clearBuffer() 清除缓冲区的当前内容
3 void flush() 清空流
4 int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
5 int getRemaining() 返回缓冲区还剩余多少可用
6 boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
7 void close() 关闭输出流

  5.page对象
  page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
  序号 方 法 说 明
  

1 class getClass 返回此Object的类
2 int hashCode() 返回此Object的hash码
3 boolean equals(Object obj) 判断此Object是否与指定的Object对象相等
4 void copy(Object obj) 把此Object拷贝到指定的Object对象中
5 Object clone() 克隆此Object对象
6 String toString() 把此Object对象转换成String类的对象
7 void notify() 唤醒一个等待的线程
8 void notifyAll() 唤醒所有等待的线程
9 void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒
10 void wait() 使一个线程处于等待直到被唤醒
11 void enterMonitor() 对Object加锁
12 void exitMonitor() 对Object开锁

  6.application对象
  application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
  序号 方 法 说 明
  

1 Object getAttribute(String name) 返回给定名的属性值
2 Enumeration getAttributeNames() 返回所有可用属性名的枚举
3 void setAttribute(String name,Object obj) 设定属性的属性值
4 void removeAttribute(String name) 删除一属性及其属性值
5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本号
6 String getRealPath(String path) 返回一虚拟路径的真实路径
7 ServletContext getContext(String uripath) 返回指定WebApplication的application对象
8 int getMajorVersion() 返回服务器支持的Servlet API的最大版本号
9 int getMinorVersion() 返回服务器支持的Servlet API的最大版本号
10 String getMimeType(String file) 返回指定文件的MIME类型
11 URL getResource(String path) 返回指定资源(文件及目录)的URL路径
12 InputStream getResourceAsStream(String path) 返回指定资源的输入流
13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象
14 Servlet getServlet(String name) 返回指定名的Servlet
15 Enumeration getServlets() 返回所有Servlet的枚举
16 Enumeration getServletNames() 返回所有Servlet名的枚举
17 void log(String msg) 把指定消息写入Servlet的日志文件
18 void log(Exception exception,String msg) 把指定异常的栈轨迹及错误消息写入Servlet的日志文件
19 void log(String msg,Throwable throwable) 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件

  7.exception对象
  exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
  序号 方 法 说 明
  

1 String getMessage() 返回描述异常的消息
2 String toString() 返回关于异常的简短描述消息
3 void printStackTrace() 显示异常及其栈轨迹
4 Throwable FillInStackTrace() 重写异常的执行栈轨迹

  8.pageContext对象
  pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的

SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
  序号 方 法 说 明
  

1 JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)
2 HttpSession getSession() 返回当前页中的HttpSession对象(session)
3 Object getPage() 返回当前页的Object对象(page)
4 ServletRequest getRequest() 返回当前页的ServletRequest对象(request)
5 ServletResponse getResponse() 返回当前页的ServletResponse对象(response)
6 Exception getException() 返回当前页的Exception对象(exception)
7 ServletConfig getServletConfig() 返回当前页的ServletConfig对象(config)
8 ServletContext getServletContext() 返回当前页的ServletContext对象(application)
9 void setAttribute(String name,Object attribute) 设置属性及属性值
10 void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值
11 public Object getAttribute(String name) 取属性的值
12 Object getAttribute(String name,int scope) 在指定范围内取属性的值
13 public Object findAttribute(String name) 寻找一属性,返回起属性值或NULL
14 void removeAttribute(String name) 删除某属性
15 void removeAttribute(String name,int scope) 在指定范围删除某属性
16 int getAttributeScope(String name) 返回某属性的作用范围
17 Enumeration getAttributeNamesInScope(int scope) 返回指定范围内可用的属性名枚举
18 void release() 释放pageContext所占用的资源
19 void forward(String relativeUrlPath) 使当前页面重导到另一页面
20 void include(String relativeUrlPath) 在当前位置包含另一文件

  9.config对象
  config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
  序号 方 法 说 明

1 ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象
2 String getInitParameter(String name) 返回初始化参数的值
3 Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举