JavaWeb核心基础面试知识深度详解

一、Servlet是什么?JSP是什么?它们的联系与区别是什么?
Servlet是Java编写的运行在Servlet容器的服务端程序,狭义的Servlet是指Servlet接口,广义的Servlet是指任何实现Servlet接口的类,我们一般理解的为后者。Servlet的作用是接收浏览器发给服务器的请求Request,经过处理后,将返回响应Response给浏览器。
JSP是一种后端脚本语言,是为了解决Html是静态的,而Servlet输出动态页面又太复杂的问题而出现的,通过JSP标签、动作、内置对象提供方便的生成动态网页功能,是一种后端渲染技术。

联系和区别:
1、JSP其实就是基于Servlet实现的,JSP生命周期:
     (1)解析阶段:Servlet容器解析JSP代码,如果有错则报错;
     (2)翻译阶段:Servlet容器翻译JSP代码为Servlet源文件;
     (3)编译阶段:Servlet容器编译Servlet源代码,生成Servlet字节码类文件;
       ……剩下就是Servlet的生命周期,会在下面介绍。
2、JSP注重视图显示、Servlet注重控制,在传统的MVC架构中,JSP是View,Servlet是Controller。
3、JSP在修改静态内容时不需要重新编译。
二、Servlet API
核心包:javax.servlet与javax.servlet.http
核心类\接口:
1、javax.servlet.Servlet:Servlet核心接口,定义了init()、service()、destroy()有关Servlet 生命周期的方法。
2、javax.servlet.ServletConfig:Servlet配置接口,定义了getServletContext(),主要用于获取ServletContext实例。
3、javax.servlet.ServletContex:Servlet上下文接口,相当于Web应用的总管家。定义了getAtrribute(String name)、setAttribute(String name, Object object)、getInitParameter(String name)、getContextPath()、getRequestDispatcher(String path)等方法,主要用于应用间通信,获取web应用资源、访问服务器文件资源、输出日志等功能。
4、javax.servlet.GenericServlet:该包下唯一抽象类,实现了ServletConfig、Servlet接口,为两个接口方法提供默认的实现方式。

三、如何使用Servlet
1、继承GenericServlet类(通用)
(1)GenericServlet类有一个关键的设计,定义了一个私有的ServletConfig成员变量,在init()方法中,由Servlet容器传入ServletConfig对象与之匹配。
(2)GenericServlet类中唯一一个抽象方法是Service方法,子类必须实现Service方法,以为用户提供特定的服务。

2、继承HttpServlet类,是GenericServlet的子类,重写了Service方法,提供了HTTP的相关服务实现。用户需要做的事,根据实际情况,重写doPost()、doGet()等方法。
四、Servlet生命周期
1、初始化阶段
(1)将编译后的servlet字节码文件读入内存;
(2)Servlet容器创建ServletConfig,并与ServletContext对象建立关联关系,即调用ServletConfig的getServletContext()方法会获取到ServletContext对象。
(3)创建Servlet对象。
(4)调用GenericServlet的init(ServletConfig config)方法,建立Servlet对象与ServletConfig对象的关联。
初始化时机:
(1)未配置属性的Servlet被客户端首次访问时才会被初始化。
(2)配置属性的Servlet在web容器启动时就会按配置的数值按顺序被初始化。

2、运行时阶段,调用Servlet类的Service()方法。当Servlet将响应返回后,Servlet容器会销毁HttpServletRequest对象与HttpServletResponse对象。

3、销毁阶段,在web容器终止时,会先调用所有Servlet的destroy()方法。
五、ServletContextListener监视器
通过实现ServletContextListener接口,实现contextInitialized(ServletContextEvent sce)与contextDestroyed(ServletContextEvent sce)方法,其中可以通过参数的getServletCotext()方法获取ServletContext对象以完成监听工作。

注意:Servlet、Listener、Filter三者的加载顺序为:Listener>Filter>Servlet
六、请求转发与重定向特点以及它们的区别
1、请求转发:HttpServletRequest.getRequestDispatcher(String path).forward(request, response);
特点:
(1)服务器内部转发,浏览器URL不会改变,对用户透明。整体体现的是一个请求与一个响应。
(2)请求转发前,会清空响应缓冲区。
(3)如果转发的为Servlet或JSP(JSP也是Servlet),就会直接将当前HttpServletRequest对象与HttpServletResponse对象转交给目标Servlet或JSP的Service方法,处理后将响应结果返回给前端。
(4)如果转发的为Html静态文档,则就读取文档中数据发送到前端。
(5)请求转发不会执行转发方法之后的代码
2、重定向:HttpServletResponse.sendRedirect(String path);
特点:
(1)客户端外部转发,浏览器URL会发生改变。在Servlet调用重定向后,会返回302临时重定向状态码,响应内容为待重定向路径。然后,浏览器就会再次发出请求,请求路径为刚刚相应内容中的路径。整体体现的是两个请求与两个响应。
(2)重定向前,也会清空响应缓冲区。
(3)而重定向会执行重定向方法后的代码

区别汇总:
1、请求转发在服务端完成,重定向在客户端完成。
2、请求转发速度快,重定向速度慢。
3、请求转发是一次请求,一次响应;而重定向是两次请求,两次响应。
4、请求转发不会执行转发方法之后的代码;而重定向会执行重定向方法后的代码。
5、请求转发URL不会发生改变;而重定向URL会发生改变。
6、请求转发必须在同一台服务器下完成;而重定向可以在不同服务器下完成。

注意:请求转发与重定向的资源路径表示是有区别的
请求转发的path一般使用"/资源名",这里的 '/' 就代表了项目根路径 "http://localhost:8080/项目名/";
而重定向的path一般使用context.getContextPath() + "/资源名",不能直接使用"/资源名",因为在重定向中"/"代表了Web站点的根路径"http://localhost:8080"。
七、如何访问Servlet容器中的其他Web应用
在Service中编写如下代码:
ServletContext otherContext = context.getContext("/otherApp");
otherContext.getRequestDispatcher("/资源名").forward(request, response);
八、如何保证Servlet线程安全
1、保证变量作用域合理,线程私有的变量要定义在方法中。
2、共享变量要用保证线程安全,可以使用加锁、atomic类、volatile关键字实现。
九、JSP九大内置对象(详情可参看博客http://blog.csdn.net/zhangliangzi/article/details/49965209)
1、request对象——代表javax.servlet.http.HttpServletRequest对象
2、response对象——代表javax.servlet.http.HttpServletResponse对象
3、session对象——代表javax.servlet.http.HttpSession对象
4、application对象——代表javax.servlet.ServletContext对象
5、pageContext对象——代表javax.servlet.jsp.pageContext对象
6、page对象——代表this
7、config对象——代表javax.servlet.ServletConfig对象
8、out对象——代表javax.servlet.jsp.jspWriter对象
9、exception对象——代表java.lang.Exception对象
十、Session与Cookie
为什么要使用Session与Cookie:Web应用一般使用HTTP协议传输数据,HTTP是一种无状态协议,完成数据交换后客户端与服务端的连接就会关闭。所以服务端无法根据HTTP请求区分请求者。但区分请求者身份是是非常有意义的,比如一个购物车系统,添加一件商品到购物车,服务端必须区分是哪个用户添加的商品;而且如果一段时间内某个用户多次发出请求,那么就可以对用户的相关数据进行缓存,提高访问效率。这都可以通过Session与Cookie实现。

Cookie与Session的区别在于:Cookie存在于客户端,Session存在于服务端。Cookie的存储数量是有限制的,安全性也更差。Session是基于Cookie实现的,但服务端为了获得较高的存取速度,会把Session放到内存中,在高并发环境下会增大服务器压力。

Cookie机制:
Cookie基于浏览器的支持,具有“不可跨域名性”,浏览器只能访问当前域名网站的Cookie。
Cookie的常见属性有如下几个:
String name——Cookie的名称,一旦创建便不能更改;
Object value——Cookie的值;
int maxAge——Cookie失效时间,单位为秒;
boolean secure——Cookie是否使用HTTPS或SSL的安全数据,传输前要加密,默认为false
String domain——Cookie的作用域名,比如设置为".google.com",第一个字符必须为点,代表着以google.com为结尾的域名才可以访问该Cookie。
String path——Cookie的作用项目名,比如设置为"/webApp/",最后一个字符必须为斜线,代表着contextPath为"/webApp"的程序才可以访问该Cookie。
Cookie使用:
Cookie cookie = new Cookie("name","StringValue"); // 新建Cookie
Cookie[] cookies = request.getCookie(); //获取客户端提交的所有cookie
cookie.setDomain(".leeon.top"); //设置作用域名
cookie.setPath("/testApp/"); //设置作用项目路径
cookie.setSecure(true); //设置安全属性
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为永久;
response.addCookie(cookie); // 输出到客户端
在网页URL栏输入:javascript:alert (document. cookie) 可输出当前页面cookie
注意:
Coookie不能修改与删除,修改可通过创建同名Cookie后覆盖原Coolkie;删除可通过设置setMaxAge方法中的参数为0。
setMaxAge方法中的参如果设置为负值,则为存放在内存中的临时Cookie,关闭浏览器即失效;如果设置为0,则代表使Cookie失效。

Session会话机制:
Session基于Cookie的工作流程:
(1)当用户通过浏览器进程第一次请求一个支持会话的资源时,Servlet容器会为这个会话创建一个HttpSession对象,并为其分配一个唯一的ID,当前会话就此开始。
(2)把这个唯一的ID以name为JSESSIONID的Cookie形式添加到响应中,返回给客户端保存。(当Cookie被禁用时,使用URL重写机制,在URL后添加;jsessionid=XXX以传输HttpSession对象标识)
(3)当浏览器进程再次请求这个支持会话的资源时,会在请求头中加上一直保持着的JSESSIONID,Servlet容器会在HTTP请求头中自动查找这个Cookie(也可以通过HttpSession.getId()方法主动获取),如果找到,就取出对应HttpSession对象(其实用户第一次访问,也会进行相同的查询,因为查询不到,才会执行创建操作)。
Session使用:
HttpSession session = request.getSession(); //获取Session对象
session.setAtrribute("name", "StringValue");//加入session
session.getAttribute("name");//获取session
session.removeAtrribute("name");//删除session
session.setMaxInactiveInterval(int second);//设置超时时间,单位为秒,默认20分钟
session.getLastAccessedTime();//返回Session的最后活跃时间
Session持久化:
1、StandarManager是默认的Session Manager(用来管理Session)。它的实现机制是:当Tomcat服务器关闭或重启,或Web应用被重新加载时,会将内存中所有的HttpSession对象保存到文件系统中,默认的文件路径是:%CATALINA_HOME%\work\Catalina\\SESSIONS.ser
重启Tomcat后,Tomcat服务器把SESSIONS.ser中的持久化HttpSession对象加载到内存中。
2、PersistentManager能够把HttpSession对象保存到Session Store中,它提供了比较StandarManager更灵活的管理功能,具有容错能力,控制内存中HttpSession对象的数目等。
Tomcat实现Session Store的接口为org.apache.catalina.session.Store,目前提供了两个实现这一接口的类:org.apache.catalina.session.FileStore和org.apache.catalina.session.JDBCStore。FileStore会将HttpSession对象保存到文件系统中;而JDBCStore则将HttpSession对象保存到数据库表中。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
绝对想你所想,超乎想象!够详细,够给力! 目录 1. Jvm内存空间结构是什么样的? 1 程序计数器 1 Java栈 1 本地方法栈 2 堆 2 方法区 3 2. Jvm堆内存的划分结构和优化 3 2.1. 原理 6 2.1.1. 年轻代 6 2.1.2. 年老代 6 2.1.3. 持久代 7 2.2. 参数说明 8 2.3. 疑问解答 9 2.4. 垃圾回收器选择 10 2.4.1. 串行收集器 10 2.4.2. 并行收集器(吞吐量优先) 10 2.4.3. 并发收集器(响应时间优先) 11 2.4.4. 其它垃圾回收参数 11 2.5. 辅助信息参数设置 12 2.6. 关于参数名称等 13 3. JVM服务参数调优实战 14 3.1. 大型网站服务器案例 14 3.2. 内部集成构建服务器案例 15 4. 常量池在jvm的哪个空间里边? 17 5. jvm垃圾回收是什么时候触发的? 17 5.1. 那究竟GC为我们做了什么操作呢? 17 5.1.1. Jvm怎么判断对象可以回收了? 18 5.2. 下面我们来看一下几种垃圾收集算法 18 5.2.1. 在JDK1.2之前,使用的是引用计数器算法, 18 5.2.2. 根搜索算法 19 5.2.3. 引用的分类 19 5.3. 方法区也是会被回收的 20 5.4. 下面我们来逐一介绍一下每个垃圾回收器。 22 5.4.1. 1、 Serial收集器 22 5.4.2. 2、 ParNew收集器 23 5.4.3. 3、 ParallelScavenge 23 5.4.4. 4、 ParallelOld 24 5.4.5. 5、 SerialOld 24 5.4.6. 6、CMS 24 5.4.7. 7、 GarbageFirst(G1 ) 26 6. 常量池如何触发的垃圾回收? 28 7. 垃圾回收从哪里开始检测树进行回收?根节点是什么? 28 7.1. 目前java中可作为GC Root的对象有 29 8. Redis怎么判断对象可以清理了? 29 9. Redis怎么提高命中率? 29 10. Finalize中调用垃圾回收方法,再调用方法会回收么? 29 11. Int进行自增操作,如何保证线程安全? 30 12. Int a=1是原子方法,布尔类型进行赋值是原子方法么? 30 12.1. 多线程原子操作的安全性 31 13. Cas怎么实现unsafe? 32 13.1. Unsafe 32 13.2. CAS 32 13.3. 由CAS分析AtomicInteger原理 33 13.4. CAS的缺点 35 14. Map数据结构? 35 14.1. 一、定义 36 14.2. 二、构造函数 36 14.3. 三、数据结构 36 14.4. 四、存储实现:put(key,vlaue) 38 14.5. 五、读取实现:get(key) 41 15. 一百万数据放Arraylist数组,怎么放? 在哪个代? 42 15.1.1. 调整数组容量 42 16. Hashmap和 concurrentHashmap除了线程安全 还有什么区别,put的时候是怎么处理的。 43 17. 数据库组合索引,储存在一个叶子节点还是多个? 44 17.1. 索引的利弊与如何判定,是否需要索引: 44 17.1.1. 索引的好处 44 17.1.2. 索引的弊端 44 17.1.3. 如何判定是否须要创建索引 44 17.2. 复合索引优化 45 17.3. 下面是一些常见的索引限制问题 45 17.3.1. 使用不等于操作符(<>, !=) 45 17.3.2. 使用 is null 或 is not null 45 17.3.3. 使用函数 45 17.3.4. 比较不匹配的数据类型 46 17.4. 关于索引的排序 46 18. 数据库没有orderby默认如何排序。 46 19. 分布式事务如何实现。 46 19.1. 1 事务/分布式事务 47 19.1.1. 1.1 事务 47 19.1.2. 1.2 分布式事务与 XA 规范 47 19.2. 2 两阶段提交协议 47 19.2.1. 2.1 预提交阶段 48 19.2.2. 2.2 提交阶段 48 19.3. 3 分布式事务应用框架 48 19.3.1. 3.1 角色 48 19.3.2. 3.2 交互时序 49 19.3.3. 3.3 关键点 50 19.3.4. 参考 50 20. Jvm底层源码 51 21. 二叉树怎么实现的? 51 22. Executourservice 数据结构。哪种只能执行一个线程。 Cache怎么实现的 fixed线程如果中断,线程回自己销毁么? 51 23. 栅栏的原理和实现。 51 23.1. 1. CyclicBarrier简介 51 23.2. 2. CyclicBarrier数据结构 52 23.3. 3. CyclicBarrier源码分析(基于JDK1.7.0_40) 52 23.3.1. 3.1 构造函数 52 23.3.2. 3.2 等待函数 53 23.4. 4. CyclicBarrier的使用示例 57 23.4.1. 示例1 57 23.4.2. 示例2 59 24. Blockingqueue有几种形式?各自的编码方式。 72 24.1. Queue接口 72 24.2. BlockingQueue接口 73 24.2.1. ArrayBlockingQueue 74 24.2.2. LinkedBlockingQueue 78 24.2.3. LinkedBlockingDeque(双向并发阻塞队列) 84 24.2.4. PriorityBlockingQueue(优先阻塞队列) 85 24.2.5. 总结一下阻塞队列 90 25. Tomcat 如何管理servlet? 90 26. Servlet生命周期 90 27. 没有缓存,如何实现领券并发操作? 92
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值