很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HTML服务器端的技术 规范,JSP是一种动态页面生成的技术,标签库的应用很广泛,面试遇到的几率也很大,而且对于比较复杂的页面,使用JSP来编写,更容易编写和维护。
本章主要分析 : 简单的 JSP/Servlet 方式和内容 、 Java面试逻辑题
每天学一点,日积月累,四个月后的今天,你一定会有很大的收获!
全程将为大家剖析几大部分内容,由于学习经验有限,望大家谅解并接受宝贵的意见:
基础概念部分 ★★ : 常出现的高频率单词的区别理解(异常、静态、抽象、接口、集合等);
深入理解部分 ★★★★: 重点掌握的面向对象的理论知识(对象、排序、字节字符流);
线程编程部分 ★★★★★:单独讲解线程概念、同异步实现方法及关系、线程锁等;
数据库理论归纳 ★★★★: 总结PL/SQL语句,使用方法,归纳基本公式,深层次内容有待开发。
JDBC和XML部分 ★★★ : 重点分析XML的技术构成、应用方面的形式和区别。
Servlet 部分 ★★★★★:重点掌握生命周期和会话跟踪技术的知识点和一般的实现方法。
J S P 部分 ★★★★ : 对象、动作的分类和区别,跳转方法以及动静态include的区别。
JAVA笔试逻辑题 ★★ : 逻辑题目的考验,目前企业应用也比较广泛,稍微了解下。
Servlet方面:
1、说一说Servlet的生命周期? ★★★★★
答:
servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。
这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
2、servlet的生命周期
答:
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。
通过调用service()方法实现,根据请求的不同调用不同的do***()方法。
结束服务,web容器调用servlet的destroy()方法。
3、Servlet的基本架构
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
}
}
4、什么情况下调用doGet()和doPost()?
答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。
5、如何现实servlet的单线程模式★★
答:<%@page isThreadSafe="false"%> 面试中会遇到!
6、页面间对象传递的方法
答:request,session,application,cookie等
7、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
答:JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
8、四种会话跟踪技术(重要考点)★★★★★
答:会话作用域ServletsJSP 页面描述
page是代表与一个页面相关的对象和属性。
一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。
这既包括 servlet 又包括被编译成 servlet 的 JSP 页面。
request是代表与 Web 客户机发出的一个请求相关的对象和属性。
一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)。
session是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求。
application是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
9、Servlet执行时一般实现哪几个方法?★★★★★
答:
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
JSP方面:
1、jsp是如何执行的?
答:阶段一:容器要将JSP文件转换成一个对应的servlet类
html(css,javascript)--> service方法里,用 out.write输出(write方法会将null转换为" ")。
<% Java代码 %> jsp代码片段 --> 把service方法里的内容,照搬过来。
<%= Java表达式 %>也会放到service方法里,使用out.print输出。
<%! %>给Servlet添加新的属性或者新的方法(转成.java文件后,声明内的部分添加在service方法之外)。
这样就把一个JSP变成了一个Servlet容器
注意事项:out.writer方法只能输出简单的字符串,对象是没法输出的。优点是把null自动转换成空字符串输出。
如: <% out.println(new Date()); %> 不能用writer
阶段二:容器会将servlet编译、实例化、初始化、然后执行service方法。(实例化、初始化、就绪、销毁)
2、指令?
1)指令是什么
通知容器,在将.jsp文件转换成.java文件时,作一些额外的处理,比如导包。
2)指令的语法
<%@ 指令名称 属性名=属性值 %>
3)page指令
import属性:导包。
例如:<%@page import="java.util.*"%> <!-- 注意:没有分号!-->
如: <%@page import="java.util.*, java.text.*" %> <!-- 多个包以逗号隔开!都在一个双引号里-->
contentType属性:设置response.setCharacterEncoding()的内容。
pageEncoding属性:告诉容器JSP文件的编码格式。
如: <%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
4)如何转发
step1:绑定数据到requset:request里有个HashMap。
request.setAttribute(String name,Object obj);//name:绑定名。obj:绑定值。
另一个方法获取绑定值:
Object request.getAttribute(String name);//如果绑定对象的值不存在,会返回null
step2:获得一个转发器:url:要转发给哪一个Web组件
RequestDispatcher rd=request.getRequsetDispatcher(String url);
step3:转发
rd.forward(request,response);//JSP和Servlet会共享相同的请求和响应对象
step4:在转发的目的地,可以使用request.getAttribute方法获得绑定的数据,然后进行处理。
3、jsp有哪些隐含对象?作用分别是什么? ★★★
答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
技术拓展:
JavaScript有11种内置对象:
Array、String、Date、Math、Boolean、Number、Function、Global、Error、RegExp、Object。
4、jsp有哪些动作?作用分别是什么? ★★★★★
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
5、JSP中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE用jsp:include动作实现
<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
<%@ include file="included.htm" %>
6、两种跳转方式分别是什么?有什么区别? ★★★★★
答:有两种,分别为:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。
Java笔试逻辑题:
1.一个11L的杯子一个7L的杯子怎么量出2L的水?
解析:
11L装满,往7L的倒,把7L倒满,剩4L,吧7L的倒空; 4L倒进7L里,11L装满再往7L倒,倒满,剩8L; 7L清空,8L倒进去,得到1L; 1L和7L得到6L; 6L和11L得到5L; 5L和7L得到2L。
反过来 在 7L里装满 往 11L里倒 , 道理是一样的!
同类题比较:
假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。
问题是如何只用这2个水壶从池塘里取得3升的水。
2.飞机问题
每架飞机只有一个油箱,一箱油可以飞地球半圈。飞机间可以相互加油,所有飞机从同一个机场起飞。
要想使一架飞机安全飞地球一圈,回到起飞的机场。需要至少出动几架飞机。
解析:
6架足矣。 3架飞机A、B、C同时起飞,同向而行。 飞至1/8航程(绕地球一周)处,正好耗去1/4燃油,其中1架飞机A将2×1/4油箱燃油分加至的飞机B、C油箱中,然后带1/4燃油正好能安全返航。 此时飞机B、C油箱是满的。 剩下2架飞机继续飞行1/8航程,也就是1/4航程处,此时飞机B、C还有3/4油箱的燃油。飞机B将1/4油箱的燃油加至飞机C,飞机B剩下1/2油箱燃油返航, 飞机C为满油箱,继续做环球飞行,能飞至3/4航程处。 飞机C飞至1/2航程处,由同一机场同时起飞3架飞机D、E、F,与飞机A、B、C反方向飞行。 飞机D、E、F逆向飞行1/8航程时,飞机D将2×1/4油箱燃油分加至飞机E、F中返航,飞机E、F为满油箱,再向前1/8航程, 也就是逆向的1/4航程、正向的3/4航程处,正好与做环球飞行的飞机C汇合,飞机C燃油已耗尽,飞机E、F都还有3/4油箱燃油, 两飞机分别将1/4油箱燃油加给飞机C,并同飞机C一起返回机场,此时飞机C、E、F同为1/2油箱燃油,正好能飞完剩下的1/4航程。 如果飞机D、E、F不同时起飞,还可以节约一些燃油,但起飞飞机架次一样。
3.几段不规则的绳子,每个绳子燃烧时间都是60S,怎么计算15S。
解析:
一根绳从两头同时点着 燃烧完时间是30秒
过程如下:将一根绳子两端记为a b 另一根两端记为c d
同时点着a b c,第一根烧完的时候时间过去了30秒,此时将第二根熄灭。
这样剩下的半根绳子就是30秒
要得到15秒只需将剩下这一半的两端点着,烧完的时间就是15秒。
4.一群人参加聚会,每人头上戴一顶帽子,只能看见别人的帽子,看不见自己的帽子,帽子只有黑、白两种颜色。
黑帽子不少于1顶,主持人说。我们玩个游戏,一会儿我关灯,认为自己头上戴的是黑帽子的,扇自己一巴掌。
第一次关灯,没有声音。第二次,还是没声音。第三次关灯,才有噼里啪啦的声音。问有多少人参加聚会。
解析:
第一次关灯没人拍手说明不是黑帽子不止一个.如果只有一个,那戴黑帽子就会拍手,因为他看到的都是戴白帽子的。 如果是两个那么第二次关灯的时候。戴黑帽子A只会看到戴黑帽子B一个戴黑色的帽子,这带黑帽子A确定自己也是戴黑帽子。 但是他们看到的不只只有一个戴黑帽子的. 第三次关灯有人拍手说明只有三个人戴黑帽子。因为戴黑帽子的只看到两个人戴黑帽子,而如果只有两个人戴黑帽子,那么第二次关灯就应该拍手了。 所以只有三个人戴黑帽子。
同类题比较:
一个教授逻辑学的教授,有三个学生,而且三个学生均非常聪明!
一天教授给他们出了一个题,教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个!(每个人可以看见另两个数,但看不见自己的)
教授问第一个学生:你能猜出自己的数吗?回答:不能,问第二个,不能,第三个,不能,再问第一个,不能,第二个,不能,第三个:我猜出来了,是144!教授很满意的笑了。请问您能猜出另外两个人的数吗?
解析:
前两个 一个是48 一个是96 第三个是144 1 每个人虽然猜不出自己的数字 但是心里会有两个答案 自己的数字是这两个答案中的一个(心里的两个数字是另外两人的数字之和与数字之差) 2 如果在教授第一轮询问三个人 三个人都猜不到的情况下 由此说明 三个数字各不相同 因为假如有两个是相同的话 就会有人能猜出自己的数字(三个数字都是正整数,不会是0,所以如果有两个相同的数, 除了两个相同的数字以外的第三个人肯定知道自己的数字不是另外两数之差,是两数之和) 3 第二轮询问中 第三个说猜出了自己的数字是144 由此说明他排除了心中两个答案之一 确定了剩下的一个是正确数字 那么 排除自己心中两个答案中错误的一个 肯定是因为他知道了自己的数字只能是另外两个数之和 并不是另外两数之差 否定了两数之差的可能性是根据 “2” 那么前两数之差肯定是和前两数中的一个相等 那么由此可知 前两数和为144 并且一个是另一个的二倍 4 列出方程x+y=144 x=2y 得知 x=96 y=48 。
如果各位同学有任何建议或比较好的想法,欢迎加入JAVA开发项目讨论群:214404624。 发挥你聪智的大脑,挖掘更新鲜更充满活力的好点子,我们共同探讨技术层面的研究和可实施性。 JSD1307 Teny_Lu 欢迎有志之士共勉! QQ:261799155 http://teny32.blog.51cto.com