JSP中常见知识点总结(面试必备)
JSP的注释
<!--注释--> 发送到客户端的JSP注释(HTML注释):在客户端可以看到该注释
<%--注释--%> 不发送到客户端的JSP注释:在客服端打开源文件看不到该注释
静态include和动态include的区别
静态的:<%@ include file="head.jsp" %>
动态的:<jsp:include page="head.jsp" flush="true"/>
静态的:
就是静态嵌入一个文件,Tomcat服务器在编译阶段就完成,即将当前的jsp页面和要嵌入的文件合并成一个新的JSP页面,一起编译成servlet形式的java文件。
动态的:
JSP文件和他所需要的文件在逻辑和语法上是独立的。Include动作标记是在jsp页面运行的时候才处理。不合并成一个新的jsp页面。
JSP的九大内置对象
- Out:一个缓冲的输出流,向客户端输出内容。
- page:当前JSP页面本身,它是java.lang.Object类的实例
- request:提取浏览器提交的信息。
- response: 服务器对客户的请求做出响应,向客户端发送数据。
- session :会话对象,session对象指的是客户端与服务器的一次会话,。
- application:实现了用户间数据的共享,可存放全局变量.它开始于服务器的启动,直到服务器的关闭。
- pageContext:jsp页面上下文对象,提供了对JSP页面内所有的对象及名字空间的访问.
- config 代表jsp对应的servlet的配置信息
- exception是Throwable的实例,表示的是JSP的异常信息,如果要使用它,必须设置page指令:isErrorPage="true"
MVC文字描述
M代表Model,也就是模型,一个或多个JavaBean对象,用于存储数据。
V代表View,,也就是视图,一个或多个JSP页面,为模型提供数据显示
C代表Controller,也就是控制器,由servlet充当,根据视图提交的要求进行数据处理操作,并将有关的结果存储到JavaBean中,然后servlet使用重定向方式请求视图中的某个JSP页面更新显示数据,即让改jsp页面通过使用JavaBean标记显示控制器存储在JavaBean中的数据。
MVC的处理过程:
①首先控制器(C(servlet))接收用户的请求,并决定应该调用哪个模型(M(java))来进行处理
②然后调用模型用来处理用户的请求并返回数据
③最后控制器用相应的视图(V(view))显示模型返回的数据,并通过浏览器呈现给用户。
介绍DAO模式,工厂模式
Tomcat的目录结构
• bin/ 二进制可执行文件和启动和关闭tomcat的脚本文件
• conf/ 配置文件目录
• lib/ 所有Web应用可见的类库目录
• logs/ 日志目录
• server/ 服务器所需的类库目录(tomcat6取消了)
• webapps/ Web应用所存放的目录
• work/ Tomcat的工作目录(存放临时文件,jsp生成的servlet文件)
• temp/ tomcat运行时产生的临时文件
Get请求和Post请求的区别
1. 从安全上看 get<post 因为get提交的数据信息会在浏览器的地址栏中显示
2. 从提交内容大小看 get<post get提交的数据不能大于2k,而post提交的数据理论上不受限制的,但是实际编程中建议不要大于64k
3. 从请求响应速度上看 get>post get要求服务器立即处理请求,而post请求可能形成一个队列请求。
4. get调用doGet方法,为post调用doPost方法
Seesion和Cookie的区别
1.Session将信息保存在服务器上,而Cookie保存在客户端上
2.Session比Cookie更安全,Session比Cookie更占资源
3.Sssion使用了Cookie的机制,如果Cookie被禁用,则Session也无法使用,因为客户端的session ID以cookie形式保存在客户端的内存当中,这个时候我们可以通过url重写,来保证session的有效性.
4.Session是在服务器端,由服务器生成session的ID,通过sessionId保存数据在客服端
5.Session用cookie保存客户端数据,所以session依赖于cookie的
6.如果浏览器不支持Cookie,可以通过URL重写来实现,
重写url的方法如下:response.encodeURL(request.getRequestURL().toString());
7.Cookie只能存String类型的数据,而Session可以存Object类型和简单数据类型的数据
Servlet的生命周期
当客户端第一次向web服务器发出一个servlet请求时,web服务器将会创建一个该servlet的实例,并且调用servlet的init()方法;如果当服务器已经存在了一个servlet实例,那么,将直接使用此实例;然后再调用service()方法,service()方法将根据客户端的请求方式来决定调用对应的doXXX()方法;当servlet从web服务器中删除的时候,web服务器将调用destroy()方法。
生命全过程:
1.加载
2.实例化
3.初始化
4.处理请求
5.退出服务
SendRedirect()和forward()的比较:
1.SendRedirect()是发生在IE浏览器端,forward()在web服务器端直接发生的;
2. forward()仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
3. forward()更加高效,也有助于隐藏实际的链接,只能转发到本web应用的某个资源。
sendRedirect()可以跳转到一个其它服务器上的资源。
4.sendRedirect():request对象放入的属性值,不能给跳转到的页面使用;
Forward():request对象中的属性值,可以给转发到的页面继续使用。
编码中的乱码
Oracle是utf8,而java是UTF-8
服务器响应的编码格式是ISO-8859-1,
1. 针对表单的post提交
request.setCharacterEncoding("UTF-8");
2. 针对表单的get提交
String name=new String(request.getParameter("name").getBytes("iso-8859-1","UTF-8"));
3. 针对超链接:<a href=/web应用名/xxx?name=myTest>你好</a>
String name=new String(request.getParameter("name").getBytes("iso-8859-1","UTF-8"));
4. 针对sendRedirect()
sendRedirect()要重新编码回去再编码回来。
String newName=java.net.URLEncoder.encode(name,"utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+newName);
提取表单的时候采用ISO-8859-1的格式,仅仅设置响应头是不行的,尅采用设置请求的编码格式和响应头的编码格式。但这仅仅只针对采用post方式提交的时候起作用。如果是get方式请求的就不起作用了。
如果是get方式提交的,要配置Tomcat的配置文件conf文件夹下的server.xml,添加:
URIEncoding="GBK"
disableUploadTimeout="true"
在下面中添加: