*MVC思想的经典实现 在web开发中最典型的是JSP+servlet+javabean模式,其思想的核心概念如下:
Model:封装应用程序的数据结构和事务逻辑,集中体现应用程序的状态,当数据状态改变是,能够在试图里面体现出来。JavaBean非常适合这个角色。
View:是Model是外在表现,模型状态改变是,有所体现,JSP非常适合这个角色。
Controller:是对用户输入进行相应,将模型和试图联系在一起,负责将数据写到模型中,并调用视图。Servlet非常适合这个角色。
MVC的步骤如下:
1.用户在表单中输入,表单提交给Servlet,Servlet验证输入,然后实例化JavaBean
2,JavaBean查询数据库,查询结果暂存在JavaBean中。
3,Servlet跳转到JSP,JSP使用JavaBean得到它里面的查询结果,并显示出来。
*Spring MVC的实现 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
ViewResolver 结合Model和View,来渲染视图
将渲染结果返回给客户端。
*Integer和int的区别 Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别。,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,int在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。
在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
Boolean:(全部缓存)
Byte:(全部缓存)
Integer(-128 — 127缓存)
Character(<= 127缓存)
Short(-128 — 127缓存)
Long(-128 — 127缓存)
Float(没有缓存)
Doulbe(没有缓存)
*异常探讨
检查异常(非运行时异常):你代码还没有运行,编码器就会检查你的代码,对可能出现的异常必须做出相对的处理。() 非检查异常有哪些:RuntimeException与其子类,以及错误(Error)。比运行时异常多了Error。
异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。 Exception表示程序还能够克服和恢复的问题,其中又分为系统异常(虚拟机会处理)和普通异常,系统异常是软件本身缺陷所导致的问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException); 普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉(目的:程序不crash,能继续使用)。
java编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,普通异常也称为checked异常(非运行时异常),而系统异常可以处理也可以不处理,所以系统异常也称为unchecked异常。
提示答题者:就按照三个级别去思考:虚拟机必须宕机(就是死机)的错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误;
粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 CHecked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守. 绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除... 而声明为Error的,则属于严重错误,需要根据业务信息进行特殊处理,Error不需要捕捉。检查型异常必须捕获,运行时提供给用户信息,帮助解决问题。编译器会检查这个部分。运行异常在开发的时候就必须解决,例如空指针。
*我们首先来了解一下哈希表:
概念 : Hash 就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出(int),该输出就是散列值。不同的输入可能会散列成相同的输出,从而不可能从散列值来唯一的确定输入值。简单的说,就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
应用–数据结构 : 数组的特点是:寻址容易,插入和删除困难; 而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入和删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法(防止碰撞),我们可以理解为 “链表的数组”
*什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
实现Serializable接口即可
transient 修饰的属性,是不会被序列化的 静态static的属性,不序列 *Java的平台无关性如何体现出来的
Java平台无关的能力给予网络一个同构的运行环境,使得分布式系统可以围绕着“网络移动对象”开构建。比如对象序列化,RMI, Jini就是利用平台无关性。把面向对象编程从虚拟机带到了网络上 我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。
*Object类中常见的方法,为什么wait notify会放在Object里边?
简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。
专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。
实战总结: 静态方法在加载的时候已经给了入口地址,可以直接运行。 通过父类的公有方法可以访问私有变量和私有方法。子类可以继承父类所有的属性和方法(包括Private私有属性和方法),不过子类不可以直接访问到父类的Private属性和方法。
局部变量必须显示初始化 对象引用,其中string的特例,new是在运行时固定创建 在集合中添加对象的类必须重写hashcode和equals 交换两个值1,加减乘除2.异或^ 编译时异常在编译时检查是为了在运行时出错可以给用户提示错误给与解决。 非编译时异常包括Error(程序本身难以解决)和运行时异常(开发者应解决,如空指针异常) 读入写出
//String c1= "abc"+cde;
String c2= "abc"+cde;
c1和c2是不同的对象
Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的