基础-Servlet

Servlet是运行在web服务器上的一个java类。

它的作用是将http请求和http相应进行操作完成我们的业务逻辑。

servlet创建

  1.创建一个类extends HttpServlet

  2.重写一个请求处理的方法 doGet

  3.servlet配置 web.xml中进行配置 如下:

<servlet>

  <servlet-name>HelloWorldExample</servlet-name>

  <servlet-class>HelloWorldExample</servlet-class>

</servlet>

<servlet-mapping>

  <servlet-name>HelloWorldExample</servlet-name>

  <url-pattern>/servlets/servelt/HelloWorldExample</url-pattern>

</servlet-mapping>

servlet生命周期

  1.客户端请求该servlet;

  2.加载servlet类到内存;

  3.实例化、初始化该servlet;

  4.init()初始化参数;

  5.service()doGet() 或者 doPost());

  6.destory()。

 当第一次访问时,服务器会根据请求的url,在web.xml文件中查找到对应的servlet,并将其实例化。

同时调用了init方法,这个方法只被调用一次。

开启一个线程,调用service方法。

当下一次再访问时,都是开启一个新线程来调用service方法

如果服务器关闭了,会调用servletdestroy方法来销毁实例。

 注意:

 1.servlet实例是由服务器创建的,并且一般情况下只有一个,常驻内存。

 2.servlet是线程不安全的,不建议在servlet中创建成员变量,如果创建了,需要考虑同步。

对于<url-pattern>我们在开发中它的写法有以下几种:

 完全匹配  我们之前写的都是完全匹配方式 ,它要求必须以/”开始

 目录匹配  必须以/”开始,以”*”结束

 扩展名匹配  不能以/”开始,以*.xxx结束 xxx代表的是后缀名

 优先级 完全匹配>目录匹配>扩展名匹配

 我们在html页面上怎样可以向服务器发送一个请求?

 1.超连接   <a>

 2.表单 <form action=””  method=””>

 3.location.href=””

 4.直接在地址栏上输入

 对于超连接  location.href它们都是get请求方式.

 唯一可以post请求方式的只有表单这一种方式

 ServletConfig对象

它是servlet的一个配置对象

ServletConfig对象是由servlet容器创建的,在访问对应的servlet时将ServletConfig对象通过init方法传递到了Servlet中。每一个Servlet都有自己的ServletConfig对象。

 在我们的servlet中要想获取ServletConfig对象:

 ServletConfig config=this.getServletConfig();

 ServletConfig对象作用:

获取Servlet name  获取的是<servlet-name>中的值

获取 Servlet的初始化参数

获取ServletContext对象。

 ServletContext

 ServletContext context=ServletConfig.getServletContext();

 ServletContext是什么,它有什么作用?

 每一个web应用被web容器加载时,就会产生一个ServletContext对象,

简单理解就是一个web应用对应一个ServletContext.

ServletContext对象是由web容器创建的。

  web容器也就是tomcat服务器

 要获取一个ServletContext对象可以通过 ServletConfig.getServletContext()

 域对象   上下文

 web中如果听到域对象,就将其想像成Map

 作用:

 可以实现多个servlet之间的通信。

 可以获取ServletContext的初始化参数

 可以获取资源信息

 String getRealPath() 可以获取服务器上的资源的绝对磁盘路径。

 InputStream getResourceAsStream(String path) 可以获取一个指向指定资源的输入流

 getResource()

 其它功能

 获取mime类型    String getMimeType(String )

 分发请求

 写入日志.

 ServletContext可以实现Servlet之间的共享。

setAttribute(String name,Object value)

Object getAttribute(String name)

removeAttribute(String name);

 classpath路径

Class在获取时,getResource() 参数建议从”/”开始写

ClassLoader在获取时,getResource(“”)它本身就是从根目录查找,所以不建议使用”/

 户端访问servlet的路径问题

 绝对  带协议   不带协议  /工程名/资源路径

 相对  考虑当前页面与访问的servlet之间的关系

 Requestresponse是代表请求与响应的两个对象,它是由web服务器创建的,传递给我们自己的Servletservice方法.

 通过request对象就可以获取http请求信息。

 通过response对象就可以设置http响应信息。

 解决响应操作乱码:

 response.setCharacterEncoding(String charsetName) 设置响应信息编码

 response.setContentType(text/html;charset=utf-8); 设置响应信息编码,还通知浏览器以什么编码来显示信息

 获得浏览器类型

 String agent=request.getHeader("user-agent");

 常用状态码

 200请求成功(其后是对GETPOST请求的应答文档。)

 302所请求的页面已经临时转移至新的url

 304未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

 404没有找到文件或目录。

 405请求中指定的方法不被允许

 500请求未完成。服务器遇到不可预知的情况

请求转发和重定向的区别:

 1.请求转发是服务器内部跳转,地址栏不会发生改变

 重定向地址栏会发生改变。

 2.请求转发,只有一次请求,一次响应.

 重定向,有两次请求,两次响应。

 3.请求转发存在request域,可以共享数据.

 重定向不存在request域。

 4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。

 重定向可以访问站外资源,也可以访问站内资源.

 5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()

 重定向是由response 发起的  response.sendRedirect();

 6.请求转发与重定向时路径写法不一样.

 重定向要跳转的路径是从浏览器在次发起的,是浏览器端路径,这时必须写在   /工程名/资源

 请求转发是服务器内部跳转,这时它与浏览器无关 写法   /资源

原文地址:https://www.cnblogs.com/MessiAndDream/p/5880172.html