web开发笔记二 一文读懂servlet的原理和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎联系我qq2488890051 https://blog.csdn.net/kangkanglhb88008/article/details/84405307
  • Servlet的原理

 servlet就是众多响应程序的一个响应程序(web中是以servlet为基本单位的响应(函数)方式),而具体怎么响应是通过关联一个java类来实现的,java类里面的某些方法就是具体怎么响应的源码了,一个具有特定响应功能的(可以看成就是一个函数功能),一个.java文件,编译后就是一个.class文件,存在于服务器端的电脑 。servlet这时候就是一个基本响应模块,就相当于是一个函数,是可以被外部调用的,比如别的函数调用它(通过实例化它关联的那个java类吧),或者直接在客户端通过输入URL(网址)来直接访问他,那这个URL是多少呢?由下面web.xml里面指定:

<servlet>

   <servlet-name>input</servlet-name>

   <servlet-class>org.lxh.servlet.InputServlet</servlet-class>  // 指定这个servlet关联的是哪个类,这个类就具体指定了怎样的响应方式

</servlet>

<servlet-mapping>

   <servlet-name>input</servlet-name>

   <url-pattern>/servletdemo/input</url-pattern>    // 这里就是指定这个servlet的URL

</servlet-mapping>

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

扫描二维码关注公众号,回复: 4205414 查看本文章

比如一个表单的提交按钮按下后:

这里的表单数据会提交且访问到路径为 "input" 的servlet,实际上这是一个相对地址,完整的是:xxx/xxx/input 这个URL指向的servlet,或者一个xxx.html也行(但是也是会调用缺省的servlet)

向何处发送表单数据。

可能的值:

  • 绝对 URL - 指向其他站点(比如 src="www.example.com/example.htm")
  • 相对 URL - 指向站点内的文件(比如 src="example.htm")

同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名

在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以"/*"结尾

缺省Servlet

  如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。 
  凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

当访问不存在的Servlet时,就使用配置的默认Servlet进行处理,如下图所示:

当访问Tomcat服务器中的某个静态HTML文件和图片时(因为在浏览器中访问的URL都是指servlet的URL,但是我们输入的是一个.html静态页面URL,这时候肯定就不是一个servlet,那么首先浏览器会首先加载出这个.html文件页面,其次,服务器会把缺省的servlet的执行结果返回给客户端浏览器,即一个每次浏览器的访问总是有一个servlet会与之响应),实际上是在访问这个缺省Servlet。

  • servlet运行过程

  • Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后(比如表单中提交按钮发射数据):
      ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象(在服务器的jvm运行上面那个java类)。如果是,则直接执行第④步,否则,执行第②步。
      ②装载并创建该Servlet的一个实例对象。 这是第一次浏览器这个页面的这个表单按钮按下的请求
      ③调用Servlet实例对象的init()方法。
      ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
      ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。 

Servlet接口实现类

  Servlet关联的那个类,SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。

  HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
  HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。例如下面这样写就ok:

那么这个servlet关联的java类 里面可以实现哪些功能呢:

  • JavaWeb中servlet主要功能是承载网络连接,业务逻辑处理,比如一些编码格式的转换、登录拦截,数据库的增删查改,然后把数据处理结果以一定得数据格式返回给浏览器(不一定是HTML内容格式的形式), 这时候浏览器就会根据接收到的数据的格式做对应的操作,比如浏览器提交了表单,这时候服务器端的servlet处理好后回传给浏览器进行登录成功或者失败的显示
  • 根据客户端请求生成响应内容并将其传给服务器,生成动态的Web内容,例如下面代码:
  • 23     public void doGet(HttpServletRequest request, HttpServletResponse response)
    24             throws ServletException, IOException {
    25 
    26         response.setContentType("text/html");
    27         PrintWriter out = response.getWriter();
    28         out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    29         out.println("<HTML>");
    30         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    31         out.println("  <BODY>");
    32         out.print("    This is ");
    33         out.print(this.getClass());
    34         out.println(", using the GET method");
    35         out.println("  </BODY>");
    out.println("</HTML>");   // 很明显这里就是在动态生成html内容,然后out对象就自动把这些内容返回给浏览器进行显示了 
    37         out.flush();
    38         out.close();
    39     }
  •  

参考博客:

https://www.cnblogs.com/xdp-gacl/p/3760336.html

https://www.cnblogs.com/ssscorch/p/6189737.html

猜你喜欢

转载自blog.csdn.net/kangkanglhb88008/article/details/84405307