Java web 基础
1.Jsp有哪些内置对象?作用分别是什么?
Page,pageContext,request,response,session,application,out,config,exception
Page指的是JSP被翻译成Servlet的对象的引用.
pageContext对象可以用来获得其他8个内置对象,还可以作为JSP的域范围对象使用.pageContext中存的值是当前的页面的作用范围》
request代表的是请求对象,可以用于获得客户机的信息,也可以作为域对象来使用,使用request保存的数据在一次请求范围内有效。
Session代表的是一次会话,可以用于保存用户的私有的信息,也可以作为域对象使用,使用session保存的数据在一次会话范围有效
Application:代表整个应用范围,使用这个对象保存的数据在整个web应用中都有效。
Response是响应对象,代表的是从服务器向浏览器响应数据.
Out:JSPWriter是用于向页面输出内容的对象
Config:指的是ServletConfig用于JSP翻译成Servlet后 获得Servlet的配置的对象.
Exception:在页面中设置isErrorPage=”true”,即可使用,是Throwable的引用.用来获得页面的错误信息
2. 什么是cookie?Session和cookie有什么区别?
Cookie是会话技术,将用户的信息保存到浏览器的对象.
Session也是会话技术,将Session的信息保存到服务器的对象.Session是基于Cookie的 利用Cookie向浏览器回写JSessionID.
3 ajax如何实现异步定时5秒刷新?
setInterval(function() {
$("#content").load(location.href+" #content>*","");
}, 5000);
4.Servlet的生命周期
1.加载和实例化
2.初始化
3.请求处理
4.服务终止
5.jsp标准动作
Forward,执行页面跳转,将请求的处理转发到另一个页面
Param :用于传递参数
Include :用于动态引入一个jsp页面
Plugin :用于下载javaBean或applet到客户端执行
useBean :使用javaBean
setProperty :修改javaBean实例的属性值
getProperty :获取javaBean实例的属性值
request.getParameter() 返回客户端的请求参数与值
- 发布项目时,把一jsp文件放到webroot下,与放在web-inf下,有什么区别?
因为web-inf下,应用服务器把它指为禁访目录,即直接在浏览器里是不能访问到的.
但是可以让servlet进行访问,如web-inf下有a.jsp则可以用 request.getRequestDispatcher("/WEB-INF/a.jsp").forward(request,response);
<jsp:forward page="/WEB-INF/a.jsp"></jsp:forward>
- js五种创建对象
- object构造对象
Var user=new object();
User.name=”张三”;
User。Pass=”12345”;
User.sayHi=function{
Document.writer(“hello! ”+ this.name);
}
- 对象字面量创建对象
Var zs={
name=”张三”;
Pass=“12345”;
Document.writer(“hello! ”+ this.name);
}
- 工厂模式创建对象
Function createUser(name,pass){
Var user=new object();
user.name=name;
user.pass=pass;
User.sayHi={
Document.writer(“hello! ”+ this.name);
}}
- 构造方法创建对象
Function User(name,pass){
This.name=name;
This.pass=pass;
User.sayHi={
Document.writer(“hello! ”+ this.name);
}}
- 原型创建对象
Function User(name,pass){
This.name=name;
This.pass=pass;
}
User.prototype.salary=null;
User.prototype.sayHi=function{
Document.writer(“hello! ”+ this.name);
}
- js八种继承
Function Person(){
This.foot=2;
This.head=1;
}
Function Student(name,no){
This.name=name;
This.no=no;
}
Student.prototype=new Person;
Student.prototype.constructor=Student;
- 直接继承
Function Person(){}
Person.prototype.foot=2;
Person.prototype.head=1;
Function Student(name,no){
This.name=name;
This.no=no;
}
Student.prototype= Person.prototype;
Student.prototype.constructor=Student;
- 空对象继承
Function Person(){}
Person.prototype.foot=2;
Person.prototype.head=1;
Function Student(name,no){
This.name=name;
This.no=no;
}
Var f=new function{}
F.prototype=Person.prototype;
Student.prototype=new F();
Student.prototype.constructor=Student;
- 封装函数继承
Function Person(){}
Person.prototype.foot=2;
Person.prototype.head=1;
Function Student(name,no){
This.name=name;
This.no=no;
}
Function extend (child,person){}
Var f=new function{}
F.prototype=person.prototype;
Child.prototype=new f();
Child.prototype.constructor=child;
Extend(student,person);
- call构造继承
Function person(foot,head){
This.foot=foot;
This.head=head;
}
Function student(foot,head,name,no){
Person.call{this,foot,head };
This.name=name;
This.no=no;
}
- apply继承
Function person(foot,head){
This.foot=foot;
This.head=head;
}
Function student(foot,head,name,no){
Person.apply(this[foot,head] );
This.name=name;
This.no=no;
}
- 组合继承
Function person(foot,head){
This.foot=foot;
This.head=head;
}
Function student(name,no){
Person.call(this);
This.name=name;
This.no=no;
}
Student.prototype=new Person();
Student.prototype.constructor=Student;
- 拷贝继承
Function person(){};
Person.prototype.foot=2;
Person.prototype.head=1;
Function student(name,no){
This.name=name;
This.no=no;
}
Function extend(){
Var p=parson.prototype;
Var i=student.prototype;
For(var i in p){
c[i]=p[i];
}extend(Student,Person);
}
9. IO下载
Url url=new Url(“路径”);
HTTPURLConnection conn=(HTTPURLConnection )url.openConnection();
InputStream is=conn.getInputStream();
File file=new File(“文件名”);
file.createNewFile();
OutputStream os=new FileOutputStream (file);
Byte[] bb=new byte[1024];
While (is.read(bb)=-1){
Os.write(bb);
Os.flush();
}
;关闭资源‘’
10解析JSEN
Goods good=new Goods();
List<Goods> li=good.findAll();
String json=Json.toJsonString(li);
File file=new File(tomcat\webapps\项目名\json文件);
file.createFile();
OutputStream os=new FileOutputStream (file);
Os.write(json.getByte[]);
Spring
1.有哪些不同类型的IOC(依赖注入)方式?
- 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
- Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
2.在 Spring中如何注入一个java集合?
Spring提供以下几种集合的配置元素:
- <list>类型用于注入一列值,允许有相同的值。
- <set> 类型用于注入一组值,不允许有相同的值。
- <map> 类型用于注入一组键值对,键和值都可以为任意类型。
- <props>类型用于注入一组键值对,键和值都只能为String类型。
3.Spring注解
3.1@Required 注解
这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。
3.2@Autowired 注解
@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。
3.3@Qualifier 注解
当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的bean。
4.什么是控制反转(IOC)?什么是依赖注入?
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在下,使用控制反转的情况业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。
控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?
5.请解释Spring Bean的生命周期?
在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
初始化之后调用的回调方法。
销毁之前调用的回调方法。
5.五种增强
1.前置增强:org.springframework.aop.BeforeAdvice是前置增强顶层接口,因为Spring只支持方法的增强,其子接口MethodBeforeAdvice是目前可用的前置增强。表示在目标方法执行前实施增强。
2.后置增强:org.springframework.aop.AfterReturningAdvice是目前可用的后置增强,表示在目标方法执行后实施增强。
3.环绕增强:org.aopalliance.intercept.MethodInterceptor代表了环绕增强,表示在目标方法执行前后实施增强。直接使用了AOP联盟定义的接口。
4.异常抛出增强:org.springframework.aop.ThrowsAdvice代表了异常抛出增强,表示在目标方法抛出异常后实施增强。
5.引介增强:org.springframework.aop.IntroductionInterceptor代表引介增强,表示在目标类中添加一些新的方法和属性。
6.Spring的7种事务传播行为类型
1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
3、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
4、PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
5、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
7.五个不同的事务隔离级别
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 (serializable) :避免以上所有读问题.
orcale
1. 分析一个SQL语句是怎样在数据库内部工作的。
A、用户发出SQL请求,打开游标;
B、把SQL语句语法分析,执行计划,数据字典等信息存入内存中共享池内;
C、从数据文件中把相关数据块读入数据缓冲区;
D、做相应操作,若做修改,先加上行级锁,经确认后,把改过前后记录内容存入重做日志缓冲区内;
E、返回结果给用户,关闭游标。
2.