Struts、 spring 、 Hibernate 在各层的作用
1、 struts 负责 web 层 ,ActionFormBean 接收网页中表单提交的数据,然后通过 Action 进行处理,再 Forward 到对应的网页。在 struts-config.xml 中定义 <action-mapping>, ActionServlet 会加载。
2、 spring 负责业务层管理,即 Service (或 Manager).
(1) service 为 action 提供统计的调用接口,封装持久层的 DAO.
(2)可以写一些自己的业务方法。
(3)统一的 javabean 管理方法
(4)声明式事务管理
(5)集成 Hiberante
3 、Hiberante ,负责持久化层,完成数据库的 crud 操作, hibernate 为持久层,提供 OR/Mapping 。它有一组 .hbm.xml 文件和 POJO, 是跟数据库中的表相对应的。然后定义DAO ,这些是跟数据库打交道的类,它们会使用 PO 。
3.MVC主要就是在java开发中的一种设计模式
M:Modle(模型,主要是Service业务逻辑层和Dao和数据库取得连接并发送数据的层)
V: view(视图,也就是用户看的界面,通常是我们所熟知的前台页面,jsp等)
C: controller(控制层,可以把他看作一个中转,他接收从前台用户发来的请求,并调用service,dao把数据发送到后台,后台经过数据库的操作及业务逻辑分析又将数据返回给controller,最后再返回前台jsp页面)。
优点:
1,MVC设计模式可以说实现了分层开发。各个层都有各个层的作用。
2,降低了层与层之间的依赖,有利于代码的标准化开发
3,再用新的代码业务逻辑替换时,只需要替换相对应的层,大大降低了我们的工作量,分工明确。
7.面向对象几大特性
封装:封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用。
继承:一个类可以继承另一个类的一些特性,从而可以代码重用。
多态:同一操作作用于不同对象,可以有不同的解释,有不同的执行结果,这就是多态,简单来说就是:父类的引用指向子类对象。
8.list和ArrayList区别
List是接口,定义了一些方法,但是方法没有被实现;ArrayList是一个类,实现了List这个接口,List里边定义的方法,在ArrayList里边都实现
9. ArrayList和LinkedList有什么区别?
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据
10. Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
1)HashMap有一个叫做Entry的内部类,它用来存储key-value对。
2)上面的Entry对象是存储在一个叫做table的Entry数组中。
3)table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。
4)key的hashcode()方法用来找到Entry对象所在的桶。
5)如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。
6)key的equals()方法用来确保key的唯一性。
7)value对象的equals()和hashcode()方法根本一点用也没有。
重点内容
Put:根据key的hashcode()方法计算出来的hash值来决定key在Entry数组的索引。
Get:通过hashcode找到数组中的某一个元素Entry
11.==和equals的区别
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,
equals用来比较的是两个对象的内容是否相等
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String( "foo ");
String b=new String( "foo ");
则a==b将返回false。
12. InitBinder注解
作用是转换数据格式
@Controller
public class MyFormController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, newCustomDateEditor(dateFormat, false));
}
// ...
}
13.java怎么操作日期
SimpleDateFormatsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
14.String和StringBuilder、StringBuffer的区别?
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
15.抽象类和接口的区别
1 接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。
2 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。
3 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
5 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。
16. 阐述final、finally、finalize的区别
- final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。
- finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
- finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
17. List、Set、Map是否继承自Collection接口?
List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。
18. Collection和Collections的区别?
Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
20. Integer与int的区别
int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别
21. HashMap和Hashtable有什么区别?
HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
23.json和jsonp区别
Json是一种轻量级的数据传输格式,jsonp是一种跨域数据交互协议。
<spanstyle="font-size:18px;">//发送请求
$.ajax({
// url:"http://localhost:8081/rest/itemcat/list?callback=getMessage",
url:"http://localhost:8081/rest/itemcat/message",
type:"get",
cache:false,
dataType:"jsonp",
jsonp:"callback", //这里定义了callback的参数名称,以便服务获取callback的函数名即getMessage
jsonpCallback:"getMessage", //这里定义了jsonp的回调函数
success:function(data){
alert("success:"+data);
},
error:function(){
alert("发生异常");
}
});
function getMessage(jsonp){
alert("message:"+jsonp);
}</span>
24.Hashset怎么排序
将HashSet转换为List,然后使用Collections.sort()进行排序
List排序有自己的排序方法,sort
25.堆和栈区别
栈内存:当定义一个变量或对象的引用变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用
堆内存:用来存放由new创建的对象和数组, 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
不同维度的区别总结
1.空间分配区别:
栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2.堆栈缓存方式区别:
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3.堆栈数据结构区别:
堆(数据结构):先进先出,如树
栈(数据结构):一种先进后出的数据结构。如桶
26、cookie 和session的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
27、char型变量能不能存储一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
28、多线程有几种实现方法?是什么?同步有几种实现方法?是什么?
一种是实现Runnable 接口 一种是继承Thread类。
继承Thread:(首选这个,如果有了父类就用接口)
好处是:直接使用Thread类中的方法,代码简单
弊端是:如果已经有了父类,就不能使用这种方法
实现Runnable接口:
好处是:即使自己定义的线程类有了父类也没有关系,因为有了父类也可以实现接口,而接口是可以多实现的
弊端是:不能直接使用Thread类中的方法,需要先获取到线程对象后,才能得到Thread的方法,代码复杂
一种是用同步方法,一种是用同步块。
29、我们在 web 应用开发过程中经常遇到输出某种编码的字 符, 如 iso8859-1 等, 如何输出一个某种编码的字符串?
public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"),"GBK");
tempStr = tempStr.trim();
}catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
30、hibernate核心配置文件是什么 ?对象映射文件名称通常是类名加上什么组成的
hibernate的配置文件hibernate.cfg.xml
Hibernate的映射文件*.hbm.xml
33、try {}里有一个return 语句,那么紧跟在这个 try 后的 finally {}里的code 会不会被执行,什么时候被执行,在return 前还是后?
会在return中间执行!
try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 return 语句先执行,finally 语句后执行,但 return 并不是让函数马上返回,而是 return 语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回!但此时会出现两种情况:
①、如果finally中也有return,则会直接返回并终止程序,函数栈中的return不会被完成!;
②、如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中的try中的return的内容返回并终止程序;
catch同try;
jquery中如何来获取或和设置属性?
jQuery中可以用attr()方法来获取和设置元素属性
removeAttr() 方法来删除元素属性
1. attr(属性名) //获取属性的值(取得第一个匹配元素的属性值。通过这个方法可以方便地从第一个匹配元素中获取一个属性的值。如果元素没有相应属性,则返回 undefined )
2. attr(属性名, 属性值) //设置属性的值 (为所有匹配的元素设置一个属性值。)
3. attr(属性名,函数值) //设置属性的函数值 (为所有匹配的元素设置一个计算的属性值。不提供值,而是提供一个函数,由这个函数计算的值作为属性值。)
4.attr(properties) //给指定元素设置多个属性值,即:{属性名一: “属性值一” , 属性名二: “属性值二” , … … }。(这是一种在所有匹配元素中批量设置很多属性的最佳方式。注意,如果你要设置对象的class属性,你必须使用'className' 作为属性名。或者你可以直接使用'class'或者'id'。)
Mybaites
1.#和$的区别
#把参数当成是一个字符串,加引号,$传什么是什么
2.使用MyBatis的mapper接口调用时有哪些要求?
① Mapper接口方法名和mapper.xml中定义的每个sql的id相同
② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
④ Mapper.xml文件中的namespace即是mapper接口的类路径。
<mappernamespace="org.mybatis.example.BlogMapper"><selectid="selectBlog"resultType="Blog">select * from Blog where id = #{id} </select></mapper>
java中什么是构造方法及其作用
构造方法就是与类同名的那个方法,它的作用是可以用来初始化
class Person{
publicPerson(String n,int a){ //构造方法
name = n;
age = a;
System.out.println(n+""+a);
}
private String name;
private int age;
public staticvoid main(String[] args){
Person p = new Person("张三",14);//这就是作用
}
}
new一个对象的时候要用到构造函数,例如Hello hello =new Hello();这时调用的是Hello的无参数构造方法;Hello hello = newHello("hi");这个是调用Hello有参数构造方法,在JAVA中如果不写构造方法的话,会默认加上一个无参数的构造方法,但是如果已经有了一个有参数的构造方法,那么无参数的构造方法就不会默认被加上.如果Hello类中已经有了一个有参数的构造方法,这时再使用 Hello hello= new Hello();来创建对象的时候就会出错,这就是为什么书上要强调写了有参数的构造方法就最好加一个无参数的构造方法.
Java反射
1、 什么是java反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2、 反射机制的优点(增加程序的灵活性)
java的反射机制就是增加程序的灵活性,避免将程序写死到代码里,
例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码,并重新编译。
使用反射:class.forName("person").newInstance();而且这个类描述可以写到配置文件中,如**.xml, 这样如果想实例化其他类,只要修改配置文件的"类描述"就可以了,不需要重新修改代码并编译。
增加程序的灵活性。
如struts中。请求的派发控制。
当请求来到时。struts通过查询配置文件。找到该请求对应的action。已经方法。
然后通过反射实例化action。并调用响应method。
如果不适用反射,那么你就只能写死到代码里了。
所以说,一个灵活,一个不灵活。
很少情况下是非用反射不可的。大多数情况下反射是为了提高程序的灵活性。
因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高
3、 反射机制的用途
反射的应用很多,很多框架都有用到
spring 的 ioc/di 也是反射....
javaBean和jsp之间调用也是反射....
struts的 FormBean 和页面之间...也是通过反射调用....
JDBC 的 classForName()也是反射.....
hibernate的 find(Class clazz) 也是反射....
4、 反射机制获取Class对象的三种方式
Person person = new Person();
//1、通过Object类的getClass()方法:(需要先实例化一个对象)
Class clazz1 = person.getClass();
//2、通过对象实例方法获取对象:(需要先实例化一个对象)
Class clazz2 = person.class;
//3、类的全路径:(不许呀实例对象)
Class clazz3 =Class.forName("com.cn.Person");
5、 创建对象
获取类以后我们来创建它的对象,利用newInstance
Class c=Class.forName("Employee");
//创建此Class 对象所表示的类的一个新实例
Object o = c.newInstance(); //调用了Employee的无参数构造方法.
6、 获取属性
分为所有的属性和指定的属性:
a、先看获取所有的属性的写法:
//获取整个类
Class c =Class.forName("java.lang.Integer");
//获取所有的属性?
Field[] fs = c.getDeclaredFields();
//定义可变长的字符串,用来存储属性
StringBuffer sb = new StringBuffer();
//通过追加的方法,将每个属性拼接到此字符串中
//最外边的public定义
sb.append(Modifier.toString(c.getModifiers())+ " class " + c.getSimpleName() +"{\n");
//里边的每一个属性
for(Field field:fs){
sb.append("\t");//空格
sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
sb.append(field.getName()+";\n");//属性的名字+回车
}
sb.append("}");
System.out.println(sb);
b、获取特定的属性,对比着传统的方法来学习:
public static void main(String[] args)throws Exception{
<span style="white-space:pre;"></span>//以前的方式:
/*
User u = new User();
u.age = 12; //set
System.out.println(u.age); //get
*/
//获取类
Class c = Class.forName("User");
//获取id属性
Field idF = c.getDeclaredField("id");
//实例化这个类赋给o
Object o = c.newInstance();
//打破封装
idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。
//给o对象的id属性赋值"110"
idF.set(o, "110"); //set
//get
System.out.println(idF.get(o));
}
7、 获取方法
8、 getDeclaredMethods和的区别
getDeclaredMethod*()获取的是类自身声明的所有方法,包含public、protected和private方法。getMethod*()获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。
9、 Java反射中Method类invoke方法的用法
public Method getMethod(String name,Class<?>...parameterTypes)
//getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
public Object invoke(Object obj,Object...args)
//第一个参数是具体调用该方法的对象
//第二个参数是执行该方法的具体参数