分享

Servlet

 印度阿三17 2018-09-26

※ 1.什么是servlet
servlet其实就是java里面一种java类,只不过这种java类有一些特殊的作用,所以我们就叫它servlet

※ 2.servlet的作用
可以让浏览器直接通过一个路径去访问。(一般的java类是做不到这一点的)

※ 3.怎么写一个类,能成为一个servlet
三种方式:
a.实现一个接口:javax.servlet.Servlet
b.继承一个抽象类:javax.servlet.GenericServlet
c.继承一个抽象类javax.servlet.http.HttpServlet
这种是之后一直要用的方法.

注意:Servlet接口中,有五个抽象方法,其实最重要的一个方法是:

service(ServletRequestreq,ServletResponse res)

A. 抽象类GenericServlet实现了接口Servlet,但是留了一个抽象方法没有实现,就是上面所提到的service方法,除此之外,GenericServlet里面还增加了一些新的方法.
B. 抽象类HttpServlet,继承了GenericServlet,但是HttpServlet中没有任何抽象方法,除了从父类继承过来的方法之外,里面还有很多新的方法:doXxx方法,另外需要注意的是,HttpServlet里面有俩个service方法,但是俩个方法的参数类型不同.

i.Servlet接口中的service方法.
因为无论我们使用哪一种方式去写出来的一个servlet类的中,一定会有一个方法叫做service,这个方法是Servlet接口中的定义的,tomcat服务器接收到客户端请求后,帮我们调用servlet中的方法的时候,它只会调用这一个service方法.
注意这个service方法中参数的类型:

  service(ServletRequestreq,ServletResponse res)

ii.GenericServlet中的俩个init方法
带参数的init(ServletConfig config)方法是从Servlet接口中实现的,还有一个是这个类直接定义的,无参的init()方法.
tomcat服务器创建servlet对象的时候,会帮我们去调用init(ServletConfig config)进行servlet类中的初始化工作,所以如果我们想在servlet类中初始化自己的一些相关数据的话,需要去重写这个init方法。有参数的init方法中调用了无参的init方法,所以将来我们只需要重写这个无参的init方法就可以了。这样我们就不需要再专门对这个init(ServletConfig config)方法中的参数进行处理了。

iii.HttpServlet中的俩个service方法
a. 这个是从Servlet接口中实现的方法.

service(ServletRequest req, ServletResponse res){
	    //强转参数类型
	    HttpServletRequest request = (HttpServletRequest)req;
	    HttpServletResponse response = (HttpServletResponse)res;
	    
	    //调用新定义的service方法
	    service(request,response);
		
	}

b. HttpServlet中新定义的方法

service(HttpServletRequest req, HttpServletResponse resp){
	   //拿到当前请求的类型 get/post
	   String method = req.getMethod();
	   
	   //判断请求的方法 然后去调用doXxx方法
           if(method.equals("GET")){
		doGet(req,resp);
	   }
	   if(method.equals("POST")){
		doPost(req,resp);
	   }
	   ...
	   ..
	}
	http://ip:port/项目名字/资源路径
	
	http://127.0.0.1:8002/web_test/servlet1

※ 4.servlet的生命周期
servlet的对象是单例:在web项目整个运行期间,每一个servlet类只会有一个对象存在.默认情况下,这一个对象是在servlet第一次被访问的时候才会创建的,而且之后不管再访问多少次这个servlet,也不会再去创建它的的对象的.(我们可以设置某一个servlet的对象在服务器启动的时候就被创建出来)

这些操作(方法的调用)都是由服务器来做的:
1.默认情况下,第一次被访问的时候tomcat创建servlet对象(调用无参构造器)
2.tomcat调用init(ServletConfig config)方法
在servlet对象实例化之后,tomcat服务器会立马调用这个方法给servlet的实例进行初始化工作。
3.客户端访问的时候,tomcat会调用service(ServletRequest req,ServletResponse res)方法
4.在销毁servlet对象的时候会tomcat调用destroy()方法.

通过web.xml文件中设置,可以让servlet的对象是在服务器启动的时候被创建出来.

web.xml:
	  <servlet>
		 <servlet-name>LifeServletTest</servlet-name>
		 <servlet-class>com.briup.servlet.LifeServletTest</servlet-class>
		 <load-on-startup>1</load-on-startup>
	 </servlet>

加入<load-on-startup>标签,表示这个servlet需要在启动服务器的时候就被创建对象.其中,标签可以要放一个数字,这个数字的大小就决定了多个servlet对象被创建的顺序,数字越小越先创建.(如果我们配置了多个servlet在启动服务器的时候被创建对象的话)

※ 5.servlet的线程安全问题
问题产生的原因:
1.servlet是单例,一个servlet类只有一个对象在项目运行期间。
2.web项目项目本身就有多线程的特点,虽然我们在代码中没有写和线程相关的东西,但是这个多线程的特点是由服务器给我们提供出来的,一个客户端发送了一个请求,服务器接收到请求后就会建一个线程去处理这个请求。
所以就有可能出现这样的情况:俩个线程同时去访问同一个servlet对象.

如何解决/防止
1.加锁synchronized
2.尽量少的定义成员变量
因为只有成员变量才会产生线程安全的问题(在多个线程访问同一个对象的时候),方法中的局部变量是没有这样的问题的.
3.其他(实现一些安全性的接口)

来源:http://www./content-4-25011.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多