Servlet/jsp

* 号的表示个人觉得很重要的知识点,需要留意。
1、 Servlet JSP 有什么区别***
Servlet JSP 完成的功能是相同的,都可以接收用户的请求,可以对用户进行响应,可以调用业务方法。
不同点在于JSP 是在html 或者xml 中嵌入了Java 代码或者JSP 的标记,在制作页面方面具有优势,可以使用网页编辑工具来制作网页,然后嵌入Java 或者JSP 的标记。Servlet 是纯Java 代码,通常用于控制,不用于输出。在MVC 模式中,JSP 通常充当视图,Servlet 通常充当控制器。另外,JSP 在运行的时候还要转换成类似于Servlet Java 代码。
2、Servelt 通常有哪些方法
init 方法,完成初始化
service 方法,包括doGet doPost ,用于接收用户的请求,调用后台的JavaBean 或者EJB ,选择界面对用户响应。
destroy 方法,用于释放资源
3、  谈谈 Servlet 的生命周期 *****
当接收到请求的时候,容器察看对应的Servlet 对象是否存在,如果不存在,需要加载Servetl ,实例化Servlet ,调用init 方法进行初始化。如果已经存在,根据用户的请求创建request response 对象,把这两个对象作为参数调用Servlet 对象的service 方法,Servlet 通过这个方法与用户进行交互,方法执行完之后,对请求的处理结束。Servelt 对象继续等待下一个请求。当应用卸载的时候,调用destroy 方法释放资源。多个请求共享Servelt 对象(即单实例)。

Servlet何时被创建:

  1,默认情况下,当WEB客户第一次请求访问某个Servlet的时候,WEB容器将创建这个Servlet的实例。

  2,当web.xml文件中如果<servlet>元素中指定了<load-on-startup>子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象。

  注意:在web.xml文件中,某些Servlet只有<serlvet>元素,没有<servlet-mapping>元素,这样我们无法通过url的方式访问这些Servlet,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载这些Servlet并调用init()方法,完成一些全局性的初始化工作。

Web应用何时被启动:

  1,当Servlet容器启动的时候,所有的Web应用都会被启动

  2,控制器启动web应用

Servlet终止阶段:

  当WEB应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet新实例时,Servlet容器会先调用Servlet的destroy()方法,在destroy()方法中可以释放掉Servlet所占用的资源。


4、 J sp有那些内置对象?作用分别是什么? ****
JSP共有以下9种基本内置组件:
 request 用户端请求,此请求会包含来自GET/POST请求的参数 
   response 网页传回用户端的回应 
   pageContext 网页的属性是在这里管理 
   session 与请求有关的会话期 
   application servlet 正在执行的内容 
   out 用来传送回应的输出
   config servlet的构架部件 
   page JSP网页本身 
   exception 针对错误网页,未捕捉的例外
5、  页面间对象传递的方法:request,session, application, cookie等
6、  编写Servlet 通常需要实现的两个方法是什么?
doGet 方法和doPost 方法
7、 doGet 方法和doPost 方法中的两个参数是什么?
HttpServletRequest HttpServletResponse ,前者封装了与请求相关的信息,后者封装了与响应相关的信息。要获取请求信息,从第一个参数获取,要对用户响应,通过第二个参数。
8、  要获取用户信息,如何获取
request getParameter 方法和getParameterValues 方法,前者用于获取单值表单元素的值,或者用于获取多值的情况,典型的复选框。前者返回的是一个字符串,后者返回的是字符串数组。如果参数指定的表单元素不存在,返回null
9、  要给用户响应信息,如何完成?
设置响应内容的类型:response.setContentType(“text/html;charset=gb2312”);
获取输出流对象:PrintWriter out = response.getWriter();
输出信息:通过out println 方法
10、 Servlet 中选择接面对用户响应,如何实现?
两种方式:使用RequestDispatcher response sendRedirect 方法
如果使用RequestDispatcher(转发)
RequestDispatcher rd = request,getRequestDispatcher(“ 目标文件”);
rd.forward(request,response);
如果使用sendRedirect 方法(重定向):
    response.sendRedirect(“ 目标文件”);

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 sendRedirect()方法
11、 SERVLET API中forward() 与redirect()的区别? 
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 sendRedirect()方法
12、 Servlet 中如何获取Session 对象,如何获取Cookie
使用request 对象的getSession 方法获取session ,通过getCookies 获取Cookie
13、Servlet 在哪个文件中进行配置?
Web 应用的WEB-INF 下面的web.xml 中进行配置。
14、 如何配置Servlet
包括两步:Servlet 的声明和Servlet 访问方式的声明。
Servlet 的声明:
<servlet>
<servlet-name>servlet 的名字(自己定义的)</servlet-name>
<servlet-class>servlet 的完整类名</servlet-class>
</servlet>
Servlet 访问方式的声明
<servlet-mapping>
<servlet-name>Servlet 的名字(应该和声明的时候保持一致)</servlet>
<url-pattern> 访问路径</url-pattern>
</servlet-mapping>
15、 编译好的Servlet 类放在什么位置?
放在Web 应用WEB-INF 下面的classes 文件夹中。
16-1、filter 的作用是什么?主要实现什么方法?doFilter方法里面的2个参数request 和 response? 他问 这两个接口的全称是什么? 
Filter使用户可以改变一个request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).一个filter 包括: 
  A) 在servlet被调用之前截获; 
  B) 在servlet被调用之前检查servlet request;   
C) 根据需要修改request头和request数据;   
D) 根据需要修改response头和response数据;  
E) 在servlet被调用之后截获.

16-2、filter 的作用是什么?主要实现什么方法?doFilter方法里面的2个参数request response? 这两个接口的全称是什么?

 1.Filter使用户可以改变一个request和修改一个response. Filter 不是一个servlet,不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servlet chaining(servlet ).一个filter 包括  

1. servlet被调用之前截获  

2. servlet被调用之前检查servlet request;   

3. 根据需要修改request头和request数据  

4. 根据需要修改response头和response数据 

5. servlet被调用之后截获.

17、谈谈Servlet过滤器的作用***

     Servlet 是特殊的Servlet ,能够对特定的请求路径进行过滤,在访问这个路径之前,先执行过滤器,过滤器进行预处理,过滤器决定是否继续执行后续的文件。典型的应用,可以把用户验证的代码写在过滤器中,然后把过滤的路径配制成需要验证的文件的路径。
18、 谈谈Servlet 监听器的作用 **
Servlet 监听器对特定的事件进行监听,当产生这些事件的时候,会执行监听器的代码。可以对应用的加载、卸载,对session 的初始化、销毁,对session 中值变化等事件进行监听。

19、 什么是Servlet链? (第一次听说这概念,不知重不重要)

 与UNIX和DOS命令中的管道类似,你也可以将多个servlet以特定顺序链接起来。在servlet链中,一个servlet的输出被当作下一个servlet的输入,而链中最后一个servlet的输出被返回到浏览器。 
servlet链接提供了将一个servlet的输出重定向为另一个servlet的输入的能力。这样,你就可以划分工作,从而使用一系列servlet来实现它。另外,你还可以将servlet组织在一起以提供新的功能。



下面是一些关于Servlet与多线程的问题:

一,servlet容器如何同时处理多个请求。

Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求。
线程池实际上是等待执行代码的一组线程叫做工作者线程(Worker Thread),Servlet容器使用一个调度线程来管理工作者线程(Dispatcher Thread)。

当容器收到一个访问Servlet的请求,调度者线程从线程池中选出一个工作者线程,将请求传递给该线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度者线程将从池中选出另外一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet还是另外一个Servlet。当容器同时收到对同一Servlet的多个请求,那这个Servlet的service方法将在多线程中并发的执行。

二,Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间。对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。

就实现来说:
  调度者线程类所担负的责任如其名字,该类的责任是调度线程,只需要利用自己的属性完成自己的责任。所以该类是承担了责任的,并且该类的责任又集中到唯一的单体对象中。而其他对象又依赖于该特定对象所承担的责任,我们就需要得到该特定对象。那该类就是一个单例模式的实现了。

三,如何开发线程安全的Servlet   

                                                                                                         
        1,变量的线程安全:这里的变量指字段和共享数据(如表单参数值)。

  a,将 参数变量 本地化。多线程并不共享局部变量.所以我们要尽可能的在servlet中使用局部变量。
          例如:String user = "";
                     user = request.getParameter("user");

  b,使用同步块Synchronized,防止可能异步调用的代码块。这意味着线程需要排队处理。在使用同板块的时候要尽可能的缩小同步代码的范围,不要直接在sevice方法和响应方法上使用同步,这样会严重影响性能。

 2,属性的线程安全:ServletContext,HttpSession,ServletRequest对象中属性
        ServletContext:(线程是不安全的)
        ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
        所以在Servlet上下文中尽可能少量保存会被修改(写)的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
         HttpSession:(线程是不安全的)
         HttpSession对象在用户会话期间存在,只能在处理属于同一个Session的请求的线程中被访问,因此Session对象的属性访问理论上是线程安全的。当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性。这时我们需要对属性的读写进行同步处理:使用同步块Synchronized和使用读/写器来解决。

  ServletRequest:(线程是安全的)
         对于每一个请求,由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的。
         注意:ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。

 3,使用同步的集合类:
       使用Vector代替ArrayList,使用Hashtable代替HashMap。

 4,不要在Servlet中创建自己的线程来完成某个功能。
       Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线程安全问题。

 5,在多个servlet中对外部对象(比方文件)进行修改操作一定要加锁,做到互斥的访问。

四,SingleThreadModel接口
        javax.servlet.SingleThreadModel接口是一个标识接口,如果一个Servlet实现了这个接口,那Servlet容器将保证在一个时刻仅有一个线程可以在给定的servlet实例的service方法中执行。将其他所有请求进行排队。服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下次请求。这样就造成并发访问的问题。此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值