1、指出Servlet及jsp的作用及区别,并且说明Servlet的生命周期?
1.JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类。
JSP 工作原理:
JSP页面在执行的时候都会被服务器端的JSP引擎转换为Servelet(.java),然后又由JSP引擎调用Java编译器,将Servelet(.java)编译为Class文件(.class),并由Java虚拟机(JVM)解释执行。下面验证这一点:
有一个JSP页面Test.jsp,在浏览器地址栏中输入http://localhost:8080/Test.jsp,将会出现执行结果。同时在%CATALINA_HOME%/work/Catalina/localhost下多出两个文件:_Test_jsp.java和_Test_jsp.class,他们分别就是Servelet和Class文件。
2.Servlet的应用逻辑是在Java文件中,从Java代码中动态输出HTML,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
2、HTTP请求的GET与POST方式的区别?
- GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&
连接。URL 的编码格式采用的是 ASCII 编码,而不是 uniclde,即是说所有的非
ASCII 字符都要编码之后再传输。POST 请求:POST 请求会把请求的数据放置在
HTTP 请求包的包体中。因此,GET 请求的数据会暴露在地址栏中,而 POST 请求则
不会
- 传输数据的大小:在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限
制。但是在实际开发过程中,对于 GET,特定的浏览器和服务器对 URL 的长度有限
制。因此,在使用 GET 请求时,传输数据会受到 URL 长度的限制。对于 POST,由
于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST
提交数据大小进行限制,Apache、IIS 都有各自的配置。
- 安全性 POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面
GET 提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,
在进行登录操作,通过 GET 请求,用户名和密码都会暴露再 URL 上,因为登录页面
有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码
就很容易被他人拿到了。除此之外,GET 请求提交的数据还可能会造成 Cross-site
request frogery 攻击
3、Request、Session及Application的生命周期分别是什么?
application
全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。
session
会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。
打开一个浏览器请求一个网站的页面后,Session开始,当session超过时间限制(一般是20分种)后,session注销而失效或是人为使用session.invalidate();使用session失效。
用浏览器打开一个web程序,一个浏览器窗口就会有一个session,且是唯一的,过了session的生存周期就没了,或者是你关了窗口也就没了。
不同浏览器的session在计算机中并不是同一个。
request
请求作用域,就是客户端的一次请求。比如访问某个页面,就是一次请求。页面访问结束,该页面的request就结束了
4、说说HTML中的innerHTML和innerText有什么区别?
innerHTML指的是从对象的起始位置到终止位置的全部内容,包括Html标签。
innerText 指的是从起始位置到终止位置的内容,但它去除Html标签。
5、Java中this与super关键字分别是什么意思?
this代表的是当前对象,可以是当前对象的方法、变量。
super代表的是父类,说白了就是在子类中通过super关键字来调用父类的东西。
6、以下两种字符串定义方式有什么区别?
String Str1 = new String(“hello”);
String Str2 = “hello”;
str1 == str2 是true还是false?
str1.equals(str2); 的结果为 true
str1 == str2 的结果也为false
请注意eqauls是比较两个对象内容是否相等, “==” 比较符是比较两者是否是同一个内存地址
7、Java变量分为静态变量、成员变量及局部变量,说明他们的生存周期及作用域?
存储区域:
全局变量(全局静态变量)是放在方法区中。
成员变量如果没有实例化那么变量是放在栈中;实例化了对象放在堆中,栈中放的是指向堆中对象的引用地址。
局部变量放在栈中,new的对象放在堆中,8中基本数据类型变量放在栈中,变量所对应的值是放在栈帧中。
生命周期:
全局变量:当类加载的时候,就开始被创建,在类中只有一份; 会跟着类的消失而消失,生存时间叫长。
成员变量:在对象被创建时而存在,当对象被GC回收的同时,他也会消失,生存时间适中。
局部变量:当方法被调用时而存在,当方法调用结束而消失,生存时间短。
作用域:
全局变量:作用整个类中,直接被类调用。
成员变量:作用在整个类中(除静态方法不能使用,静态方法没有隐式的this),被对象调用。
局部变量:作用在一个局部区域,比如说在一个方法中,方法调用。
8、Java中基本数据类型及引用数据类型有什么区别?
基本数据类型,包括数值型,字符型和布尔型。
数值型:1)整型:byte 1个字节;short 2个字节;int 4个字节;long 8个字节。
2)浮点型:float 4个字节;
double 8个字节;可以采用十进制和十六进制两种表示方式,其中十六进制表示方法只能采用科学计数法,例如:0x1.2p3,表示的是的是1乘以16加上2乘以16的-1次方的和乘以2的三次方;浮点型的默认类型为DOUBLE型,如果声明float型浮点数,要在数值后面加上f或F,例如:float
f1 = 3.14F;否则会报精度错误。
字符型:char 采用unicod的16位编码方式进行编码。
布尔型:true,false;
引用数据类型:类、接口类型、数组类型、枚举类型、注解类型;
基本数据类型和引用数据类型的区别主要在存储方式上:
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上;
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
9、Java在方法调用时,形参和实参什么时候是值传递,什么时候是引用传递?请列举几个实例?
形参:用来接收调用该方法时传递的参数。只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间。因此仅仅在方法内有效
public void sum(int a, int b) {…}
这里边的a,b就是形参
public void sum(1, 2) {…}
其中1和2就是实际的参数值,就叫实参
参数传递:
形参:方法声明时,方法小括号内的参数
实参: 调用方法时,实际传入的参数值
java中传递值得机制:
形参是基本数据类型的: 将实参的值传递给实参的基本数据类型的变量
形参是引用数据类型的: 将实参的引用类型的值(即在堆空间中生成的首地址的值)传递给形参的引用类型的变量
10、如果父类没有无参数的构造方法,那么其子类能否有无参数的构造方法?为什么?
你在Xx类里定义了一个带参数的构造方法,那么这个Xx类就没有无参数的构造方法了。
子类在继承父类时,如果没有相同的带参构造方法,那么他就需要在其构造方法中明确的通过super()调用父类的带参构造方法,否则构造不出父类,从而也构造不出他自己了。
你如果在父类中写个不带参数的构造方法,就可以不用实现父类的带参构造方法了。
11、子类中能否包含一个方法签名中只有返回类型与父类不一样的方法?为什么?
12、说明public、protected、private及default的区别?
public:具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类 对外的一种接口的形式。
protected:主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西
default:有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
private:访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。
13、char类型占几个字节,能否存在中文字符?
Java基本类型占用的字节数:
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
注:1字节(byte)=8位(bits)
1.编码与中文:
Unicode/GBK: 中文2字节
UTF-8: 中文通常3字节,在拓展B区之后的是4字节
综上,中文字符在编码中占用的字节数一般是2-4个字节。
14、Java什么时候会抛出NullPointerException?
空指针异常,null
15、列举几个常用的字节流及字符流?
Java的流体系十分庞大,我们来看看体系图:
这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图
详细请查看链接:JavaIO流原理之常用字节流和字符流详解以及Buffered高效的原理
16、java.util.Collection接口有哪些常用的实现类?
详细请查看链接:java.util.Collection包下各个类的特点汇总
17、使用final修饰符修饰的变量,是引用不能变还是引用的对象不能变?
总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
详细请查看链接:final修饰的变量是引用不能改变还是引用的对象不能改变
18、下面的代码有什么不妥之处?
if(username.equals(“Jim”)){
…
}
如果username为空的话,if(username.equals(“zxx”)){}会报出空指针异常。改为:
if(“zxx”.equals(username)){}比较妥当
19、运行异常与可检测异常有何区别?
详细请查看链接:java异常处理 Exception、error、运行时异常和一般异常有何异同
20、SQL语句中Where子句后面能否使用聚合函数?
详细请查看链接:SQL中where子句中不能出现聚合函数的原因
21、SQL语句中union和union all有什么不同?
UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复
1、UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]
2、UNION ALL 的语法如下:
[SQL 语句 1]
UNION ALL
[SQL 语句 2]
效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
22、说说JDBC开发中Statement和PreparedStatement的区别?
类似mybatis # 与 $ 的区别,防注入攻击
详细请查看链接:浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣
23、java.util.Date和java.sql.Date有什么区别
详细请查看链接:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
24、JS中undfined和null有什么区别?
undfined 未定义 null 空值
详细请查看链接:Javascript 中 null、NaN和undefined的区别
25、下面代码有没有错误,为什么?
var a = [];
a[0] = 1;
a[10000] = “this is element 10000”;
26、MySQL、Oracle和SQL Server的分页查询语句
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql、Oracle和SQL Server分页查询student表。
Mysql的分页查询:
SELECT
*
FROM
student
LIMIT (PageNo - 1) * PageSize,PageSize;
理解:(Limit n,m) =>从第n行开始取m条记录,n从0开始算。
Oracel的分页查询:
SELECT
*
FROM
(
SELECT
ROWNUM rn ,*
FROM
student
WHERE
Rownum <= pageNo * pageSize
)
WHERE
rn > (pageNo - 1) * pageSize
理解:假设pageNo = 1,pageSize = 10,先从student表取出行号小于等于10的记录,然后再从这些记录取出rn大于0的记录,从而达到分页目的。ROWNUM从1开始。
SQL Server分页查询:
SELECT
TOP PageSize *
FROM
(
SELECT
ROW_NUMBER () OVER (ORDER BY id ASC) RowNumber ,*
FROM
student
) A
WHERE
A.RowNumber > (PageNo - 1) * PageSize
理解:假设pageNo = 1,pageSize = 10,先按照student表的id升序排序,rownumber作为行号,然后再取出从第1行开始的10条记录。
来源:CSDN
作者:闪电磊磊
链接:https://blog.csdn.net/chenleismr/article/details/104266964