Servlet简介

Servlet是运行在服务端的Java小程序,是SUN公司提供一套规范, 用来处理客户端请求、响应给浏览器的动态资源

Servlet的任务有:

  • 1.获取请求数据
  • 2.处理请求
  • 3.完成响应

在Java Web 程序中, Servlet 主要负责接收用户请求 HttpServletRequest , 在 doGet() , doPost() 中做相应的处理,并将 HttpServletResponse 反馈给用户。

Servlet 可以设置初始化参数,供 Servlet 内部使用。 一个 Servlet 类只会有一个实例,在它初始化时调用 init() 方法,销毁时调用 destroy() 方法。 Servlet需要在web.xml中配置(MyEclipse中创建Servlet会自动配置) , 一个Servlet可以设置多个URL访问。

Servlet 不是线程安全的,因此要谨慎使用类变量。

Servlet中的方法

Servlet 接口定义了 5 个方法:

  1. void init(ServletConfig config) throws ServletException
  2. void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
  3. void destory()
  4. java.lang.String getServletInfo()
  5. ServletConfig getServletConfig()

其中init()、service() 和 destroy()方法和 Servlet 生命周期有关。所谓Servlet生命周期,就是 Servlet 对象从创建到销毁的过程

Servlet规范规定,所有的servlet必须实现 javax.servlet.Servlet接口。 Web容器加载Servlet并将其实例化后,Servlet生命周期开始:

    1. 容器运行其init()方法进行Servlet的初始化
    1. 请求到达时调用Servlet的service()方法,service()方法会 根据需要调用与请求对应的 doGet 或 doPost 等方法。
    1. 当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。

注意:

  • init 方法和 destory 方法只会执行一次,而 service 方法当客户端每次请求Servlet都会执行
  • Servlet中有时会用到一些需要初始化与销毁的资源, 因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中, 这样就不需要每次处理客户端的请求都要初始化与销毁资源。

Servlet与线程安全

Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。 解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。 虽然使用 synchronized 语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。

  • 注意:

多线程的并发的读写Servlet类属性会导致数据不同步。 但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。 因此Servlet里的只读属性最好定义为final类型的。

Get和Post请求的区别

Get请求 Post请求
用途 用来从服务器上获得资源 用来向服务器提交数据
传输数据格式 将表单中数据按照 name=value 的形式,添加到 action 所指向的URL 后面,并且两者使用”?”连接,而各个变量之间使用”&”连接 将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL
传输数据限制 受到URL长度限制(1024字节即256个字符) 可以传输大量的数据,上传文件通常要使用post方式
参数 参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get 对于敏感数据还是应用使用post
典型应用 GET方式提交表单的典型应用是搜索引擎,GET方式就是被设计为查询用的 上传文件

转发和重定向的区别

转发(Forward)

转发(Forword)通过 RequestDispatcher 对象的 forward(HttpServletRequest request,HttpServletResponse response)方法实现的。 RequestDispatcher可以通过HttpServletRequest 的getRequestDispatcher()方法获得。

重定向(Redirect)

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

转发(Forward) 重定向(Redirect)
地址栏显示 服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址 服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示的是新的URL
数据共享 转发页面和转发到的页面可以共享request里面的数据 不能共享数据
应用 一般用于用户登陆的时候,根据角色转发到相应的模块 一般用于用户注销登陆时返回主页面和跳转到其它的网站等
效率

Servlet 工作原理详解