servlet的简介

 

servlet是由sun公司提供的一门用于开发动态web资源(java程序向浏览器输出数据)的技术。

 

要想实现开发动态的web资源,需要完成以下两步

 

1.编写一个java类实现HttpServlet的接口。

2.把开发好的java类部署到web服务器中。通常这种java程序也被称为servlet

 

 

servlet的运行原理

 

1—浏览器与服务器先建立连接。

 

2-浏览器发送请求包给服务器。

 

3—服务器根据请求的uri确定要访问的web应用和资源。

 

4—如果访问的这个servlet实例没有存在内存,则创建一个servlet对象,再创建一个请求对象和响应对象,将服务器的请求包中的数据放入新建的请求对象中,将新建的请求对象和响应对象传给servlet对象的service方法并调用,service方法调用相应方法向响应对象写入数据,service方法再将响应对象发送给服务器。

 

5—服务器接收到响应对象,拿出响应数据交给浏览器。

 

 

<load-on-startup>1</load-on-startup>在xml文件中的某个servlet元素内加上这个元素,该servlet会在服务器启动的时候进行加载。

 

servlet对象的生命周期

 

1—如果xml文件中的配置了load-on-startup,则在服务器启动时就会创建一次。还有一种情况是服务器接收到该servlet的请求,但是还没有创建该对象,则会进行创建。

 

2—调用servlet的init方法(该方法传入的是一个ServletConfig对象,该对象包含了xml文件中的参数配置信息),初始化servlet的信息,该方法只有在创建该servlet的时候调用一次。

 

3—响应请求,调用相应的方法。

 

4—在长时间没有被调用或者服务器关闭后,会调用destroy方法来销毁servlet对象。

 

 

servlet接口实现类

 

sun公司定义了两个默认的实现类,分别为GenericServlet、HttpServlet。HttpServlet指能用来处理http请求的servlet,在原有的servlet接口上添加了一些与http协议处理方法。HttpServlet覆写了service方法,该方法体内会自动判断用户的请求方式,调用相应的方法。因此开发时只需要覆写doget或dopost方法而不用覆写service方法。

 

servlet开发时注意的细节

 

1—客户端是通过uri访问我们的servlet程序的,所以要将该程序与uri进行映射,而这个工作就是我们xml文件中添加servlet和servlet-mapping元素来完成。servlet元素用来注册Servlet,包含两个元素,分别是servlet-name设置servlet注册的名称,servlet-class用来设置Servlet的完整类名。servlet-mapping用来映射一个已经注册的Servlet的一个对外的访问路径,包含servlet-name和url-pattern 。一个Servlet可以被映射到多个对外的访问路径。

 

2—如果一个Servlet映射的路径为一个/,则这个Servlet是该web应用的缺省Servlet,即在web.xml文件中找不到的servlet-mapping的url,则将请求交给该Servlet处理。

 

3—servlet采用的是多线程的工作方式,即当多个客户端向同一个Servlet发送请求时,将创建多个线程处理请求,但Servlet对象还是原来创建的那一个。

 

4—当并发的访问一个Servlet时,每个线程如果都调用Servlet的service方法访问了同一个资源的话就存在线程不安全的问题。

 

解决servlet的线程不安全的问题

 

1—将Servlet对象的资源上一把锁,保证任何时候都只有一个线程在访问该资源。

 

2—sun公司提出的解决方案:让Servlet去实现一个SingleThreadModel接口(标记接口),实现了SingleThreadModel接口的Servlet还是可以并发多线程的访问,只不过每个线程有一个Servlet对象,违背了并发的原则。

 

标记接口:把没有定义任何方法和常量的接口称为标记接口,作用就是告诉JVM这个类可以干什么。

 

 

 

ServletConfig的配置

 

配置方式—可以在web.xml文件的Servlet标签内配置多个init-param标签,每个init-param代表一个参数,在init-param标签内在配置两个标签param-name和param-value,分别为参数的名称和值。 

servlet相关内容_servlet

servlet相关内容_servlet_02 

 可以使用ServletConfig的getInitParam方法获取指定的参数值。

 

ServletContext对象

 

服务器在启动时会为每一个web应用创建一个ServletContext对象,它代表当前的web应用,ServletConfig中维护了ServletContext对象的引用,可以通过ServletConfig.getServletContext方法获取ServletContext对象,因为一个web应用的多个Servlet都共享一个ServletContext,所以不同Servlet可以通过ServletContext来实现通信。

 

还可以在web.xml文件中添加标签context-param,里面包括param-name和param-value来定义ServletConfig的初始化参数,可以通过Servlet对象的getInitParameter获取指定的参数。

 

 

ServletContext实现请求转发

 

通过ServletContext对象的getRequestDispatcher方法(传入其它的servlet的路径)获得RequestDispatcher对象,在调用该对象的forward方法传入参数request和response实现请求转发。