一.Java基础部分.................................................................9
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?9
2、说说&和&&的区别。...........................................................9
3、在JAVA中如何跳出当前的多重嵌套循环?........................9
4、switch语句能否作用在byte上,能否作用在long上,能否作用在String上10
6、用最有效率的方法算出2乘以8等於几.........................10
7、请设计一个一百亿的计算器.............................................10
8、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?10
9、"=="和equals方法究竟有什么区别?.............................10
10、静态变量和实例变量的区别?........................................11
11、是否可以从一个static方法内部发出对非static方法的调用?11
12、Integer与int的区别...................................................11
13、Math.round(11.5)等于多少Math.round(-11.5)等于多少11
14、请说出作用域public,private,protected,以及不写时的区别11
15、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型............................................................................................12
17、写clone()方法时,通常都有一行代码(不是必须有),是什么?12
18、面向对象的特征有哪些方面...........................................12
19、java中实现多态的机制是什么?...................................12
20、abstractclass和interface有什么区别...................12
21、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized.....................................................................13
22、什么是内部类?StaticNestedClass和InnerClass的不同。13
23、内部类可以引用它的包含类的成员吗?有没有什么限制?13
24、String是最基本的数据类型吗.....................................13
27、String和StringBuffer的区别.....................................14
28、如何把一段逗号分割的字符串转换成一个数组.............14
30、final,finally,finalize的区别。............................14
31、运行时异常(Runtime)与检查异常(Checked)有何异同?.15
32、error和exception有什么区别...................................15
33、Java中的异常处理机制的简单原理和应用。..................15
34、请写出你最常见到的5个RuntimeException。..............15
35、Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?.............................16
36,Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法stop()和suspend()方法为何不推荐使用?.........................................16
38、同步和异步有何异同,在什么情况下分别使用他们?举例说明。17
39.下面两个方法同步吗?(自己发明).............................17
40、多线程有几种实现方法同步有几种实现方法...............18
41、启动一个线程是用run()还是start().........................18
42、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法.........................................................................18
43、线程的基本概念、线程的基本状态以及状态之间的关系.18
45、介绍Collection框架的结构.........................................18
46、ArrayList和Vector的区别..........................................19
47、HashMap和Hashtable的区别........................................19
48、List和Map区别.........................................................19
49、List,Set,Map是否继承自Collection接口..............19
50、List、Map、Set三个接口,存取元素时,各有什么特点?19
51、说出ArrayList,Vector,LinkedList的存储性能和特性19
51、去掉一个Vector集合中重复的元素...............................19
53、Collection和Collections的区别。...........................20
54、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢是用==还是equals()它们有何区别.....................................................20
55、你所知道的集合类都有哪些?主要方法?......................20
56、两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对.......................................................................................20
68、说出一些常用的类,包,接口,请各举5个..................20
59、Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?............................................................21
60、字节流与字符流的区别..................................................21
61、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。.....................................................................................21
62、描述一下JVM加载class文件的原理机制....................21
63、heap和stack有什么区别。..........................................21
64、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?..................................................21
65、什么时候用assert。.....................................................22
66、能不能自己写个类,也叫java.lang.String?..............22
67、SSH集成方式.................................................................22
二.算法与编程.....................................................................23
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。23
2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。.....................................24
3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。25
4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。..............................................................................25
5、说明生活中遇到的二叉树,用java实现二叉树...............26
8、递归算法题1...................................................................27
9、递归算法题2...................................................................28
10、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。28
11、有数组a[n],用java代码将数组元素顺序颠倒............30
12不使用递归遍历二叉树....................................................30
三.前端页面部分..................................................................32
3.当service有一个实例变量,doGet和doPost去调用这个变量,会出现什么问题,你是如何解决的。...................................................................32
4.有三台服务器,如果在一台服务器上登陆了这个用户,其他两台就不能再登陆这个用户,使用session共享,你是怎么做的。.............................32
5.写一个自定义标签要继承什么类.......................................32
6.Jsp如何处理json............................................................32
7.Jsp的重定向和转发的流程有什么区别..............................32
8.Jsp和servlet的区别......................................................32
9.jsp可以操作窗口吗?......................................................32
10.session的主要几个方法的区别.......................................33
11.jsp的三大指令,七大动作的具体功能............................33
12.获取页面的元素和值有几种方式,分别说一下.................33
13.servlet和javaScript的区别,他们分别是什么作用.....33
14.jsp的执行原理...............................................................34
16.HTML和Servlet的异同...................................................34
17.会话跟踪有哪些,他们的区别是什么...............................34
18.session和application的作用.......................................34
19.request,response,session和application是怎么用的34
20.有几种方式将页面的值传到后台......................................34
21.一个form表单的值如何获取...........................................34
22.传递参数到后台有几种方式.............................................35
23.Jsp中父页面中怎么拿到子页面的表单元素,不是拿值怎么拿35
24.定义一个String类型的字符串,如果重定向之后还能不能获得这个数据35
25.404和500是什么意思.....................................................35
26.写出5种JSTL常用标签..................................................35
28.
页面把一个元素隐藏的方法..................................................35
29.Session,application,cookie的区别..........................35
30.我们在web应用开发过程中经常遇到输出某种编码的字符,如ISO-8859-1,如何输出一个某种编码的字符串.....................................................35
32.怎么判断用户请求时是第一次,如果客户端和服务端断开怎么连到上一次操作35
33.如果创建servlet实例不用构造方法,怎么创建一个servlet实例35
34.Servlet是安全的吗?当service有一个实例变量,doGet和doPost去调用这个变量,会出现什么问题,你是如何解决的................................36
36.说明一下jsp中
37.pageContext有什么作用...............................................36
39.Filter与拦截器怎么执行的............................................36
40.Jsp中如何进行分页,项目中如何进行分页?..................36
41,关于Ajax的技术组成与核心原理..................................37
43.Xhtml和html有什么区别。............................................38
44.css的引入方式有哪些?link和@import的区别是?.......38
45.css选择符有哪些?哪些属性可以继承?优先级如何计算?内联和important哪个优先级高?..............................................................................38
46.前端页面由哪三层构成,分别是什么?作用是什么?......38
47.你曾经在哪些浏览器测试过兼容?这些浏览器的内核分别是什么?38
48.标签上title与alt属性的区别是什么?...............38
49.写出几种IE6BUG的解决方法?......................................38
50.描述cssreset的作用和用途。......................................39
51.你如何对网站的文件和资源进行优化?期待的解决方案包括:39
52.什么是语义化的html?...................................................39
53.清除浮动有几种方式?各自的优缺点是?........................39
54.解释下CSSsprites,以及你要如何在页面或网站中使用它?39
55,html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分HTML和HTML5?..........................................40
56.javascript的同源策略。...............................................40
57、HTML的form提交之前如何验证数值文本框的内容全部为数字否则的话提示用户并终止提交............................................................................40
59.jsp有哪些内置对象作用分别是什么分别有什么方法?40
60.jsp有哪些动作作用分别是什么.................................41
61、JSP的常用指令.............................................................41
62.JSP中动态INCLUDE与静态INCLUDE的区别?................41
63、页面间对象传递的方法..................................................42
三.Javaweb部分...............................................................42
1、Tomcat的优化经验..........................................................42
2、HTTP请求的GET与POST方式的区别................................42
3、解释一下什么是servlet;...............................................42
4、说一说Servlet的生命周期...........................................42
5、Servlet的基本架构........................................................42
6、ServletAPI中forward()与redirect()的区别?...........42
7、Request对象的主要方法:..............................................43
8、request.getAttribute()和request.getParameter()有何区别43
9、MVC的各个部分都有那些技术来实现如何实现..............43
10、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso-8859-1等,如何输出一个某种编码的字符串?..............................................44
四.数据库部分.....................................................................44
1、用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息。44
2、ORACLE和MySQL的区别。...............................................44
3、存储过程和函数的区别。................................................45
4、Oracle导入和导出方式...................................................45
5、Oracle分页方法.............................................................45
6、mysql的分页方法............................................................45
7、解释什么是死锁,如何解决Oracle中的死锁?...............46
8、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序............................................................................................46
9、存储过程与触发器必须讲,经常被面试到......................46
10、数据库三范式是什么....................................................48
11、说出一些数据库优化方面的经验..................................49
12、union和unionall有什么不同...................................49
13.用一条SQL语句查询出每门课都大于80分的学生姓名....49
14.所有部门之间的比赛组合................................................50
16.删除除了id号不同,其他都相同的学生冗余信息.............50
18.求出发帖最多的人:.......................................................50
19、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决...51
21、注册Jdbc驱动程序的三种方式......................................51
22、用JDBC如何调用存储过程.............................................51
23、JDBC中的PreparedStatement相比Statement的好处....51
24、Class.forName的作用为什么要用..............................51
25、大数据量下的分页解决方法。.......................................52
26、用JDBC查询学生成绩单,把主要代码写出来(考试概率极大).52
27、说出数据连接池的工作机制是什么...............................52
28、为什么要用ORM和JDBC有何不一样.........................53
29.数据库大数据处理.........................................................53
30.如何写出一个快排.........................................................53
31.什么是事务?什么是锁?..............................................54
32.维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?............................................................................................54
33.什么是内存泄漏?.........................................................54
34.触发器的作用?..............................................................54
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。..................................................54
35.常用的oracle操作的命令.............................................54
36,索引的优缺点............................................................55
37.使用oracle伪列删除表中重复记录:?.........................55
五.XML部分........................................................................55
1、xml有哪些解析技术区别是什么...................................55
2、你在项目中用到了xml技术的哪些方面如何实现的......55
4、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?............................................................................................56
六.流行的框架与新技术.......................................................56
1、..................................................谈谈你对Struts的理解。.56
2、Struts优缺点.................................................................56
3、STRUTS的应用(如STRUTS架构).......................................57
4、谈谈你对Hibernate的理解。.........................................57
5、你对Spring的理解。.....................................................58
6.Spring由哪些模块组成...................................................58
7.核心容器模块。..............................................................58
9、写Hibernate的一对多和多对一双向关联的orm配置....58
10、在DAO中如何体现DAO设计模式..................................59
11、spring+Hibernate中委托方案怎么配置.......................59
12.hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决;...........................................59
13.介绍一下Hibernate的二级缓存......................................59
14、Jdo是什么...................................................................60
16.IOC的优点是什么?.................................................61
18.什么是Spring的依赖注入?.......................................61
19.有哪些不同类型的IOC(依赖注入)方式?..............61
20.哪种依赖注入方式你建议使用,构造器注入,还是Setter方法注入?61
21.Spring对DAO的支持...................................................61
22.解释AOP...................................................................61
23.Aspect切面..............................................................61
25.连接点.........................................................................62
26.通知............................................................................62
29SpringMvc怎么和AJAX相互调用的.................................62
30当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理62
31SpringMvc里面拦截器是怎么写的...................................62
32讲下SpringMvc的执行流程..............................................63
33解释Spring支持的几种bean的作用域。.........................63
34,Spring框架中的单例bean是线程安全的吗..................63
35.解释Spring框架中bean的生命周期。........................63
36.哪些是重要的bean生命周期方法?你能重载它们吗?.64
38.什么是基于Java的Spring注解配置给一些注解的例子.64
39.什么是基于注解的容器配置.......................................64
40.怎样开启注解装配?....................................................64
41.使用Spring通过什么方式访问Hibernate...................64
42.Spring支持的ORM.......................................................64
43.如何通过HibernateDaoSupport将Spring和Hibernate结合起来?64
44.Spring支持的事务管理类型........................................65
45.Spring框架的事务管理有哪些优点?..........................65
49.什么是SpringMVC框架的控制器?...........................65
50.讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么65
51.SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决65
52.SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代65
53.如果在拦截请求中,我想拦截get方式提交的方法,怎么配置65
54.如果在拦截请求中,我想拦截提交参数中包含"type=test"字符串,怎么配置65
55.SpringMvc中函数的返回值是什么.................................66
56.SpringMVC怎么样设定重定向和转发的..........................66
57.SpringMvc用什么对象从后台向前台传递数据的............66
58.SpringMvc中有个类把视图和数据都合并的一起的,叫什么66
59.怎么样把ModelMap里面的数据放入Session里面..........66
61.当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理66
63.讲下SpringMvc的执行流程...........................................66
64,Hibernate是如何延迟加载..........................................66
66,如何优化Hibernate?...................................................67
67,在数据库中条件查询速度很慢的时候,如何优化...........67
69,Hibernate的主键生成机制............................................68
69,Mybatis比IBatis比较大的几个改进是什么?..............68
70,什么是MyBatis的接口绑定,有什么好处........................69
71,接口绑定有几种实现方式,分别是怎么实现的...............69
72,什么情况下用注解绑定,什么情况下用xml绑定.............69
73,MyBatis实现一对一有几种方式具体怎么操作的...........69
74,MyBatis实现一对多有几种方式,怎么操作的..................69
75,MyBatis里面的动态Sql是怎么设定的用什么语法.....69
78,讲下MyBatis的缓存.....................................................69
七.软件工程与设计模式.......................................................70
1、j2ee常用的设计模式?说明工厂模式。..........................70
2、开发中都用到了那些设计模式用在什么场合.................70
八.j2ee部分......................................................................71
2、应用服务器与WEBSERVER的区别?................................71
3、应用服务器有那些?.......................................................71
4、J2EE是什么?.................................................................71
5、J2EE是技术还是平台还是框架?什么是J2EE..................71
6、如何给weblogic指定大小的内存..................................71
7、如何设定的weblogic的热启动模式(开发模式)与产品发布模式71
8、如何启动时不需输入用户名与密码................................71
10、在weblogic中发布ejb需涉及到哪些配置文件.............71
11、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置................................................................................72
九,项目功能实现技术问题(附带源码).............................72
4,Activiti工作流学习-----基于5.19.0版本(4):...........72
5,Java关于IO流的介绍:.................................................72
6,MVC权限管理的实现流程:..............................................72
7,批量数据上传的sql.xml:..............................................72
8,struts—文件的上传和下载:...........................................72
十.其他问题.......................................................................72
1,svn的使用和搭建?........................................................72
2,git命令总结?..............................................................74
3.tomcat给你你怎样去调优...............................................75
4,Tomcat有几种部署方式...................................................76
第一种方法:.......................................................................76
5,eclipse中serverlocation灰色,如何修改?..............77
7,如何加大tomcat可以使用的内存?................................77
8,如何加大tomcat连接数?..............................................78
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同
&和&&都可以用作逻辑与的运算符,&&为短路与,&不是短路与。
另外&可以做为整数的位运算符
例1:对于if(str!=null&&!str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。
例2:If(x==33&++y>0)y会增长,If(x==33&&++y>0)不会增长
1.Break+标签
2.使用多个条件判断
3.使用方法的return
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。例如,
ok:for(inti=0;i<10;i++){
for(intj=0;j<10;j++){
System.out.println("i="+i+",j="+j);
if(j==5)
breakok;
}
另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
intarr[][]={{1,2,3},{4,5,6,7},{9}};
booleanfound=false;
for(inti=0;i for(intj=0;j if(arr[i][j]==5){ found=true; break; 第三种,使用方法的return privatestaticinttest(){ intcount=0; for(inti=0;i<10;i++){ count++; if(j==5){ returncount; return0; 作用在byte,short,char,int,enum 封装类对象,其它基本数据类型及引用数据类型都不能做为case的条件 2<<3 因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2<<3。 如果只是大整数运算,使用BigInteger就可以 如果有浮点数据参与去处,需要使用BigDecimal进行运算 Java中基本类型的浮点数运算是不精确的,需要使用BigDecimal运算,尤其是金融、会计方向的软件 引用变量不能重新赋值,但是引用指向的对象的内容可以变化 例1:finalStringBuffera=newStringBuffer("immutable"); a=newStringBuffer(""); 有编译错 例2: finalStringBuffera=newStringBuffer("immutable"); a.append(“123”); 正确 他们的区别主要存在在引用数据类型上 ==为比较两侧的对象是否同一对象,是用内存地址来比较的 equals是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关 ==可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException 除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。 总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 不可以。因为非static方法(实例方法)是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。 int是java提供的8种原始数据类型之一,意思整型,占用4字节。 Integer是java为int提供的封装类,是引用数据类型。 int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。 例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer 在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。 在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。 Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。 这四个作用域的可见范围如下表所示。 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly/default。 作用域 当前类 同package 子孙类 其他package public √ protected × friendly private 备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。 Overload是重载的意思,Override是覆盖的意思,也就是重写。 Overload和Override有共同之处,两个方法的方法名都必须相同,如果不同,既不构成Overload,也不构成Override。 a)参数列表完全相同:个数相同、类型相同、顺序相同 b)子类的返回值不能比父类的返回值范围大 c)子类方法抛出的异常不能比父类方法抛出的异常范围大 d)修饰符只能为public、protected、friendly,不能为private e)父子类方法不能使用static修饰 clone有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。 1.封装,隐藏内部实现,只暴露公共行为 2.继承,提高代码的重用性 3.多态,体现现实生活中相似对象的差异性 4.抽象,抽取现实世界中相似对象的共同点 通过继承父类或实现接口。不同子类或实现类对同一父类方法有不同的实现。根据对象调用相应的实现方法。另外对于相似的方法,可以使用重载。 含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstractclass,abstractclass类中的方法不必是抽象的。abstractclass类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为publicabstract类型,接口中的成员变量类型默认为publicstaticfinal。 下面比较一下两者的语法区别: 1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中没有普通成员变量 3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。 4.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为publicabstract类型。 5.抽象类中可以包含静态方法,接口中不能包含静态方法 6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。 7.一个类可以实现多个接口,但只能继承一个抽象类。 下面接着再说说两者在应用上的区别: 接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约; 而抽象类在代码实现方面发挥作用,可以实现代码的重用。 abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系! native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。 synchronized和abstract合用的问题不能共用,abstract方法只能存在于抽象类或接口中,它不能直接产生对象,而默认synchronized方法对当前对象加锁,没有对象是不能加锁。 另外synchronized不能被继承,子类继承时,需要另加修改符。 内部类就是在一个类的内部定义的类。内部可以定义在除参数位置上的任意位置。印象中有四种方式。 1.静态内部类需要使用static修饰,而普通内部类不能使用static修饰 2.静态内部类只能定义在和属性同级,普通内部类可以定义在除参数位置以外的任意位置 3.静态内部类必需有名称,而普通内部类可以是匿名的 4.静态内部类没有this引用,只此只能访问外部类的静态成员,而普通内部类可以访问外部类的全部成员 5.静态内部类访问外部类的同名函数时,使用“外部类名.方法名”即可,而普通内部类需要使用“外部类名.this.外部方法” 6.静态内部类可以定义静态方法,而普通内部类不能定义静态方法 1.如果内部类为静态内部类,只能调用外部类的静态成员;如果有重名成员,需要用“外部类名.成员名”访问;不能调用外部类的对象成员。 2.如果内部类为非静态内部类,则可以调用外部类的所有成员;如果有重名成员,需要使用“外部类名.this.外部方法” 基本数据类型包括byte、int、char、long、float、double、boolean和short。 String是引用数据类型。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer/StringBuilder类 这两个类都实现了CharSequence接口。 1.类型不同,因为不是一个类,也没有继承关系,做参数时不能共用 2.String对象是不可变对象,不能修改值。而StringBuffer是可变对象,能修改值。 3.拼接字符串时,String会产生新对象,而StringBuffer只是增加新字符,不产生新对象,因此效率高。 4.String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。 如果不查jdkapi,我很难写出来!我可以说说我的思路: StringTokenizertokener=newStringTokenizer(s,","); String[]result=newString[tokener.countTokens()]; Integeri=0; while(tokener.hasMoreTokens()){ result[i++]=tokener.nextToken(); intindex=-1; intoldIndex=0; List while((index=s.indexOf(',',index+1))!=-1){ ss.add(s.substring(oldIndex,index)); oldIndex=index+1; if(s.charAt(s.length()-1)==','){ ss.add(""); String[]array=ss.toArray(newString[ss.size()]); System.out.println(Arrays.toString(array)); 内部类要访问局部变量,局部变量必须定义成final类型 finalint[]number={20}; newThread(){ @Override publicvoidrun(){ for(intk=0;k<20;k++){ number[0]++; }.start(); Thread.sleep(10); System.out.println(number[0]); finally是异常处理语句结构的一部分,表示总是执行,用来释放资源。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用 error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理这样的情况。exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况。 异常是指java程序运行时(非编译)所发生的非正常情况或错误。 Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象中,该对象中包含有异常的信息。 Java可以自定义异常类,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。 提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、IllegelArgumentException、SecurityException。 throw程序出错时,手工抛出异常 try尝试执行,里面的语句可能出现异常,如出现异常需要处理 catch处理try中出现的异常 finally在try后执行清理操作,用于释放资源 java5以前,有如下两种: 第一种: newThread(){}.start();这表示调用Thread子类对象的run方法,newThread(){}表示一个Thread的匿名子类的实例对象,子类加上run方法后的代码如下: 第二种: newThread(newRunnable(){}).start();这表示调用Thread对象接受的Runnable对象的run方法,newRunnable(){}表示一个Runnable的匿名子类的实例对象,runnable的子类加上run方法后的代码如下: newThread(newRunnable(){ }).start(); 从Java5开始,还有如下一些线程池创建多线程的方式: ExecutorServicepool=Executors.newFixedThreadPool(3); pool.execute(newRunable(){ }); Executors.newCachedThreadPool().execute(newRunable(){ Executors.newSingleThreadExecutor().execute(newRunable(){ 有两种实现方法,分别使用newThread()和newThread(runnable)形式,第一种直接调用thread的run方法,所以,我们往往使用Thread子类,即newSubThread()。第二种调用runnable的run方法。 同步是指所有操作串行化执行,顺序不能改变,前一操作未完成,后个操作不执行。 异步是指所有操作可以并行执行,顺序无关。 例如寄信 同步:如果没有寄完,不能吃饭,邮递员10天后送到,发送人被饿死 异步:寄出后可以立即吃饭,邮递员送完后,通知发送人送信结果。 如果强调执行顺序的话,用同步。如果顺序无关,则可以用异步。 异步执行效率比同步高。 classTest{ synchronizedstaticvoidsayHello3(){ synchronizedvoidgetX(){ 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有五种,分别是synchronized、wait与notify、sleep、suspend、join synchronized:一直持有锁,直至执行结束 wait():使一个线程处于等待状态,并且释放所持有的对象的lock,需捕获异常。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,需捕获异常,不释放锁。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。 如果其它方法中使用当前对象作为锁对象,则不能; 如果其它方法中没有使用当前对象作为锁对象,则能。 在多任务操作系统中,为了提高CPU的利用率,可以使用多进程编程。但对进程通信比较困难,进程间数据不能共享,因此可以使用多线程编程。一个进程至少包含一个主入口线程。 Iterable ->Collection ->List ->ArrayList ->LinkedList ->Vector ->Stack ->Set ->HashSet ->TreeSet Map ->Hashtable ->HashMap ->LinkedHashMap Collections,不属于集合,是集合类的工具类 Arrays,不属于集合类,是数据对象的工具类 1.线程同步,Vector线程安全,ArrayList线程不安全 2.效率问题,Vector效率低,ArrayList效率高 3.增长数量,Vector以1.5倍增长,ArrayList以2倍增长 1.线程同步,Hashtable线程安全,HashMap线程不安全 2.效率问题,Hashtable效率低,HashMap效率高 3.HashMap可以使用null作为key,Hashtable不可以使用null为key 4.HashMap使用的是新实现,继承AbstractMap,而Hashtable是继承Dictionary类,实现比较老 5.Hash算不同,HashMap的hash算法比Hashtable的hash算法效率高 6.HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因为contains方法容易让人引起误解。 7.取值不同,HashMap用的是Iterator接口,而Hashtable中还有使用Enumeration接口 一个是存储单列数据的集合,另一个是存储键和值的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。 List,Set是,Map不是 List使用get(index)取值,也可以使用Iterator、toArray取值 Set只能通过Iterator、toArray取值 Map取值使用get(key)取值,也可以使用keySet取键值集合,也可使用values取值集合,entrySet取全部映射。 1.ArrayList和Vector使用数组存储元素;LinkedList使用链表存储元素 2.ArrayList和Vector插入删除数据时,需要搬运数据,效率较差;LinkedList使用链表,不需要搬运数据,效率高 3.ArrayList和Vectory查询时,按数组下标查询,不需要遍历,效率高;LinkedList需要遍历,查询效率底 4.ArrayList和Vector的区别见59条 1.自行遍历,用另外一个Vector来判断是否有重复 2.用Set(TreeSet或HashSet)来去重 3.用Apache的CollectionUtil工具类去重 VectornewVector=newVector(); for(inti=0;i Objectobj=vector.get(i); if(!newVector.contains(obj)) newVector.add(obj); 还有一种简单的方式,HashSetset=newHashSet(vector); Collection是集合类的上级接口,继承与他的接口主要有Set和List. Collections是针对集合类的一个工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 Set里的元素是不能重复的,元素重复与否视具体情况而定: 1.HashSet使用equals比较 2.TreeSet使用compareTo进行比较 最常用的集合类接口是List和Map。 List的具体实现包括ArrayList、Vector、LinkedList,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。 Set的具体实现包括HashSet和TreeSet,它们也是可变大小集合,但不适合用索引取值。 Map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。 ArrayList/Vector、LinkedList HashSet/TreeSetàSet Properties/HashTable/TreeMap/HashMap List的主要方法有: add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty Set的主要方法有: add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty Map的主要方法有: put、get、keySet、values、entrySet、clear、remove、isEmpty 1.equals等,hashCode同,因此重写equals方法必须重写hashCode 2.hashCode等,equals不一定同,但hashCode最好散列化 3.任何对象equalsnull都得false 4.没有继承关系的两个类,equals都得false 5.重写equals方法的类最好是值类,即不可变 要让人家感觉你对javaee开发很熟,所以,不能仅仅只列corejava中的那些东西,要多列你在做ssh项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。 常用的类:BufferedReader,BufferedWriter,FileReader,FileWirter,String,Integer, java.util.Date,System,Class,List,HashMap 常用的包:java.lang,java.io,java.util,java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate 常用的接口:List,Map,Document,NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate),Session(Hibernate),HttpSession 字节流,字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。 FileInputStream、FileReader、BufferedInputStream、BufferedReader、ZipInputStream、PrintStream、StringReader、ObjectInputStream、RandomAccessFile(不属于流,但像流) 字节流是按字节读取或写入设备,但字符流是以字符为单位读取或写入设备。 如果是二进制文件,需要用字节流读取。一般来说,字符流只处理文本文件。在设备中,大多数情况是以字节形式存储数据的,因此字符流通过需要传入字节流当参数。 序列化是把内存Java对象保存到存储介质中,反序列化就是把存储介质中的数据转化为Java对象。Java通过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。需要进行序列化的对象的类必须实现Serializable接口,通常情况下需要满足以下条件: 1.强烈建议手动生成serialVersionUID常量 2.如果需要加解密的话,需要实现两个方法readObject和writeObject方法 3.如果使用Hibernate二级缓存或其它缓存服务器的话,对象必须是可序列化的 4.如果需要远程调用对象或传值的话,则对像需要序列化 5.序列化类的可序列化成员必须也是可序列化的,不需要序列化的属性用transient修饰 1.查找当前ClassLoader中是否有此class的类对象,有则返回 2.若没有的话,向上递归所有的父ClassLoader中有无此class类对象,有则返回 3.若还没有,查找BootstrapClassLoader中有无此class类对象,有则返回 4.若还没有的话,使用findClass或resolveClass加载类对象 a.读取class二进制文件 b.根据字节数组生成Class对象 c.缓存到当前ClassLoader中 JVM加载class对象是懒加载,按需加载 Java的内存分为两类,一类是栈内存,一类是堆内存。 栈中存储的是当前线程的方法调用、基本数据类型和对象的引用,栈是有序的。 堆中存储的是对象的值,堆是无序的。 方法中的局部变量使用final修饰后,放在堆中,而不是栈中。 对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。 assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。 可以,如果非要实现java.lang.String,需要自已写ClassLoader,不然JVM优先加载默认rt.jar中的java.lang.String。 可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载rt.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。 虽然java提供了endorsed技术,可以覆盖jdk中的某些类,但是,能够被覆盖的类是有限制范围,反正不包括java.lang这样的包中的类。 (下面的例如主要是便于大家学习理解只用,不要作为答案的一部分,否则,人家怀疑是题目泄露了)例如,运行下面的程序: packagejava.lang; publicclassString{ publicstaticvoidmain(String[]args){ System.out.println("string"); 报告的错误如下: java.lang.NoSuchMethodError:main Exceptioninthread"main" 这是因为加载了jre自带的java.lang.String,而该类中没有main方法。 1.在web.xml中配置struts的servlet或filter入口类,同时在web.xml中配置spring的listener和配置文件路径 2.引用SSH所需的jar包放在WEB-INF/lib下,需要有struts-spring-plugin.jar 3.在struts.xml配置中,把Struts的Action类交由Spring托管 4.把Hibernate所需的DataSource,SessionFactory,Transcation,HibernateTemplate配置在Spring的配置文件中 5.Dao层的类有时需要继承HiberateDaoSupport类,如果有HibernateTemplate时,可以不继承 6.把Action、Service、Dao等类注册到Spring中管理 答: packagecom.bwie.interview; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintStream; importjava.util.StringTokenizer; publicclassAnswerB01{ publicstaticvoidmain(String[]args)throwsIOException{ StringTokenizertokenizer1=getTokenzer("/a.txt"); StringTokenizertokenizer2=getTokenzer("/b.txt"); PrintStreamout=newPrintStream("C:/c.txt"); while(tokenizer1.hasMoreTokens()&&tokenizer2.hasMoreTokens()){ out.println(tokenizer1.nextToken()); out.println(tokenizer2.nextToken()); out.close(); privatestaticStringTokenizergetTokenzer(StringfileName)throwsIOException{ InputStreamReaderreader=newInputStreamReader(AnswerB01.class.getResourceAsStream(fileName)); StringBuilderbuilder=newStringBuilder(1000); intlength=-1; char[]cs=newchar[1024]; while((length=reader.read(cs))!=-1){ builder.append(cs,0,length); reader.close(); returnnewStringTokenizer(builder.toString()); (大家正在做上面这道题,网上迟到的朋友也请做做这道题,找工作必须能编写这些简单问题的代码!) 答:listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略。 importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.FilenameFilter; publicclassAnswerB02{ FilesourceFolder=newFile("D:/java"); File[]files=sourceFolder.listFiles(newJavaFileFilter()); for(Filefile:files){ StringabsolutePath=file.getName(); StringtargetFile="D:/jad/"+absolutePath.substring(0,absolutePath.length()-5)+".jad"; copy(file,newFile(targetFile)); privatestaticvoidcopy(Filesource,Filetarget)throwsIOException{ FileInputStreaminput=newFileInputStream(source); FileOutputStreamout=newFileOutputStream(target); byte[]bs=newbyte[1024]; while((length=input.read(bs))!=-1){ out.write(bs,0,length); input.close(); privatestaticfinalclassJavaFileFilterimplementsFilenameFilter{ publicbooleanaccept(Filedir,Stringname){ returnname.endsWith(".java"); publicclassAnswerB03{ Strings="我ABC汉DEF"; System.out.println(substring(s,6)); publicstaticStringsubstring(Strings,intlength){ char[]cs=s.toCharArray(); StringBuilderbuilder=newStringBuilder(); for(charc:cs){ if(isAsc(c)){ }else{ count+=2; if(count>length){ builder.append(c); returnbuilder.toString(); publicstaticbooleanisAsc(charc){ returnc<128; 答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。 Stringcontent="中国aadf的111萨bbb菲的zz萨菲"; HashMapmap=newHashMap(); for(inti=0;i charc=content.charAt(i); Integernum=map.get(c); if(num==null) num=1; else num=num+1; map.put(c,num); for(Map.EntrySetentry:map){ system.out.println(entry.getkey()+":"+entry.getValue()); 估计是当初面试的那个学员表述不清楚,问题很可能是: 如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。 intengishCount; intchineseCount; intdigitCount; for(inti=0;i charch=str.charAt(i); if(ch>='0'&&ch<='9'){ digitCount++; }elseif((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){ engishCount++; chineseCount++; 这是组合设计模式。 我有很多个(假设10万个)数据要保存起来,以后还需要从保存的这些数据中检索是否存在某个数据,(我想说出二叉树的好处,该怎么说呢?那就是说别人的缺点),假如存在数组中,那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,因为要从第1个依次往后取,取出来后进行比较。平衡二叉树(构建平衡二叉树需要先排序,我们这里就不作考虑了)可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多,原理如下图: 代码如下: publicclassAnswerB04{ Noderoot=makeupTree(); traverse(root); privatestaticvoidtraverse(Nodenode){ if(node==null){ return; traverse(node.left); System.out.println(node.value); traverse(node.right); privatestaticNodemakeupTree(){ Noderoot=newNode(0); Nodenode1=newNode(1); Nodenode2=newNode(2); Nodenode11=newNode(11); Nodenode12=newNode(12); Nodenode21=newNode(21); Nodenode22=newNode(22); root.left=node1; root.right=node2; node1.left=node11; node1.right=node12; node2.left=node21; node2.right=node22; returnroot; publicstaticclassNode{ publicNodeleft; publicNoderight; publicintvalue; publicNode(intvalue){ this.value=value; 一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。 例:n=1237 则输出为: 1237, 2474, 4948, 9896, 提示:写程序时,先致谢按递增方式的代码,写好递增的以后,再增加考虑递减部分。 publicstaticvoiddoubleNum(intn){ System.out.println(n); if(n<=5000) doubleNum(n*2); Gaibaota(N)=Gaibaota(N-1)+n 第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大? packagecn.itcast; importjava.util.Date; publicclassA1{ System.out.println(computeAge(8)); publicstaticintcomputeAge(intn){ if(n==1) return10; returncomputeAge(n-1)+2; publicstaticvoidtoBinary(intn,StringBufferresult){ if(n/2!=0) toBinary(n/2,result); result.append(n%2); 本人只研究过冒泡排序、选择排序和快速排序,下面是快速排序的代码: 冒泡排序: privatestaticvoidbubbleSort(int[]array){ for(inti=1;i for(intj=0;j if(array[i] inttemp=array[i]; array[i]=array[j]; array[j]=temp; 快速排序: publicclassQuickSort{ publicvoidquickSort(String[]strDate,intleft,intright){ Stringmiddle,tempDate; inti,j; i=left; j=right; middle=strDate[(i+j)/2]; do{ while(strDate[i].compareTo(middle)<0&&i i++;//找出左边比中间值大的数 while(strDate[j].compareTo(middle)>0&&j>left) j--;//找出右边比中间值小的数 if(i<=j){//将左边大的数和右边小的数进行替换 tempDate=strDate[i]; strDate[i]=strDate[j]; strDate[j]=tempDate; i++; j--; }while(i<=j);//当两者交错时停止 if(i quickSort(strDate,i,right); if(j>left){ quickSort(strDate,left,j); String[]strVoid=newString[]{"11","66","22","0","55","22","0","32"}; QuickSortsort=newQuickSort(); sort.quickSort(strVoid,0,strVoid.length-1); for(inti=0;i System.out.println(strVoid[i]+""); publicclassAnswerB11{ int[]array={2,25,21,63,234,83}; reverse(array); privatestaticvoidreverse(int[]array){ for(inti=0;i array[i]=array[array.length-1-i]; array[array.length-1-i]=temp; importjava.util.Stack; publicclassAnswerB13{ Nodetree=makeupTree(); Stack NodecurrentNode=tree; while(currentNode!=null){ System.out.println(currentNode.value); stack.push(currentNode); currentNode=currentNode.left; if(currentNode==null){ Nodeparent=stack.pop(); currentNode=parent.right; if(stack.isEmpty()){ NodeparentParent=stack.pop(); currentNode=parentParent.right; Forward,执行页面跳转,将请求的处理转发到另一个页面Param:用于传递参数Include:用于动态引入一个jsp页面Plugin:用于下载javaBean或applet到客户端执行useBean:使用javaBeansetProperty:修改javaBean实例的属性值getProperty:获取javaBean实例的属性值 request.getParameter()返回客户端的请求参数与值request.getParameterNames()返回所有可用属性名的枚举request.getParameterValues()返回包含参数的所有值的数组13.servlet和javaScript的区别,他们分别是什么作用一个是服务端,一个是客户端Servlet是独立于平台和协议的服务器端的java应用程序,可以动态生成web页面,并采用响应--请求的模式提供web服务javaScript是一种解释性语言,用于向html页面提供交互行为,通常被直接嵌入在html页面中servlet是java语言编写的web应用js是基于html上的一种解释语言14.jsp的执行原理客户端发出请求(request),jsp引擎将jsp页面翻译成servlet的java源文件,在Tomcat中将源文件编译成class文件,并加载到内存中执行,把结果返回(response)给客户端。16.HTML和Servlet的异同不同:Html是静态,servlet是动态html页面由服务器直接返回,servlet是用来处理客户请求,并返回html页面//servlet需要服务器调用servlet方法生成动态html页面,且需要在web.xml中配置url路径 cookie是在客户端保持状态,session是在服务器端保持状态,由于cookie是保存在客户端本地的,所以数据很容易被窃取,当访问量很多时,使用session则会降低服务器的性能,application的作用域是整个工程里只有一个,可以在不同浏览器之间共享数据,所有人都可以共享,因此application也是不安全的 Session用于客户端与服务器之间保持状态的解决方案,数据保存在服务器内存中,底层是有cookie实现的Application的作用域是整个工程里只有一个,可以在不同浏览器之间共享数据,所有人都可以共享,因此application是不安全的。19.request,response,session和application是怎么用的Request是客户端向服务端发送请求Response是服务端对客户端请求做出响应Session在servlet中不能直接使用,需要通过getSession()创建,如果没有设定它的生命周期,或者通过invildate()方法销毁,关闭浏览器session就会消失Application不能直接创建,存在于服务器的内存中,由服务器创建和销毁20.有几种方式将页面的值传到后台可通过form表单的get或post将值传递到后台,也可通过setAttribute()方法将值传递到后台21.一个form表单的值如何获取在servlet中通过request.getParameter()方法可以获取表单的值或者是request.getParameterValuse(); 表单传参,url传参,jquery.ajax传参 1、Ajax特点:局部刷新、提高用户的体验度,数据从服务器商加载。2、AJax的技术组成:不是新技术,而是之前技术的整合Ajax:AsynchronousJavascriptAndXml;(异步的JavaScript和XML)包括的技术:JavaScript、XML、CSS、XMLHttpRequest异步:发送请求以后,不等结果,由回调函数处理。JavaScript:向服务器发送请求,获得返回结果,更新页面XML:用来封装数据 3、Ajax核心原理XMLHttpRequst对象:通过该对象向服务器发送请求。它是异步请求的技术,所有现代浏览器都支持(Chrome、IE5+)1)创建XMLHttpReuest对象非IE浏览器(Mozilla/Safari):varxhr=newXMLHttpRequest();IE:xhr=newActiveXObject("Msxml2.XMLHTTP");低版本IE:xhr=newActiveXObject("Microsfot.XMLHTTP");2)XMLHttpRequest对象的属性与方法a)方法:open("GET/POST",URL,true/false):用来向服务器建立连接有三个参数:参数1:提交方式,post或get参数2:请求的URL参数3:表示同步或异步请求,true:表示异步请求false:表示同步请求 send(data):发送请求参数:提交的内容。 POST方式:data就是提交的参数,send(username=root&password=abc123); GET方式:send(null) b)属性:onreadystatechange:设置状态改变时的回调函数,回调函数用来获取服务器数据。 onreadystatechange=function(){ } readyState:服务器状态响应状态码:0:未初始化1:正在加载2:加载完成3:请求进行中4:请求完成responseText:服务器返回的数据(文本格式) responseXML:服务器返回的数据(XML格式) Html(超文本标记语言)是标准通用标记语言下的一个应用,也是一种规范,一种标准。 Xhtml(可扩展超文本标记语言)是一种置标语言,表现方式与html类似,不过语法上更加严格,主要不同: 1,所有元素必须被正确嵌套, 2,所有标记必须闭合, 3,标签名,属性名必须小写字母, 4,所有的属性必须用“”括起来, 5,所有非标签一部分的><&都必须以编码形式, 6,所有属性必须要有值, 7,注释中不要有-- 8,图片必须要有说明文字 四种:内联,内嵌,外链,导入 区别: 1,link属于xhtml标签,@import完全是css提供的一种方式,link除了加载css还可以定义rss,定义rel属性等,@import只能加载css。 2,加载顺序差别:link引用的css是同时被加载的,@import引用的css会等到页面全部被下载完才会再被加载。 3,兼容性差别,@import是css2.1提出,ie5以上才支持,link没有兼容问题。 4,使用dom控制样式的差别,当用javascript去控制样式的时候,只能使用link,@import不是dom能控制的。 5,@import可以在css中再次引入其他样式表。 标签选择符,类选择符,id选择符,继承的不如指定的,id>class>Tagname Important优先级高 结构层:html由html或者xhtml负责创建,运用标签对网页内容的含义作出描述。 表示层:css由css负责创建,对如何显示有关内容做出回答。 行为层:javascript由javascript负责创建,负责回答应该如何对事件作出反应。 Ie(ie内核),火狐(Gecko),谷歌(webkit),opera(presto) Alt是在你的图片因为某种原因不能加载的时候在页面显示的提示信息,它会直接输出在原本加载图片的地方,title是在鼠标悬停在图片上的显示的小提示,鼠标离开就没了,绝大数html标签都支持title。 Cssreset重置浏览器的默认css样式,浏览器种类不同,默认样式不一样,通过使用cssreset重置,让他们统一,方便开发。 2,使用CDN(内容分发网络) 3,添加Expire/Cache-Control头 4,启用Gzip压缩 5,css放在页面最上面 6,scrip放在页面最下面 7,避免在css中使用Expressions 8,把js和css放在外部文件中 9,减少dns查询 10,压缩javascript和css 11,避免重定向 12,移除重复脚本 13,配置实体标签 14,使用ajax缓存 根据内容的结构化(内容语义化),选择合式的标签(代码语义化),便于开发者的阅读和写出更加优雅的代码的同时让浏览器的爬虫和机器更好地解析。 1,父级定义height(优点:代码少,简单易掌握;缺点:只适合固定高度元素,无法高度自适应) 2,结尾处使用空标签清除浮动:Clear:both(优点:理论上能清除所有标签的浮动,简代码少浏览器支持好;缺点:增加了无意义的标签) 3,父级定义伪类after和zoom(优点:浏览器支持好;缺点:代码多,两句代码结合使用才能让主流浏览器都支持) 4,父级定义overflow:hidden(优点:代码少,简单,浏览器支持好;缺点:必须定义width或者zoom,同时不能定义height,不能和position配合使用) 5,父级定义overflow:auto(优点:代码少,简单,浏览器支持好;缺点:必须定义width或者zoom,同时不能定义height,内部元素高度超过父级会出现滚动条 还有,父级一起浮动,父级定义display:table,结尾加br的clear:both等 是一种网页图片应用处理方式。它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢慢显示出来了。页面icon很多的情况下使用合适。 HTML5现在已经不是SGML的子集,主要是关于图像,位置,存储,多任务等功能的增加。 绘画canvas用于媒介回放的video和audio元素本地离线存储localStorage长期存储数据,浏览器关闭后数据不丢失;sessionStorage的数据在浏览器关闭后自动删除 语意化更好的内容元素,比如article、footer、header、nav、section 表单控件,calendar、date、time、email、url、search 新的技术webworker,websockt,Geolocation 移除的元素 纯表现的元素:basefont,big,center,font,s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes; 支持HTML5新标签: IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添加标签默认的样式: 当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架 functionchkForm(this){ varvalue1=this.d1.value; varlen=value1.length; for(vari=0;i if(value1.charAt(i)>"9"||value1.charAt(i)<"0"){ alert("含有非数字字符"); returnfalse; returntrue; (这个问题似乎不重要,不明白为何有此题) 答:JSP共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记 isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式) 标签不同 执行的时机不同,动态include是在运行时把两个JSP合并,静态include是在编译期合并动态include在页面发生改变时,能及时更新,而静态页面,不会再次重新编译 1.request 2.session 3.application 4.cookie 5.URL地址 1.内存优化-Xms 2.增加线程数maxThreads="150" 3.修正server.xml中的中文编码 4.BIO改NIO 答: 1.URL地址长度不同,GET支持的字符少 2.GET的密码是明文,安全问题,容易受到黑客攻击 3.GET只传输文本,不支持文件传输 4.GET方式通常用来查询,不用来修改数据,是幂等操作,修改数据用POST 答:通常Servlet特指HttpServlet,用来接受浏览器的访问请求,浏览器最常用的请求为GET和POST方式,还有其它五种,而HttpServlet分别有七个方法(PUT、DELETE、HEADER、TRACE、OPTION)处理这些类型的请求,另有一个是J2EE不支持的,是CONNECT。Servlet是J2EE规范中的重要成员,是构成WEB的重要组件 1.加载Servlet类 2.实例化 3.初始化init 4.处理请求serviceà进一步调用doGet/doPost方法 5.销毁destory 1.定义一个Servlet类,继承HttpServlet抽象类 2.在web.xml中定义一个servlet标签,配置类名和servlet名 3.配置servlet处理的URL请求连接,可以用模糊匹配 4.在J2EE生命周期中,一个Servlet只有一个实例 5.一个Servlet可以为多个请求服务,每个请求在独立的线程中执行 Forward:服务器端内部跳转,URL地址不变,属于单次请求 Redirect:服务器通知浏览器中转,URL地址发生改变,是两次跳转 Forward不能跨域跳转 Redirect可以跨域跳转 Forward在两个页面传值可以通过parameter,也可以通过attribute,能传递Java对象 Redirect在两个页面传值只能通过parameter,在URL中传参 setAttribute(Stringname,Object):设置名字为name的request的参数值 getAttribute(Stringname):返回由name指定的属性值 getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例 getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组 getCharacterEncoding():返回请求中的字符编码方式 getContentLength():返回请求的Body的长度 getHeader(Stringname):获得HTTP协议定义的文件头信息 getHeaders(Stringname):返回指定名字的requestHeader的所有值,结果是一个枚举的实例 getHeaderNames():返回所以requestHeader的名字,结果是一个枚举的实例 getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法 getParameter(Stringname):获得客户端传送给服务器端的有name指定的参数值 getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例 getParametervalues(Stringname):获得有name指定的参数的所有值 getProtocol():获取客户端向服务器端传送数据所依据的协议名称 getQueryString():获得查询字符串 getRequestURI():获取发出请求字符串的客户端地址 getRemoteAddr():获取客户端的IP地址 getRemoteHost():获取客户端的名字 getServerName():获取服务器的名字 getServletPath():获取客户端所请求的脚本文件的路径 getServerPort():获取服务器的端口号 removeAttribute(Stringname):删除请求中的一个属性 1.getParameter是表单数据或URL参数,不能在server端修改 getAttribute是两个页面或servlet之间内部跳转传递对象参数,可以修改 2.getParameter的类型只能是String getAttribute的类型可以是任意Java对象 3.forward跳转时才有attribute,redirect时,attribute全部为null MVC是Model-View-Controller的简写。 Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),通常是数据访问层。 View是应用的表示层(由JSP页面产生)或模板框架,如freemarker、velocity Controller是提供应用的处理过程控制(一般是一个Servlet),负责页面间跳转 通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。 Model:JDBC、Hibernate、MyBatis View:JSP、FreeMarker、Struts Controller:SpringMVC、Struts、Servlet SpringSide集成Spring、Struts、Hibernate、WebService、View展示框架,作者江南白衣 publicStringtranslate(Stringstr){ try{ returnnewString(str.getBytes("ISO-8859-1"),"GBK").trim(); }catch(Exceptione){ System.err.println(e.getMessage()); thrownewRuntimeException(e); employee:eid,ename,salary,dept_id select*fromemployeeorderbydept_iddesc,salary; 1.Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高Oracle。 2.Oracle支持大并发,大访问量,是OLTP最好的工具。(OLTP[联机事务处理])(OLAP[数据仓库处理有了基础大数据后根据数据分析市场定位])。 3.安装所用的空间差别也是很大的,Mysql安装完后才几百M而Oracle有几G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。 4.Oracle和Mysql操作上的一些区别【开发人员接触的】 ①主键Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto_increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。 ②单引号的处理MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。 ③翻页的SQL语句的处理MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80 ④长字符串的处理长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 ⑤空字符的处理MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOTNULL来定义ORACLE表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。 ⑥字符串的模糊比较MYSQL里用字段名like'%字符串%',ORACLE里也可以用字段名like'%字符串%'但这种方法不能使用索引,速度不快。【like‘%’开头无法使用索引不使用开头可以使用索引】 ⑦Oracle实现了ANSIISQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较的弱 1).可以理解函数是存储过程的一种,都是预编译的【块语句每次运行都会编译存储过程块一次编译多次运行效率更高】Plsql块语句BeginEnd存储过程块Createprocedureprg_add()AsBeginEnd;2).函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值3).函数return返回值没有返回参数模式,存储过程通过out参数返回值,如果需要返回多个参数则建议使用存储过程【函数oracle在函数可以使用in和outmysql不能使用out】4).在sql数据操纵(DML)语句中只能调用函数而不能调用存储过程 使用oracle工具exp/imp 2.plsql导入/导出的是sql语句的文本文件 Oracle中使用rownum来进行分页,这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的select*from(selectrownumr,afromtabNamewhererownum<=20)wherer>10 select*fromcontentorderbyiddesclimit0,10 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似: select*fromcontentorderbyiddesclimit10000,10 一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。 此时,我们可以通过2种方式: 一,子查询的分页方式来提高分页效率,飘易用的SQL语句如下: SELECT*FROM`content`WHEREid(SELECTidFROM`content`ORDERBYiddescLIMIT".($page-1)*$pagesize.",1)ORDERBYiddescLIMIT$pagesize 为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。(via)通过explainSQL语句发现:子查询使用了索引! idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra 1PRIMARYcontentrangePRIMARYPRIMARY4NULL6264Usingwhere 2SUBQUERYcontentindexNULLPRIMARY4NULL27085Usingindex 简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行 解决办法: 1).查找出被锁的表 selectb.owner,b.object_name,a.session_id,a.locked_mode fromv$locked_objecta,dba_objectsb whereb.object_id=a.object_id; selectb.username,b.sid,b.serial#,logon_time fromv$locked_objecta,v$sessionb wherea.session_id=b.sidorderbyb.logon_time; 2).杀进程中的会话 altersystemkillsession"sid,serial#"; selectcount(*),a.dept_id fromemployeea where a.salary>(selectavg(b.salary)fromemployeebwhereb.dept_id='本部门') groupbya.dept_id orderbya.dept_id createorreplaceprocedureinsert_Student(_namevarchar,_ageint,out_idint) declear avarchar begin insertintostudentvalue(null,_name,_age); selectmax(stuId)into_idfromstudent; end; callinsert_Student('wfz',23,@id); select@id; mysql>createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW ->select*fromstudent; 触发器不允许返回结果 createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW insertintostudentvalue(null,'zxx',28); mysql的触发器目前不能对当前表进行操作 deletefromarticleswhereid=8; 这个例子不是很好,最好是用删除一个用户时,顺带删除该用户的所有帖子 这里要注意使用OLD.id 触发器用处还是很多的,比如校内网、开心网、Facebook,你发一个日志,自动通知好友,其实就是在增加日志时做一个后触发,再向通知表中写入条目。因为触发器效率高。而UCH没有用触发器,效率和数据处理能力都很低。 存储过程的实验步骤: mysql>delimiter| mysql>createprocedureinsertArticle_Procedure(pTitlevarchar(50),pBidint,out pIdint) ->begin ->insertintoarticle1value(null,pTitle,pBid); ->selectmax(id)intopIdfromarticle1; ->end; ->| QueryOK,0rowsaffected(0.05sec) mysql>callinsertArticle_Procedure('传智播客',1,@pid); QueryOK,0rowsaffected(0.00sec) mysql>delimiter; mysql>select@pid; @pid 3 1rowinset(0.00sec) mysql>select*fromarticle1; id Title bid 1 Test 2 chuanzhiboke 传智播客 3rowsinset(0.00sec) 触发器的实验步骤: createtableboard1(idintprimarykeyauto_increment,namevarchar(50),ar ticleCountint); createtablearticle1(idintprimarykeyauto_increment,titlevarchar(50) ,bidintreferencesboard1(id)); delimiter| createtriggerinsertArticle_Triggerafterinsertonarticle1foreachro wbegin ->updateboard1setarticleCount=articleCount+1whereid=NEW.bid; delimiter; insertintoboard1value(null,'test',0); insertintoarticle1value(null,'test',1); 第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式。 数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。 第二范式(2NF):在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。 要求数据库表中的每个实例或行必须可以被唯一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。 第三范式的要求如下: 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 所以第三范式具有如下特征: 1,每一列只有一个值 2,每一行都能区分。 3,每一个表都不包含其他表已经包含的非主关键字信息。 例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人姓名,否则,只要出现同一发帖人id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。 1.程序优化,用PrepareedStatement进行增删改查 2.程序优化,尽量批量处理,避免逐条处理,减小IO数 3.查询结果不要用*来查询所有字段,要明确指明结果字段 4.减少多表连接数,尽量少的表进行连接 5.表连接时,尽量用主键进行连接或用唯一索引 6.表的查询多时,一定建立索引 7.根据查询条件,建立索引,如果查询条件不止一个时,使用组合索引 8.在查询条件表达式的左侧尽量不要使用函数,否则索引失效 9.如果不得不用函数,则建立函数索引 11.如果有like话,尽量避免%xxx%两侧都有%的条件,单侧%可以使用索引,多侧不可以 12.尽量不用数据库,使用缓存 13.可以考虑用nosql数据库提高效率 14.SQL的条件表达式,在Oracle中,是按倒序使用索引的 15.如果用DDL改动了数据库表字段,需要重建索引,不然索引失效 16.SQL尽量不要有多余的空格和换行 17.使用分布式数据库 18.合理创建表分区表空间 19.建立索引时字段不能有null值 20.使用数据库连接池 union和unionall都是合并结果集 区别是: 1.union去除两个结果集的重复记录,unionall不去除重复记录,是两个结果集的加和 2.union效率低,unionall效率高 namekechengfenshu 张三语文81 张三数学75 李四语文76 李四数学90 王五语文81 王五数学100 王五英语90 答案: A:selectdistinctnamefromscorewherenamenotin(selectdistinctnamefromscorewherefenshu<=80) B:selectdistinctnamet1fromscorewhere80 一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合. selecta.name,b.name fromteama,teamb wherea.name>b.name 回复表:reply_id,article_id,reply_time,content select a.title,a.post_user,r.reply_time fromreplyr leftjoinarticleaona.article_id=r.article_id r.reply_id= ( selectmax(re.reply_id) fromreplyre re.article_id=r.article_id ) 学生表(student)如下: id号学号姓名课程编号课程名称分数 idsidnamecnocnamescore 12005001张三0001数学69 22005002李四0001数学89 32005001张三0001数学69 A:deletefromstudentwhereidnotin(selectmin(id)fromstudentgroupbysid,name,cno,cname,score) selectmax(post_count),b.post_user_id,u.name from selectcount(*)aspost_count,a.post_user_id fromarticlea groupbya.post_user_id )b leftjoinuseruonu.user_id=b.post_user_id。 方案一:updateusersetscore=0; dropcolumnscore;altertableuseraddcolumnscoreint。 在Oracle中,动了表结构,索引失效 方案三:使用Java程序,for循环,效率最差 方案四:使用存储过程loop循环,效率其次差 1.Class.forName(driver) 2.ClassLoader.loadClass(driver) 3.newXXXDriver(); Class.forName("com.mysql.jdbc.Driver"); Stringurl="jdbc:mysql:///test"; Connectioncn=DriverManager.getConnection(url,"root","root"); Stringsql="{callinsert_student(,,)}"; CallableStatementcstmt=cn.prepareCall(sql); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.setString(1,"wangwu"); cstmt.setInt(2,25); cstmt.execute(); //get第几个,不同的数据库不一样,建议不写 System.out.println(cstmt.getString(3)); 一个sql命令在数据库执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令,执行指令等过程。 1.PrepareStatement第一次执行某SQL时可以把最终结果缓存到数据中,以后再执行同一格式的SQL时,不再进行优化,直接使用缓存中的优化结果,效率比较高。 2.参数传值,可以防止SQL注入 答:按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。 有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。 查询结果集如果记录数比较多时,服务器内存和浏览器内存都可能溢出,另外,数据量太大客户端的性能会降低,滚动条较小,操作也不方便,需要数据库分页查询。 SQLServer分页: selecttop#pageSize#*fromstudentswhereidnotin (selecttop#pageSize#*(#pageNumber#-1)idfromstudentsorderbyid)orderbyid MySQL分页: select*fromstudentsorderbyidlimit#pageSize#*(#pageNumber#-1),#pageSize# Oracle分页: select*from select*,rownumrid select*fromstudentsorderbypostimedesc rid<=#pagesize#*#pagenumber# )ast wheret.rid>#pageSize#*(#pageNumber#-1) J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。 实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。 ORM是对象和关系型数据库映射,是把Java中的JavaBean对象和数据库表进行映射,使数据库表中的记录和JavaBean对象一一对应,从而大大简化原来直接使用JDBC时,手工拼写SQL带来的不便。 ORM通过配置文件,使数据库表和JavaBean类对应起来,提供简便的操作方法,增、删、改、查记录,不再拼写字符串生成SQL,编程效率大大提高,同时减少程序出错机率,增强数据库的移植性,方便测试。但是原生的JDBC具有更强的灵活性,适合复杂多变的SQL应用。 常用的ORM框架有:Hibernate、MyBatis、TopLink、OJB 1.大数据可以采用分布式数据库和建立分区表(PARTITION) 2.建立有效索引:主键索引、联合索引、倒序索引、函数索引(INDEX) 3.使用物化视图(MATERIALIZEDVIEW) 4.使用存储过程(PROCDUDER) 5.读写分离(goldengate软件实现) 6.归档旧数据(新旧数据查询,保证新数据的效率提高),程序做调整,旧数据和新数据查询页面分离 答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。 答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。 操作的命令: Sqlplus登陆用户 Conn连接数据库 Disconn断开数据库连接 Exit或quit退出sql*plus Pass修改用户口令 Showuser查看当前用户 List列出sql缓冲区的内容 Run或/执行缓冲区中的所有内容 Save文件名把缓冲区的内容保存到sql脚本文件 Get文件名将sql脚本文件中的内容加载到缓冲区 Start或@文件名将指定sql脚本文件加载到缓冲区并执行 Edit编辑缓冲区或sql脚本文件的内容 Spool文件名把sql*plus中的输入结果复制到指定文件中 Spooloff停止sql*plus中的输出结果复制,并关闭文件 Help命令名查看某个命令的详细帮助信息。 37.使用oracle伪列删除表中重复记录:?Deletetabletwheret.rowid!=(selectmax(t1.rowid)fromtablet1wheret1.name=t.name) 答:有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:StreamingAPIforXML(StAX) 讲解这些区别是不需要特别去比较,就像说传智播客与其他培训机构的区别时,我们只需说清楚传智播客有什么特点和优点就行了,这就已经间接回答了彼此的区别。 a:两种形式dtdschema,b:本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问 SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 1.struts是一个按MVC模式设计的Web层框架,实质是一个强大的Servlet。负责处理请求转发和路由。 2.struts的基本配置文件为struts-config.xml,里面配置了很多Action、ActionForm及中转规则,这个文件通过web.xml中的ActionServlet进行加载和初始化。 3.当用户请求发送到服务器端时,ActionServlet会接收到此请求,然后根据struts.xml中的配置找到相应的Action,同时根据ActionForm的配置,创建ActionForm的实例并进行赋值,当做参数交给Action进行业务处理,返回ActionMapping对象。 4.ActionServlet根据struts.xml中action的配置,forward到指定的页面,把结果以JSP处理过的HTML返回给客户的浏览器。 5.可以继续谈一谈struts1和struts2的区别 2、Struts优缺点 优点: 2.有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率 3.页面导航 使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。 4.提供Exception处理机制. 5.数据库链接池管理 6.支持I18N 缺点 一、转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器 二、Struts的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。 三、测试不方便.Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具StrutsTestCase可以实现它的单元测试。 四、类型的转换.Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。 五、对Servlet的依赖性过强.Struts处理Action时必需要依赖ServletRequest和ServletResponse,所有它摆脱不了Servlet容器。 六、前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。 七、对Action执行的控制困难.Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。 八、对Action执行前和后的处理.Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作。 九、对事件支持不够.在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为applicationevent,applicationevent和componentevent相比是一种粗粒度的事件。 Struts是采用JavaServlet/JavaServerPages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。Struts有如下的主要功能:一.包含一个controllerservlet,能将用户的请求发送到相应的Action对象。二.JSP自由tag库,并且在controllerservlet中提供关联支持,帮助开发员创建交互式表单应用。三.提供了一系列实用对象:XML处理、通过JavareflectionAPIs自动处理JavaBeans属性、国际化的提示和消息 它是ORM思想的一个实现,对JDBC进行了很好的封装,它通过配置使JavaBean对象和数据库表之间进行映射,并提供对增、删、改、查便利的操作方法,同时支持事务处理,它对数据库记录还提供了缓存机制,提高效率,它可以使程序员不用书写SQL,也不用关心数据库SQL之间的差异,它通过方言对数据库进行了很好的适配。 1.Hiberante的主配置文件为hibernate.cfg.xml,其中定义了数据源、连接池、缓存、事务、表生成策略等配置 2.通过*.hbm.xml映射配置文件,定义了JavaBean对象和数据库表之间的映射关系,还定了对象和对象之间的映射关系,包括:一对一、多对一、一对多、多对多 5.Hiberante从3版本后,支持JPA规范,可以不使用映射文件配置,而全部采用JPA注解方式进行对象和数据库表的映射,Hibernate还扩容了JPA规范。 6.Hibernate对常用的缓存技术做了封装,可以轻松的调用各种缓存框架 Spring实质上讲就是一个Bean工厂,主要用来管理Bean的生命周期和框架集成。 Spring分为两个部分: 1.IOC控制反转(也叫DI依赖注入,此名由MardinFowler给出)。Spring的顶层容器为BeanFactory,常用的ApplicationContext为它的子接口,实现了工厂模式。Spring需要加载它的配置文件,通常配置文件名为applicationContext.xml或spring-config.xml,其中Bean的定义为 2.Spring容器负责根据配置文件创建Bean对象并进行对其的装载。Bean有懒加载,属性配置,自动装载,parentBean,abstractBean,FactoryBean(通常用于框架集成,需要了解BeanFactory和FactoryBean的区别),scope(singleton单例,prototype多例)。 3.Spring2.5后提供了对注释的支持,更加方便,在重构时作用巨大。 4.Spring的IOC解除了模块间的耦合,可以使项目多模块并行开发。 5.Spring还提供了AOP的支持,方便在切面级开发,例如事务控制、日志、性能、安全等。Spring的AOP有两种配置方式,都是通过动态代理技术实现的,一种是JDK自带的Proxy类的实现,一种是CGLIB动态代理实现,通过 6.Spring的重要做用是集成其它框架。Spring官方提供了许多类库对其它框架进行了封装,例如通过的事务模块、JMS框架的调用模块、Email支持、调试器Scheduler、JNDI等,同时其它框架也提供了针对Spring的集成包,例如Hibernate、MyBatis、Struts等 。 以下是Spring框架的基本模块: 这是基本的Spring模块,提供spring框架的基础功能,BeanFactory是任何以spring为基础的应用的核心。Spring框架建立在此模块之上,它使Spring成为一个容器。 hibernate的inverse属性的作用 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2 field2),然后在hql里面就可以直接生成这个bean了。 按照以下思路来回答:(1)首先说清楚什么是缓存,(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存,(3)最后再说如何配置Hibernate的二级缓存。 (1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码: 引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理 Dao { hashmapmap=newmap(); UsergetUser(integerid) Useruser=map.get(id) if(user==null) user=session.get(id); map.put(id,user); returnuser; Cachecache=null setCache(Cachecache) this.cache=cache UsergetUser(intid) if(cache!=null) Useruser=cache.get(id); cache.put(id,user); returnsession.get(id); (3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。 IOC或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。 依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。 你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。 Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,HibernateorJDO结合使用。这使我们可以方便切换持久层。编码时也不用担心会捕获每种技术特有的异常。 AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在SpringAOP中,切面通过带有@Aspect注解的类实现。 连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行SpringAOP的位置。 通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。 Spring切面可以应用五种类型的通知: Spring框架支持以下五种bean的作用域: 缺省的Springbean的作用域是Singleton. 不,Spring框架中的单例bean不是线程安全的。 有两个重要的bean生命周期方法,第一个是setup,它是在容器加载bean的时候被调用。第二个方法是teardown它是在容器卸载类的时候被调用。 Thebean标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。 基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。 以@Configuration注解为例,它用来标记类可以当做一个bean的定义,被SpringIOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。 开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。 注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 在Spring中有两种方式访问Hibernate: Spring支持以下ORM: 用Spring的SessionFactory调用LocalSessionFactory。集成过程分三步: Spring支持两种类型的事务管理: 控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。Hibernate中怎样实现类之间的关系(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 说下Hibernate的缓存机制 *内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存*二级缓存: a)应用及缓存 b)分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c)第三方缓存的实现Hibernate的查询方式Sql、Criteria,objectcomptositionHql: *属性查询*参数查询、命名参数查询*关联查询*分页查询*统计函数 *使用双向一对多关联,不使用单向一对多*灵活使用单向一对多关联*不用一对一,用多对一取代*配置对象缓存,不使用集合缓存*一对多集合使用Bag,多对多集合使用Set*继承类使用显式多态*表字段要少,表关联不要怕多,有二级缓存撑腰 1.建索引2.减少表之间的关联3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 总共23种,分为三大类:创建型,结构型,行为型 我只记得其中常用的6、7种,分别是: 创建型(工厂、工厂方法、抽象工厂、单例) 结构型(包装、适配器,组合,代理) 行为(观察者,模版,策略) 然后再针对你熟悉的模式谈谈你的理解即可。 Java中的23种设计模式: Factory(工厂模式),Builder(建造模式),FactoryMethod(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式),Facade(门面模式), Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式), Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式), Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式), Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式), Observer(观察者模式),State(状态模式),Strategy(策略模式), TemplateMethod(模板方法模式),ChainOfResponsibleity(责任链模式) Exception:针对错误网页,未捕捉的例外getMessage():返回异常的详细信息getClass():返回异常的名称 应用服务器:Weblogic、Tomcat、Jboss WEBSERVER:IIS、Apache BEAWebLogicServer,IBMWebSphereApplicationServer,Oracle9iApplicationServer,jBoss,Tomcat 答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterprieseapplicationmodel).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietntier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。 一个另类的回答:j2ee就是增删改查。 (这个问题不作具体回答,列出来只是告诉读者可能会遇到什么问题,你不需要面面俱到,什么都精通。) 在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加setMEM_ARGS=-Xms32m-Xmx200m,可以调整最小内存为32M,最大200M 可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加setPRODUCTION_MODE=true。 修改服务启动文件,增加WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码. 保存在此Domain的config.xml文件中,它是服务器的核心配置文件。 不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml 缺省安装中使用DemoIdentity.jks和DemoTrust.jksKeyStore实现SSL,需要配置服务器使用EnableSSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trustkeystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。 软件下载 服务器和客户端安装 建立版本库(Repository) 配置用户和权限 运行独立服务器 初始化导入 基本客户端操作 1,软件下载 下载Subversion服务器程序。 到官方网站的下载二进制安装文件,来到二进制包下载部分,找到WindowsNT,2000,XPand2003部分,然后选择"thisdirectory",这样我们可以看到许多下载的内容,目前可以下载svn-1.4.0-setup.exe。 下载Subversion的Windows客户端TortoiseSVN。 TortoiseSVN是扩展WindowsShell的一套工具,可以看作Windows资源管理器的插件,安装之后Windows就可以识别Subversion的工作目录。 官方网站是TortoiseSVN,下载方式和前面的svn服务器类似,在Download页面的我们可以选择下载的版本,目前的最高稳定版本的安装文件为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。 2,服务器和客户端安装 服务器安装,直接运行svn-1.4.0-setup.exe,根据提示安装即可,这样我们就有了一套服务器可以运行的环境。 安装TortoiseSVN,同样直接运行TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi按照提示安装即可,不过最后完成后会提示是否重启,其实重启只是使svn工作拷贝在windows中的特殊样式生效,与所有的实际功能无关,这里为了立刻看到好的效果,还是重新启动机器。 3,建立版本库(Repository) 运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如: svnadmincreateE:/svndemo/repository 就会在目录E:/svndemo/repository下创建一个版本库。 我们也可以使用TortoiseSVN图形化的完成这一步: 在目录E:/svndemo/repository下"右键->TortoiseSVN->CreateRepositoryhere...“,然后可以选择版本库模式,这里使用默认即可,然后就创建了一系列目录和文件。 4,配置用户和权限 来到E:/svndemo/repository/conf目录,修改svnserve.conf: #[general] #password-db=passwd 改为: [general] password-db=passwd然后修改同目录的passwd文件,去掉下面三行的注释: #[users] #harry=harryssecret #sally=sallyssecret 最后变成: [users] harry=harryssecret sally=sallyssecret 在这里,因为一般来说,项目的svn的用户名和密码是统一认证的,而为了不每次都输入密码,所以在使用TortoiseSVN的时候,直接都记住了密码,这里的用户名和密码最好和项目的一致,以免出现意外情况。 5,运行独立服务器 在任意目录下运行: svnserve-d-rE:/svndemo/repository我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。 在使用中发现,即使关闭了此窗口,svn一样好使~~不知道为啥~ 6,初始化导入 来到我们想要导入的项目根目录,在这个例子里是E:/svndemo/initproject,目录下有一个readme.txt文件: 右键->TortoiseSVN->Import... URLofrepository输入“svn://localhost/” ok 完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。 需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。 在这里,不知道为什么,使用svn://localhost/一直都搞不定,最后灵机一动使用了file:///E:/svndemo/repository/反而搞定了~~ 7,基本客户端操作 取出版本库到一个工作拷贝: 来到任意空目录下,在本例中是E:/svndemo/wc1,运行右键->Checkout,在URLofrepository中输入svn://localhost/,这样我们就得到了一份工作拷贝。 在工作拷贝中作出修改并提交: 打开readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。 察看所作的修改: readme.txt上右键->TortoiseSVN->ShowLog,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Comparewithworkingcopy,我们可以比较工作拷贝的文件和版本1的区别。 pwd命令:显示当前的目录 gitinit:把当前目录变成git可以管理的仓库 gitdiff文件名:查看修改了什么内容 gitreset--hard版本号:指定往前或往后穿越到任意一个版本,版本号通过gitreflog查看 gitreflog:查看版本操作历史,显示缩略版本号、commit备注 gitcheckout./--不带引号的文件名:撤销工作区修改。如果存在add但没有commit的内容,则回到add后的状态,删除没有add的修改;如果没有add的内容,则回到最近一次commit完的状态 gitcheckout--文件名:在commit之前执行,可恢复删除的文件 cat文件名:查看文件内容 gitbranch:查看当前所有分支,当前所在的分支前面加* gitbranch分支名:创建新分支,但不切换过去,如果当前已存在该分支则报错 gitcheckout分支名:切换到指定分支,如果该分支不存在则报错 gitcheckout-b分支名:创建新分支并切换到该分支,相当于上面两条命令先后执行,如果分支已存在则报错,并不会切换过去 gitbranch-d分支名:删除指定分支,必须在本分支上删除当前所在的分支,必须在其他分支上删除 gitmerge分支名:使当前所在分支内容和merge后面指定的分支内容一致,也就是修改当前所在的分支,接着删除merge后指定的分支也可以 gitremote(-v):查看远程库信息,加上-v查看详细信息 命令退不出来,按ctrl+C 输入前面输过的命令,按PgUp/PgDn 将web项目文件件拷贝到webapps目录中。 很灵活,在conf目录中,新建Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为: 第3个方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。 第2、3还有优点,可以定义一些个性配置,如数据源的配置等。 可以用tomcat在线后台管理器,一般tomcat都打开了,直接上传war就可以。 Eclipse中tomcatservice设置选择window----showview---services可以看到服务的面板双击tomcat进入配置界面ServiceLocations(Specifytheserverpath(i.e.catalina.base)anddeploypath.Servermustbepublishedwithnomodulespresenttomakechanges.)选项变灰色无法更改配置。若要更改,则先把tomcat下的所有項目移除。并右击,clean...之后方可设置。。。启动后将又变为黑色。 默认选项为:Useworkspacemetadata(dosenotmodifyTomcatinstallation)修改选项为:UseTomcatinstallation(takescontrolofTomcatinstallation)这样在Eclipse启动了tomcat服务器,我們也能夠访问到tomcat本地管理首页。否则只能在DOS下使用Tomcat的启动命令才能访问Tomcat本地管理首页。 注意:Deploypath由:wtpwebapps改为webapps tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。 Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置: JAVA_OPTS='-Xms【初始化内存大小】-Xmx【可以使用的最大内存】'