J2EE基础知识(选看)

1、Servlet接口中有哪些方法及Servlet生命周期

Servlet接口定义了5个方法,其中前三个方法与生命周期有关
·void init(ServletConfig config)throws ServletException
·void service(ServletRequest request,ServletResponse response)throws ServletException,java.io.IOException
·void destroy()
·java.lang.String getServletInfo()
·ServletConfig getServletConfig()

生命周期:Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求达到调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost方法;当服务器关闭或者项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。init方法和destroy方法只会执行一次,每次客户端请求servlet都会执行service()方法。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源代码放入destroy方法中,这样就不需要每次处理客户端的请求都需要初始化与销毁资源。

2、get和post请求的区别

可以吧get和post当做两个不同的行为,两者本质上没有区别,底层都是TCP连接。get请求用来从服务器上获取资源,post是用来向服务器提交数据。比如你要获取人员列表可以使用get请求,当你需要创建一个人员是可以使用post,这也是Restful API最基本的一个要求。

3、什么情况调用doGet()和doPost()

Form标签里的method的属性为get时调用doGet方法,为post时调用doPost方法

4、转发和重定向的区别

转发是服务器行为,重定向是客户端行为

转发(forward)通过RequestDispatcher对象的forward(HTTPServletRequest res,HTTPServletResponse resp)方法实现的。RequestDispatcher可以通过HttpServletRequest的
getRequestDispatcher()方法获得。如下代码就是跳转到login_success.jsp页面。

request.getRequestDispatcher("login_success.jsp").forward(request, response);

重定向(Redirect)是利用服务器返回的状态码实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HTTPServletResponse的setStatus(int status)方法设置状态码。如果服务器返回301或302,则浏览器会到新的网址重新请求该资源。

1.从地址栏显示来说:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址还是原来的地址,redirect是服务器根据逻辑,发送一个状态码,告诉浏览器重新请求那个地址,所以地址栏显示的是新的URL。
2.从数据共享来说:forward转发页面和转发到的页面可以共享request里面的数据,redirect不能共享数据。
3.从运用地方来说:forward一般用于用户登录的时候,根据角色转发到对应的模块;redirect一般用于用户注销登录时返回主页面或跳转到其他的网站等
4.从效率上来说:forward高,redirect低。


5、Servlet与线程安全

Servlet线程是不安全的,多线程并发的读写会导致数据不同步的问题。解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet和doPost方法内。虽然使用
synchronized(name){}语句块可以解决问题,但是会造成线程池的等待,不是很科学的办法。注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性
而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型。

6、JSP和Servlet是什么关系

Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。

7、JSP工作原理

JSP是一种Servlet,但是与HttpServlet的工作方式不太一样。HttpServlet是先由源代码编译为class文件后部署到服务器下,为先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在服务器工作目录里面。

8、JSP有哪些内置对象,作用分别是什么

JSP有9个内置对象:
·request:封装客服端的请求,其中包括来自get或post请求的参数;
·response:封装服务器端对客户的的响应;
·pageContext:通过该对象可以获取其他对象;
·session:封装用户会话的对象;
·application:封装服务器运行环境的对象;
·out:输出服务器响应的输出流对象;
·config:Web应用的配置对象;
·page:JSP页面本身(相当于JAVA中的this);
·exception:封装页面抛出异常的对象。

9、include和include行为的区别

include指令:JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML或文本文件。包含的就好像是该JSP的一部分,会被同时编译执行。语法格式:<%@ include file="文件相对URL的地址"%>
include动作:<jsp:include>动作元素用来包含静态和动态的文件。该动作把指定的文件插入正在生成的页面,语法格式:
<jsp:include page="相对URL地址" flush="true">

10、JSP九大内置对象、七大动作、三大指令

JSP中的四种作用域:page、request、session、application
·page代表与一个页面相关的对象和属性
·request代表与Web客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
·session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
·application代表与整个Web应用程序相关的对象和属性,它实际上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

11、如何实现JSP或Servlet的单线程模式

对于JSP页面,同意通过page指令进行设置。<%@page isTheadSafe="false"%>
对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口
说明:如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会频繁的垃圾回收),所以通常情况下不会这么做。

12、实现会话跟踪的技术有哪些

1.使用cookie
向客户端发送Cookie

Cookie c =new Cookie("name","value"); //创建Cookie 
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
response.addCookie(c); //把Cookie放入到HTTP响应中

从客户端读取Cookie

String name ="name"; 
Cookie[]cookies =request.getCookies(); 
if(cookies !=null){ 
   for(int i= 0;i<cookies.length;i++){ 
    Cookie cookie =cookies[i]; 
    if(name.equals(cookis.getName())) 
    //do something in here. 
     cookie.getValue(); 
    }
 }

优点:数据可以持久保存,不需要服务器资源,简单,基于文本的key-value
缺点:大小受到限制,用户可以禁用cookie功能,由于保存在本地,有一定的风险

2.URL重写
在URL中添加用户的会话信息作为请求的参数,或将唯一的会话ID添加到URL结尾以标识一个会话。
优点:在Cookie被禁用的时候任然可以使用
缺点:必须对网站的URL进行编码,所有页面必须动态生成,不能用预先记录下来的URL进行访问。

3.隐藏的表单域
    <input type="hidden" name="session" value="..." />
优点:cookie被禁用时可以使用,
缺点:所有页面必须是表单提交之后的结果

4.HttpSession
在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户访问某个网站时会自动创建HttpSession,每个用户可以访问他自己的HttpSession。可以通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSession的setAttribute方法可以将一个值放在HttpSession中,通过HttpSession的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。以上三种方式不同的是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的Servlet容器可以在内存满时将HttpSession中的对象移到其他存储设备中,但是这样势必会影响性能。添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了Serializble接口,这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。

13、Cookie和Session的区别

Cookie和Session都是用来跟踪浏览器用户的会话方式,但是两者的应用场景不太一样。
Cookie一般用来保存用户信息。比如①我们在 Cookie 中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你把登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③登录一次网站后访问网站其他页面不需要重新登录。
Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
Cookie数据保存在客户端(浏览器),Session保存数据在服务器端。
Cookie存储在客服端中,而session存储在服务器上,相对来说session安全性更高。若果cookie的一些敏感信息不要写入cookie中,最好能将Cookie信息加密然后使用到的时候再去服务器端解密。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章