1.在一个程序当中代码段访问了同一个对象从单独的并发的线程当中,那么这个代码段叫”临界区” html
怎么解决呢:使用同步的机制对临界区进行保护 java
同步的两种方式:同步块和同步方法 web
对于同步来讲都是使用synchronized方法算法
每个对象都有一个监视器,或者叫作锁。数据库
java用监视器机制实现了进程之间的异步执行浏览器
2.Struts框架基于MVC模式安全
Struts的工做流程: 服务器
在web应用启动时就会加载初始化ActionServlet,ActionServlet从 cookie
struts-config.xml文件中读取配置信息,把它们存放到各类配置对象 session
当ActionServlet接收到一个客户请求时,将执行以下流程.
-(1)检索和用户请求匹配的ActionMapping实例,若是不存在,就返回请求路径无效信息;
-(2)若是ActionForm实例不存在,就建立一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
-(3)根据配置信息决定是否须要表单验证.若是须要验证,就调用ActionForm的validate()方法;
-(4)若是ActionForm的validate()方法返回或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪一个Action,若是相应的 Action实例不存在,就先建立这个实例,而后调用Action的execute()方法;
-(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
为何要用:
JSP、Servlet、JavaBean技术的出现给咱们构建强大的企业应用系统提供了可能。但用这些技术构建的系统很是的繁乱,因此在此之上,咱们须要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
3.HttpServletRequest类主要处理:
1.读取和写入HTTP头
2.取得和设置cookies
3.读取路径信息
4.标识HTTP会话
4.== 比较的是两个对象的地址是否相同
equals 比较的是两个对象的内容是否相同
==比较的是对象的地址,也就是是不是同一个对象;
equal比较的是对象的值。
凡是new出来的就是对象
凡是new出来的就是不一样的对象,不管它们长的多么类似
凡是new出来的都有本身的内存空间
5.构造方法不须要同步化。
定义在接口中的方法默认是public的。
容器保存的是对象的引用。
构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,因此不须要同步 。
若是父类中的某个方法使用了 synchronized关键字,而子类中也覆盖了这个方法,默认状况下子类中的这个方法并非同步的,必须显示的在子类的这个方法中加上 synchronized关键字才可。固然,也能够在子类中调用父类中相应的方法,这样虽然子类中的方法并非同步的,但子类调用了父类中的同步方法,也就至关子类方法也同步了。
6.通常关系数据模型和对象数据模型之间有如下对应关系:表对应类,记录对应对象,表的字段对应类的属性.
7.自动类型转换遵循下面的规则:
1.若参与运算的数据类型不一样,则先转换成同一类型,而后进行运算。
2.转换按数据长度增长的方向进行,以保证精度不下降。例如int型和long型运算时,先把int量转成long型后再进行运算。
3.全部的浮点运算都是以双精度进行的,即便仅含float单精度量运算的表达式,也要先转换成double型,再做运算。
4.char型和short型参与运算时,必须先转换成int型。
5.在赋值运算中,赋值号两边的数据类型不一样时,须要把右边表达式的类型将转换为左边变量的类型。若是右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会下降精度。
下图表示了类型自动转换的规则:
short/char--->int--->unsigned--->long---> double <---float
8.trowable 的子类 error 和 Exception
Exception 包括 非检查性异常 RuntimeException, 及其子类,即运行时的异常,运行时的异常是代码的BUG,
和检查性异常,即非运行时异常,程序在编译的时候会发现的异常 如: IOException之类,在处理相似文件流的时候,java强制规定必须处理可能遇到的文件流异常。
runtimeException是运行时的异常,在运行期间抛出异常的超类,程序能够选择是否try-catch处理。
其余的检查性异常(非运行时的异常,如IOException),是必须try-catch的,不然程序在编译的时候就会发现错误。
9.Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上咱们就可以看出他们分别对应于 boolean、char、int、long、float和double。而String和Date自己就是类,所以没有包装类。.
10stringbuffer与stringbuilder的区别:
1. 在执行速度方面的比较:StringBuilder > StringBuffer
2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当咱们用它们对字符串作操做时,其实是在一个对象上操做的,不像String同样建立一些对象进行操做,因此速度就快了。
3. StringBuilder:线程非安全的
StringBuffer:线程安全的
当咱们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操做是安全的,虽然他的速度最快,可是能够保证StringBuffer是能够正确操做的。固然大多数状况下就是咱们是在单线程下进行的操做,因此大多数状况下是建议用StringBuilder而不用StringBuffer的,就是速度的缘由。
对于三者使用的总结:
1.若是要操做少许的数据用 = String
2.单线程操做字符串缓冲区下操做大量数据 = StringBuilder
3.多线程操做字符串缓冲区下操做大量数据 = StringBuffer
11.类中声明的变量有默认初始值;方法中声明的变量没有默认初始值,必须在定义时初始化,不然在访问该变量时会出错。
boolean类型默认值是false
12.无论是静态方法仍是非静态方法,都须要调用后执行,其执行的次序和在类里声明的次序无关,区别是静态方法是“class.method"方式执行,非静态方法是"object.method"方式执行,即后者须要建立一个对象。
静态成员变量(也称类变量)先于非静态成员变量初始化,静态成员变量在类第一次加载时初始化,全部对象共享一份静态成员变量,非静态成员变量则在对象建立时初始化.
Java中常常有一些静态块,这是用来在生成类以前进行的初始化,不管java还C++语言中的static,都是最早初始化好的。结构以下:
static {
静态语句代码块
}
{
非静态语句代码块
}
异同点
相同点:都是在JVM加载类时且在构造方法执行以前执行,在类中均可以定义多个,通常在代码块中对一些static变量进行赋值。
不一样点:静态代码块在非静态代码块以前执行(静态代码块-->非静态代码块-->构造函数)。
静态代码块只在第一次new(或者只要访问了就)执行一次,以后不在执行,而非静态代码块在每new一次都会执行一次,跟构造函数同样。非静态代码块能够在普通方法中定义(我的感受做用不大);而静态代码块不行。
一、静态代码块是在类加载时自动执行的,非静态代码块在建立对象自动执行的代码,不建立对象不执行该类的非静态代码块。 顺序: 静态代码块--》非静态代码块--》类构造函数。
二、在静态方法里面只能直接调用同类中其余的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。由于对于非静态的方法和变量,须要先建立类的实例对象后方可以使用,而静态方法在使用前不用建立任何对象。
三、若是某些代码必需要在项目启动时候就执行,咱们能够采用静态代码块,这种代码是主动执行的;须要在项目启动的时候就初始化.
在不建立对象的状况下,其余程序来调用的时候,须要使用静态方法,此时代码是被动执行的。
区别:静态代码块是自动执行的;
静态方法是被调用的时候才执行的;
做用:静态代码块能够用来初始化一些项目最经常使用的变量和对象;静态方法能够用做不建立对象也能够能须要执行的代码。
13.abstract class和interface的区别:
1.抽象类能够有构造方法,接口中不能有构造方法。
2.抽象类中能够有普通成员变量,接口中没有普通成员变量。
3.一个类能够实现多个接口,但只能继承一个抽象类。
抽象类
特色:
抽象类中能够构造方法
抽象类中能够存在普通属性,方法,静态属性和方法。
抽象类中能够存在抽象方法。
若是一个类中有一个抽象方法,那么当前类必定是抽象类;抽象类中不必定有抽象方法。
抽象类中的抽象方法,须要有子类实现,若是子类不实现,则子类也须要定义为抽象的。
接口
特色:
在接口中只有方法的声明,没有方法体。
在接口中只有常量,由于定义的变量,在编译的时候都会默认加上
public static final
在接口中的方法,永远都被public来修饰。
接口中没有构造方法,也不能实例化接口的对象。
接口能够实现多继承
接口中定义的方法都须要有实现类来实现,若是实现类不能实现接口中的全部方法
则实现类定义为抽象类。
14.1.线程经过调用对象的synchronized方法可得到对象的互斥锁定。
2.线程调度算法是平台独立的。
3.经过继承Thread类或实现Runnable接口来建立线程。
线程调度分为协同式调度和抢占式调度,Java使用的是抢占式调度,也就是每一个线程将由操做系统来分配执行时间,线程的切换不禁线程自己来决定(协同式调度)。这就是平台独立的缘由。
15.方法的重写(override)两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
16.一、boolean类型只有两个直接量值:true和false.
二、除成员变量会有默认初始值外,其余变量必须在第一次使用以前初始化
boolean类型的默认值是false;
其他的7种基本类型默认值:
byte是 (byte)0;
short是 (short)0;
int是 0;
long是 0L;
float 是0.0f;
double 是0.0d;
char是 \u0000;
String是null;
17.servlet中init,service,destroy方法描述:
init方法:是在servlet实例建立时调用的方法,用于建立或打开任何与servlet相关的资源和初始 化servlet的状态,Servlet规范保证调用init方法前不会处理任
何请求.init()方法是servlet生命的起点。
一旦加载了某个servlet,服务器将当即调用它的init()方法.
service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法
destory方法:是在servlet实例被销毁时由web容器调用。
Servlet规范确保在destroy方法调用以前全部请求的处理均完成,
须要覆盖destroy方法的状况:释听任何在init方法中打开的与servlet相关的资源存
储servlet的状态。destroy()方法标志servlet生命周期的结束。
18.类加载过程
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为链接(Linking)。
加载、验证、准备、初始化和卸载这5个阶段的顺序是肯定的,类的加载过程必须按照这种顺序循序渐进地开始,而解析阶段则不必定:它在某些状况下能够在初始化阶段以后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。
来源:http://www.importnew.com/18548.html
19.java不容许单独的方法,过程或函数存在,须要隶属于某一类中。
java语言中的方法属于对象的成员,而不是类的成员。不过,其中静态方法属于类的成员。
Java语言中的方法一定隶属于某一类(对象),调用方法与过程或函数相同。
20.Java 提供的事件处理模型是一种人机交互模型。它有三个基本要素:
1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;
2) 事件(Event):事件封装了组件上发生的事情,好比按钮单击、按钮松开等等;
3) 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;
21.在WEB开发中实现会话跟踪的技术有:session,cookie,地址重写,隐藏域。
1.Cookies
Cookies是使用最普遍的会话跟踪机制,Cookies是有服务器建立,并把Cookies信息保存在用户机器上的硬盘上,下次用户再次访问该站点服 务器的时候,保存在用户机器上硬盘的Cookies信息就被送回给服务器。通常Cookies通常很少于4KB,且用户的敏感信息如信用卡帐号密码不该该 保存在Cookies中。
2.URL重写
URL重用户在每一个URL结尾附加标识回话的数据,与标识符关联的服务器保存有关与会话的数据,如咱们访问某个新闻的时候,在地址栏咱们通常会看到这样的 信息:http://www.XXX.com/news?id=??,一般的话id后面的问号表示该条新闻在后台数据库中的新闻表的id。URL重写可以 在客户端停用cookies或者不支持cookies的时候仍然可以发挥做用。
3.隐藏表单域
一般,在表单中咱们使用隐藏表单域的时候会有这么一句代码:<input type=”hidden” name=”XXX” value=”XXX”/>。经过给type属性赋值为hidden值来实现隐藏,这样用户在浏览的时候看不到这行代码的数据,可是当用户经过查看 源代码仍是能够看到的。
4.Session机制
这个机制要慎用,特别是对于访问量很大的站点,由于这种机制是吧Session信息保存在服务器端。若是访问量特别大的话,对于服务器的承受力的要求有多高是可想而知的。
Cookie(结合session使用)
可使用 cookie 存储购物会话的 ID;在后续链接中,取出当前的会话 ID,并使用这个 ID 从服务器上的查找表(lookup table)中提取出会话的相关信息。 以这种方式使用 cookie 是一种绝佳的解决方案,也是在处理会话时最常使用的方式。可是,sevlet 中最好有一种高级的 API 来处理全部这些任务,以及下面这些冗长乏味的任务:从众多的其余cookie中(毕竟可能会存在许多cookie)提取出存储会话标识符的 cookie;肯定空闲会话何时过时,并回收它们;将散列表与每一个请求关联起来;生成唯一的会话标识符。
URL 重写
采用这种方式时,客户程序在每一个URL的尾部添加一些额外数据。这些数据标识当前的会话,服务器将这个标识符与它存储的用户相关数据关联起来。 URL重写是比较不错的会话跟踪解决方案,即便浏览器不支持 cookie 或在用户禁用 cookie 的状况下,这种方案也可以工做。URL 重写具备 cookie 所具备的一样缺点,也就是说,服务器端程序要作许多简单可是冗长乏味的处理任务。即便有高层的 API 能够处理大部分的细节,仍须十分当心每一个引用你的站点的 URL ,以及那些返回给用户的 URL。即便经过间接手段,好比服务器重定向中的 Location 字段,都要添加额外的信息。这种限制意味着,在你的站点上不能有任何静态 HTML 页面(至少静态页面中不能有任何连接到站点动态页面的连接)。所以,每一个页面都必须使用 servlet 或 JSP 动态生成。即便全部的页面都动态生成,若是用户离开了会话并经过书签或连接再次回来,会话的信息也会丢失,由于存储下来的连接含有错误的标识信息。
隐藏的表单域
HTML 表单中能够含有以下的条目:<input type="hidden" name="session" value="a1234">
这个条目的意思是:在提交表单时,要将指定的名称和值自动包括在 GET 或 POST 数据中。这个隐藏域能够用来存储有关会话的信息,但它的主要缺点是:仅当每一个页面都是由表单提交而动态生成时,才能使用这种方法。单击常规的超文本连接并不产生表单提交,所以隐藏的表单域不能支持一般的会话跟踪,只能用于一系列特定的操做中,好比在线商店的结帐过程。