1. 静态变量和实例变量的区别
java类的成员变量有俩种:
一种是被static关键字修饰的变量,叫类变量或者静态变量;
另一种没有static修饰,为实例变量。
(1)语法定义上的区别:
静态变量前要加static关键字,
而实例变量前则不加。
(2)在程序运行时的区别:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
(3)使用方式的区别:
实例变量必须创建对象后才可以通过这个对象来使用,
静态变量则可以直接使用类名来引用。
2. Integer和int的区别
(1) Integer是int提供的封装类,
而int是Java的基本数据类型;
(2) Integer默认值是null,
而int默认值是0;
(3) 声明为Integer的变量需要实例化,
而声明为int的变量不需要实例化;
(4) Integer是对象,用一个引用指向这个对象,
而int是基本类型,直接存储数值。
3. String是基本数据类型吗,String是否可以被继承
String不是基本数据类型
String 对象是 System.Char 对象的有序集合, String 对象的值是该有序集合的内容,并且该值是不可变的,对String类的任何改变,都是返回一个新的String类对
因为,java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。
为了提高效率节省空间,我们应该用StringBuffer类。
java的8大基本数据类型分别是:
整数类 byte, short, int, long
浮点类 double, float。
逻辑类 boolean
文本类 char
POST和GET方式的安全性是相对的,另外也要看是从哪个角度来看的。
从数据传输过程方面来看,POST方式是更加安全的,但是从对服务器数据的操作来看,POST方式的安全性又是比较低的。
即使是传输过程用POST来执行,安全性也是相对的,如果了解HTTP协议漏洞,通过拦截发送的数据包,同样可以修改交互数据,所以这里的安全不是绝对的。
5. 什么情况下调用doGet()和doPost()方法
1.调用有时doPost中套用doGet
2.执行DOPOST或执行GOGET都执行dopost方法
3.get:可以通过URL传参数
4.你的表单提交都有方法的,如果提交为get就调用get方法,用post就调用post方法.get显示你传过去的参数,post则不显示.
6. 简单的说,get是通过http header来传输数据,有数量限制,而post则是通过http body来传输数据,没有数量限制。
8.还有url刷新时get好像可以不用重复提交原来提交的数据,而post则会说内容已提交,想刷新请再提交.
6运行时异常和一般异常的区别
Throwable是所有Java程序中错误处理的父类,有两种资类:Error和Exception。
Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).
假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的.
Exception:表示可恢复的例外,这是可捕捉到的。
Java提供了两类主要的异常:runtime exception和checked exception。
checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。
对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误.
但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。
比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
RuntimeException体系包括错误的类型转换、
数组越界访问和
试图访问空指针等等.
处理RuntimeException的原则是:假如出现RuntimeException,那么一定是程序员的错误.
出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,
如果是多线程就由Thread.run()抛出,
如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。
运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。异常处理的目标之一就是为了把程序从异常中恢复出来。
6. 什么时servlet
7. List和map的区别
SET无序,不可重复
List有序,可重复
Map是成对放的,一放一对。分成KEY和VALUE
8. Jsp与servlet的相同和不同点以及两者间的关系
1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,所以在servlet中使用Jsp中的内置对象都必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
老师发的答案1:
JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成擅长于流程控制和事务处理而通过Servlet
来生成动态网页;JSP由HTML代码和JSP标签构成,可以方便地编写动态网页
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.
答案2:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
课程内容
1. 框架
2. Ioc
3. Bean
4. Aop(aspectj,api)
Aspectj是aop的使用实现
Springframework
1. spring expression language(spel)
2. spring integration
3. spring web flow
4. spring security
5. spring data
6. spring batch
资料
http://projects.spring.id/spring-framework/
spring概况
一个轻量级控制反转(ioc)和面向切面(aop)容器
1. 大小和开销都是轻量级的
2. 通过控制反转实现松耦合
3. 面向切面的支持,可以通过分离业务逻辑与系统级服务进行内聚性开发
4. 作为容器管理对象的配置和声明周期
5. 组件的配置和组合
Spring的优点
1. 开发简单
2. 开发方便
3. 开发快捷
Spring结构
核心容器
1. Beans
2. core
3. context
4. spel
技术
1. aop
2. apects
3. instrumentation
4. messaging
web组件
1. websocket
2. servlet
3. web
4. porlet
data access/integration
1. jdbc
2. orm
3. oxm
4. jms
5. transactions
什么是框架
规则,即使用别人搭好的舞台
框架的特点
1. 半成品
2. 特定的处理流程和控制逻辑
3. 不断更新
框架和类库的区别
1. 框架是封装了逻辑,高内聚的,类库是松散的工具组合
2. 框架专注于某一领域,类库则更通用
Ioc
1. 接口面向接口编程
2. 什么是ioc
3. Spring的bean配置
4. Bean的初始化
5. Spring的常用注入方式
什么是接口
实体给外界提供的抽象化说明
Java8中接口可以有方法体
Java中接口即声明
面向接口编程
结构设计中,分清层次,及调用关系
每层只向外界提供接口,各层依赖接口而不是实体类
接口实现的变动不影响各层之间的调用
面向接口编程中接口用于隐藏具体实现,实现组件的多态性
什么是ioc
应用程序不负责对象的创建和维护,而是由外部容器
DI(依赖注入)是其中的一种实现方式
目的:创建对象并且组装对象之间的关系
控制反转:
获得依赖对象的过程被反转了,由自身管理变成了由IOC容器主动注入,动态的将某种依赖关系注入到对象中
Spring的bean配置
1. xml文件中配置类
2. 通过Spring的工具类读取读取配置文件
3. Context借助getBean方法获取给用户提供类
Spring的单元测试
1. 下载junit-*.jar
2. 创建UnitTestBase类
3. 完成对Spring配置文件的加载和销毁
4. 所有单元测试类都继承UnitTestBase,通过它的getBean方法获取想要的对象
5. 具体执行单元测试,通过添加注解
@RunWith(BlockJUnit4ClassRunner.class)
6. 单元测试方法加注解
@Test
7. 运行
Bean容器的初始化
基础:两个包
1. org.springframework.beans
2. org.springframework.context
3. Beanfactory提供配置结构和基本功能,加载并初始化Bean
4. ApplicationContext保存了Bean对象并在Spring中被广泛使用
初始化ApplicationContext方式
本地文件—磁盘绝对路径
Classpath—相对工厂的相对路径
Web应用中依赖servlet或者listener
Spring注入
指在启动spring加载bean配置时,完成对变量赋值的行为
常用的注入方式
1. 设指注入
2. 构造注入
设指注入
Xml文件在配置bean类的过程中通过property标签完成注入
把一个对象作为属性放在另一个类中
构造注入
构造注入的配置形式和设指注入相似,只是前者通过构造器传入对象,并赋值给类属性
而后者则通过set方法给类属性赋值
?设指注入和构造注入new对象的过程
Bean
1. bean配置项
2. bean的作用域
3. bean的生命周期
4. bean的自动装配
5. resource&rescourceloader
bean的配置项
1. id
2. class
3. scope
4. constructor arguments
5. properties
6. autowiring mode
7. lazy-initialization mode
8. initialization/destruction method
bean的作用域
singleton:单例,指一个bean容器只存在一份(默认模式)
bean加载一次xml配置文件容器清空,又是一个新的容器
prototype:每次请求(请求一个对象)创建新的实例
request:每次http创建一个类,并只有在该次请求有效
session:类似request
global session:基于portlet的web中有效
bean的生命周期:bean被创建使用过后就会被销毁
生命周期
1.定义
2.初始化
3.使用
4.销毁
初始化:
方法一
(1) 实现org.springframework.beansfactory.initializingbean接口,
(2) 覆盖afterpropertiesset方法
方法二
配置init-method方法
Bean的销毁
方法一
实现org.springframework.beamsfactory.DisposableBean接口,覆盖destory
方法二
配置destroy-method方法
方法三:配置全局默认初始化,销毁方法
从而可以在bean产生和销毁之后进行一些操作
三种方法的比较
1.第三种方法可以被另外两种方法覆盖掉
2.第一种方法优于第二种方法执行
3.第三种方法可以不在bean种生命
4.第一种和第二种方法一旦在配置文件中配置必须在bean中写相应的方法
Bean生命周期
Spring的aware接口
Spring中提供了以aware结尾德接口
1. Applicationcontextaware
2. Applicationeventpulisheravware
3. Messagesourceaware
Beannameaware接口实现重写setBeanName()方法,可以通过接口的name属性获得当前类的id,进而可以通过该i获取类对象
Applicationaware接口实现重写setApplicationContext()方法,可以给appliction注入类
bean的自动配置(autowiring)
1. No:不做任何操作
2. Byname:根据属性名自动配置。根据属性名自动配置,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
3. ByType:如果容器中存在一个与指定属性类型相同的bean
,那么将于该属性自动配置,如果存在多个该类型bean,那么抛出异常,并指出不能使用bytype方式进行自动装配,如果没有找到相匹配的bean,则是什么事都不发生
4. Constructor与bytype方式类似,不同之处在于它应用与构造器参数,如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常
Byname配置:
1. 在xml文件中配置自动配置方式为byname方式
2. 引用类中设置类属性,属性名和被引用类的id一致,并提供set方法
3. 不用new被引用类直接调用引用类属性方法
Bytype配置
1. 在配置文件中配置自动配置方式为bytype方式
2. 类中设置类属性,提供该类型属性的构造器
3. 不用new被引用类直接调用引用类属性方法
4. 首先尝试使用constructor来自动装配,然后再使用byType方式
Resources
针对与资源文件的统一接口
Resourcesloader
Urlresource:url对应的资源,根据一个url地址即可构建
Classpathresource:获取类路径下的资源文件
Filesystemresource:获取文件系统里面的资源
Servletcontextresource:servletcontext封装的资源
Inputstreanresource:针对输入流封装的资源
Bytearrayresource:针对于字节数组封装的资源
所有的application都实现了Resourceloader接口可以通过getResource()方法实例化Resource
四种形式:
Prefix: example explanation
Classpath classpath:com/myapp 相对路径
File file:data/config.xml 文件夹系统
http url:http://myserver/login.jsp url
(none) /data/config.xml 依赖applicationcontext
Rescource 有getfilename方法
有 getlength方法
Bean管理的注解实现及例子
Classpath扫描与组件管理
类的自动检测与注册bean
<context:annotation-config/>
@Component,@Respository,@Service,@Controller
@Required
@Autowired
@Qualifier
@Resource
从spring3.0开始可以通过java来定义bean而不是xml
比如:
@Configuration,@Bean,@Import,@DependsOn
@Component是一个同于注解,可用于任何bean
@Respository,@Service,@Controller是更有针对性的注解
@Respository通常用于注解Dao类,即持久层
@Service通常用于注解Service类,即服务层
@Controller通常用于Controller类,即控制层
Spring可以自动检测类并注册bean到applicationcontext(请注意包含上下文命名空间)
<context:annotation-config/>仅会查找在同一个applicationContext中的bean注解
<context:component-scan>包含<context:annotation-config>
通常在使用前者后,不用在使用后者,前者处理类,后者处理类中的属性和方法
<context:component-scan>的base-package属性可以把某个包下的所有类加载进去
<context:component-scan>也包含autowiredAnnotationBeanPostProvessor和CommonAnnotationbeanPostProcessor也会被包含进来
默认情况下,类被自动发现并注册bean的条件是:
方式1使用@Component,@Resository,@Service,@Controller注解
方式2使用@component的自定义注解
使用过滤器进行自定义扫描
还可以使用use-default-filers = ‘false’禁止自动发现与注册
自定义Bean
扫描过程中组件被自动检测,那么bean名称是由
Beannamegenerator生成的(@Component,@Repository@Service,@Controller都会有一个name属性用于显示设置bean name)
注意这里的名称也就是bean的id相当于xml文件中的id属性,也可以自动生成默认以类的全拼为id(首字母小写)
可自定义bean命名策略
1.实现beannamegenerator接口
2.并一定要包含一个无参的构造器,
3.在配置文件中指定命名策略的实现
<beans>
<context:component-scan base-package=’org.example’ name-generator=’ ’/>
<beans>
作用域(scope)
默认情况下Scope是singleton
也可以自定义scope策略,实现scopemetadataresolver接口并提供无参构造器
<beans>
<context:component-scan base-package=’org.example’ scope-resolver=’ ’/>
<beans>
代理方式
可以使用scoped-proxy属性指定代理,有三个可选:
No,interfaces,targetclass
<beans>
<context:component-scan base-package=’org.example’ scope-proxy =’ ’/>
<beans>
@required注解
适用于bean属性的setter方法
这个注解仅仅表示,受影响的bean的属性必须在配置时被填充,
通过在bean中定义或自动装配一个明确的属性值
@autowired注解
1.可以将@Autowired注解为传统的setter方法
2.用于构造器或者成员变量
默认情况下,如果因找不到合适的bean将会导致autowiring失败抛出异常(即:属性为一个对象,给属性不合适,不能完成自动装配此时会报出异常)
可以通过下面的方式避免
@Autowired(required=’false’)
每个类只能有一个构造器被标记为required=true\
@Autowired的必要属性,建议使用@required注解
总结:@Autowired
可以使用@Autowired注解哪些众所周知的解析依赖性接口,
比如:BeanFactory,ApplicationContext,Environment,ResourecLoader,ApplicationEventPlublisher
And MessageSource
@Autowired可以通过添加注解给数组字段或方法,以提供applicationContext中的所有特定类型的bean
如果添加注解给map,那么,key为bean的id,value为对应的对象
如果希望数组有序,可以让bean实现org.springframework.core.ordered接口或者使用@order注解
浙公网安备 33010602011771号