Java基础知识问答

谈谈servlet的生命周期
1)容器装载并实例化Servlet 
2) 调用init()方法完成Servlet初始化 
3)当请求到达时,调用service()方法处理请求,产生响应 
4)销毁阶段调用destroy()方法完成清理工作。 
servlet是 线程 安全的吗?为什么? 
不安全。因为Servlet对象在整个过程中,至始至终只有一个对象。以节约服务器资源的消耗,这就意味着很多个线程会同时访问一个Servlet对象。所以线程不安全。 
你是如 何处 理servlet 线程安全 问题的? 
解决Servlet线程安全问题方法有三种 
1)编写Servlet类的时候,实现SingleThreadModel接口,将Servlet变成单线程机制。 
2)涉及对共享资源访问的时候,使用synchronized 同步 加锁,实现共享资源的保护。 
3)尽量不在Servlet中定义成员变量,使用局部变量。 
三种方法 中,最好使用第三种,这样线程安全,并且性能最高。 
如何得到客户端的请求参数
request.getParameter()单个数据 
request.getParameter Values ()一组数据 
request.getParameterMap()返回所有的键值对 
request.getParameter和request.getParameterValues的区别,它们的返回值是什么类型? 
     request.getParameter获得单个表单的数据。返回值是String类型。而request.getParameterValues()是获得表单元素名相同的一组数据。返回值是String[]数组。 
jsp有哪些内置对象? 
pageContex,request,session,application,out,exception,config,page, 
请求转发和重定向的区别。 
1) 内部转发客户端向服务器发起一次请求,重定向客户端向服务器发出两次请求 
2) 内部转发由request对象发起,重定向是response发起的 
3) 内部转发不会引起地址栏的变化,而重定向会导致地址栏变化 
JSP中动态包含和静态包含的区别。 
1) 静态包含在转换成为java文件的时候将要包含的文件包含进来,作为一个整体编译。动态包含是各个包含文件分别转换,分别编译。 
2) 静态包含在两个文件中不能有相同的变量,动态包含允许 
3) 静态包含只能包含文件,动态包含还可以包含servlet输出的结果 
4) 静态包含不能使用变量作为 文件名 ,动态包含可以使用变量作为文件名 
5) 动态包含文件发生变化,包含文件会感知变化。 


一、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)未配置<load-on-startup>属性的Servlet被客户端首次访问时才会被初始化。
(2)配置<load-on-startup>属性的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\<applicaton-name>\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对象保存到数据库表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值