servlet

1,什么是servlet?他有什么作用?

  (1)servlet是SUN推出的一套规范,规定了如何用java来开发动态网站,也就是说,java可以开发网站后台,但一定要遵循一定的标准.

  (2)servlet可以使用所有的java API ,类库丰富,功能强大.

  (3)通过servlet,可以:接受用户通过<form>表单提交的信息;

     查询数据库,包括用户信息,文章内容,页面点击次数等;

    生成验证码,防止机器恶意注册.

 

2,什么是ServletContext?他由谁创建?

  当servlet容器启动时,他会部署并加载所有的web应用.当web应用被加载时,servlet容器会一次性为每个应用创建servlet上下文(servletContext)并把它们保存在内存中.servlet容器会处理web应用的web.xml文件,并且一次性的创建在web,xml里定义的servlet,filter,listener,同样也会把他们保存在内存中,当servlet容器关闭时,他会卸载所有的web应用和servletContext,所有的servlet,filter,listener实例都会被销毁.

 

3,servletRequest和ServletResponse从哪里进入生命周期?

  servlet容器包含在web服务器中,web服务器监听来自特定端口的HTTP请求,这个端口通常是80,当客户端(使用web浏览器的用户)发送一个HTTP请求时,servlet容器会创建新的HttpServletRequest和HttpServletResponse对象,并且把他们传递给已经创建的Filter和请求URL匹配的Servlet实例的方法,所有的这些都是使用同一个线程.

  request对象获取了http请求的所有信息的入口,比如请求头和请求实体,response对象提供了控制和发送http响应的便利方法,比如设置响应头和响应实体(通常jsp生成的html内容),当http响应被提交并结束后,request和response对象都会被销毁.

 

4,servlet是线程安全的吗?servlet如何保证线程安全?

  (1),实现SingleThreadModel接口

    该接口指定了系统如何处理对同一个servlet的调用,如果一个servlet被这个接口指定,那么在这个servlet中的service方法就不会有两个线程被同时执行,当然也就不会存在线程安全问题.只要实现这个接口就可以了.

  (2),同步对共享数据的操作

    使用synchronized关键字能保证一次只有一个线程可以访问被保护的区段.

  (3),避免使用实例变量

    线程安全问题还是有些是由实例变量造成的,只要在servlet里面的任何方法里面都不使用实例变量,就安全.

  

5,servlet为什么是线程不安全的?

  当客户端第一次请求servlet的时候,tomcat会根据web.xml配置文件实例化servlet,当又有一个客户端访问该servlet时,不会再实例化该servlet,也就是多个线程在使用这个实例,

  servlet线程池

  servlet采用多线程来处理多个请求同时访问,tomcat容器维护了一个线程池来服务请求.

  线程池实际上是等待执行代码的一组线程叫做工作组线程,tomcat容器使用一个调度线程来管理工作组线程.

  当容器收到一个servlet请求时,dispatcher线程从线程池中选出一个工作组线程,将请求传递给该线程,然后由该线程来执行servlet的service方法.

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

 

6, 什么是CookieCookie有什么规范?

  ① 什么是cookie

  Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

  ② HTTPcookie规范如下:

  Cookie大小上限为4KB

  一个服务器最多在客户端浏览器上保存20Cookie

  一个浏览器最多保存300Cookie

 

7, Cookie的生命

  ① 什么是Cookie的生命

  Cookie不只是有namevalueCookie还是生命。所谓生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。

  cookie.setMaxAge(-1)cookiemaxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。

  cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时;

cookie.setMaxAge(0)cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过CookiesetMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie 

 

8, Cookie中保存中文

  ① Cookie中保存中文

Cookie中根本不能保存中文!需要把中文转换成URL编码后才能保存。这也说明读取Cookie之后,还要使用URL解码!!!

  Cookienamevalue都不能使用中文,如果希望在Cookie中使用中文,那么需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中。

 

9, cookie的应用以及注意

  ① 使用cookie的注意事项

  不要保存私人信息。 

  任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode,当然也可以用完善的逆加密方式,遗憾的是,最好不要用md5来加密)。

  是否保存登陆信息,需有用户自行选择。 

  长于10K的数据,不要用到Cookie

  ②  cookie最典型的应用

  判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。 

  另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。

 

10, 什么是session

  ① 当首次使用session时,服务器端要创建sessionsession是保存在服务器端,而给客户端的sessionid (一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session

 

11, session的生命周期

  getSession() getSession(true);

  ① Session的销毁只有两种情况:第一:session调用了 session.invalidate()方法. 第二:前后两次请求超出了session指定的生命周期时间. 其中Session的生命周期时间可以在web.xml配置. 默认30分钟 在web.xml可以做如下配置:

  <session-config>

   <session-timeout>5</session-timeout>

  </session-config>

 

12,什么是filter?

  filter被称作是过滤器,功能是对servlet容器调用servlet的过程进行拦截,从而在servlet进行响应处理前后实现一个特殊功能和业务上的功能.

 

13,filter的生命周期.

  服务器启动的时候加载过滤器的实例,并调用init()来初始化实例,每一次请求都只调用方法doFilter()进行处理,停止服务器时调用destroy()方法,销毁实例.

 

14,filter与interceptor的区别

  拦截器基于java反射机制的,过滤器是基于函数回调.

  拦截器不依赖于servlet容器,过滤器依赖于servlet容器.

  拦截器只能对action请求起作用,过滤器对所有的请求起作用.

  拦截器可以访问action上下文,值栈里面的对象,过滤器不能.

  在action的生命周期中,拦截器可以多次调用,过滤器只能在容器初始化时调用一次.

 

15,filter的应用.

  filter实现统一全站编码.

  细粒度权限控制.

  分ip统计网站的访问次数.

  filter实现页面静态化.

  

 

 

16,什么是listener?

  listener是servlet事件监听器,servlet事件监听器就是一个实现特定接口的java程序,专门用于监听web应用程序中的servletContext,HttpSession和ServletRequest等域对象的创建和销毁过程,监听这些域对象属性的修改以及感知绑定到HttpSession域中某个对象的状态.

 

17,listener的应用场景.

  统计当前在线的人数.

  日志监听.

  特定要求过滤关键字拦截(过敏敏感字符).

 

18,tomcat怎么处理请求的?

  

  客户端点击一个连接,url执行一个servlet

  容器中的部署文件将url映射到servlet,会创建两个对象,httpServletRequest和httpServletResponse.

  容器根据请求中的url找到正确的servlet,为这个请求创建或者分配一个线程,把请求和响应对象传递给这个servlet线程

  容器调用servlet里面的service()方法,根据请求的不同类型(post or get)service()方法会调用doGet()或者doPost()方法

  假如请求是一个http get请求,doGet()会生成动态页面,并把这个页面填入响应对象.

  线程结束,容器吧响应对象转换成一个http响应,把它发回给客户,然后删除请求对象和响应对象.

 

19,请求转发和重定向的区别?

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

  重定向需要再次回到浏览器,请求转发不需要再次回到浏览器.

  重定向请求两次,请求转发请求一次.

  重定向可以跨域请求,请求转发不能跨域请求.

 

20,使用tomcat的时候做了哪些配置?

  配置tomcat支持http协议

  配置NIO

  配置tomcat压缩静态文件

  配置最大线程数

 

21,servlet的声明周期?

  Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGetdoPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

   

 22,过滤器的配置以及它的作用?

  过滤器是一个对象,可以传输请求或修改响应。它可以在请求到达Servlet/JSP之前对其进行预处理,而且能够在响应离开Servlet/JSP之后对其进行后处理。所以如果你有几个Servlet/JSP需要执行同样的数据转换或页面处理的话,你就可以写一个过滤器类,然后在部署描述文件(web.xml)中把该过滤器与对应的Servlet/JSP联系起来。你可以一个过滤器以作用于一个或一组servlet,零个或多个过滤器能过滤一个或多个servlet。一个过滤器实现java.servlet.Filter接口并定义  它的三个方法:

  1) void init(FilterConfig config) throws ServletException:在过滤器执行service前被调用,以设置过滤器的配置对象。

  2) void destroy();在过滤器执行service后被调用.

  3) Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;

 

23,如何防止表单的重复提交?

  使用js来防止表单的重复提交

  使用session技术

  在jsp页面生成一个唯一的随机值,将其保存在session中,同时将其保存在表单的隐藏域的值在处理注册的请求时,获取session中的值,获取请求参数的值,比较两着是否相同,相同说明不是重复提交,请求通过同时提交session中保存的值,如果不想听则是重复提交,不能通过.

 

24, HTTP 请求的 GET POST 方式的区别

  可以从以下几个方面去回答:

  1. 携带请求参数的方式

  GET: 通过请求行携带参数, 参数会显示在地址栏

  POST: 通过请求体来携带参数, 参数不会显示在地址栏

  2. 服务器端处理请求的方法

  GET: 会调用 Servlet doGet()来处理请求

  POST: 会调用 Servlet doPost()来处理请求

  3. 数据大小与安全性

  GET: 大小有限制(小于 2k), 不安全 POST: 大小没有限制, 安全

 

 

 

  

 

  

 

  

  

posted @ 2017-03-19 22:23  鹿小框  阅读(212)  评论(0编辑  收藏  举报