Servlet编程

Servlet

servlet特点:

            1)servlet就是一个普通的java类,继承HttpServlet类

            2)一个普通的java类实现了Servlet接口,也叫Servlet程序。我们通常继承HttpServlet是为了创建一个基于http协议的servlet程序。

            3)servlet程序交给tomcat服务器运行!!!

servlet的开发过程:

        1、继承HttpServlet类

        2、编写web.xml的配置文件

<!-- 浏览器访问: http://localhost:8080/day10/hello -->
  <!-- 配置一个servlet -->
  <!-- servlet的配置 -->
  <servlet>
  	<!-- servlet内部名称。可以自定义 -->
  	<servlet-name>HelloServlet</servlet-name>
  	<!-- servlet类的全名:包名+简单类名 -->
  	<servlet-class>gz.itcast.a_servlet.HelloServlet</servlet-class>
  </servlet>
  <!-- servlet的映射配置 -->
  <servlet-mapping>
  	<!-- sevlet内部名称。和servlet配置的内部名称保持一致!! -->
  	<servlet-name>HelloServlet</servlet-name>
  	<!-- servlet的路径映射。访问servlet的名称 -->
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>

servlet的执行过程:

前提: tomcat服务器启动时,会加载%conf%/web.xml文件。然后再加载站点下的每个web应用的web.xml文件。

                  浏览器输入:http://localhost:8080/day10/hello

                  http://       http协议

                                            1)本地hosts文件查询域名和ip的映射

                                            2)找不到,联网到运营商的DNS服务起器找域名和ip的映射

                  8080       端口  tomcat:8080

                  /day10      站点下的web应用名称

                  /hello       资源名称。截取到/hello 字符串

                                                     1)在day10应用下的web.xml文件中查找是否存在匹配的url-pattern

                                                     2)使用servlet的内部名称在web.xml文件中查找是否存在相同名称的servlet配置

                                                     3)得到对应的servlet-class内容。

                                                             字符串:gz.itcast.a_servlet.HelloServlet

                                                     通过反射构造HelloServlet对象,调用方法(doGet.......

                                                     输出内容到浏览器,看到效果!!!

servlet的路径映射:

url-pattern: 表示servlet的路径映射,也叫servlet访问名称。

                                     url-patttern                  浏览器输入URL

  精确匹配                      /demo1                       http://localhost:8080/day10/demo1                                  

                                     /itcast/demo1             http://localhost:8080/day10/itcast/demo1

 

  模糊匹配                             /*                             http://localhost:8080/day10/任意路径

                                            /itcast/*                   http://localhost:8080/day10/itcast/任意路径

                                             *.后缀                       http://localhost:8080/day10/任意路径.后缀

                                            (*.do

                                              *.action

                                              *.jsf

                                            *.html)

注意:

                  1)url-pattern要么以/开头,要么以*开头    例如:itcast/demo1错误写法。 

                  2)不能同时使用两种模糊匹配。例如:/itcast/*.html 错误写法

                  3)当多个url-pattern同时符合匹配规则,那么

                          3.1  精确匹配的url-pattern会优先被执行。(长的最像的url-pattern优先)

                          3.2  后缀名结尾的模糊匹配的url-pattern优先级最低!!!

servlet的缺省路径:

/  : 表示servlet的缺省路径。

          在tomcat服务器中配置了一个DefaultServlet,叫默认Servlet,该默认Servlet的url-pattern就是/ 。默认Servlet的作用,用于解析web应用下的静态资源。

                    问题: 浏览器输入一个资源名称时,查找资源的顺序是如何?

                          1)首先,在当前web应用下的web.xml文件中查找是否有匹配的url-pattern 

                          2)如果匹配到,执行对应的servlet(动态资源)

                          3)如果没有匹配到,就交给tomcat服务器的默认Servlet去处理

                          4)默认Servlet会到当前web应用下读取对应名称的静态资源文件。

                          5)如果读到对应的静态资源文件,那么就把内容返回给浏览器

                          6)如果读不到对应的静态资源文件,那么就返回404的错误页面。

                          结论:先找动态资源,再找静态资源!!!!

重点:servlet的生命周期
1、Servlet四个生命周期
        

构造方法: 在创建servlet对象时调用。只调用1次。证明servlet对象在tomcat服务器中是单实例的。

init方法:在创建完servlet对象后调用。只调用1次。

service方法:在每次请求servlet时调用。调用n次。

destroy方法:servlet对象销毁时调用。只调用1次。tomcat服务器停止或web应用重新部署时调用

2、用伪代码模拟tomcat服务器如何调用servlet生命周期

浏览器输入: http://localhost:8080/day10/hello

得到字符串: gz.itcast.a_servlet.HelloServlet

1)tomcat服务器通过反射构造对象
	1.1 得到字节码对象
	Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ");
	1.2 构造对象
	Object hello = clazz.newInstance();       --1) servlet的构造方法被调用
2)tomcat服务器调用init方法
	2.1 得到init方法对象
	Method m = clazz.getDeclareMethod("init",ServeletConfig.class);
	2.2 执行方法
	m.invoke(hello,config);                --2)servlet的init方法被调用

3)tomcat服务器创建request和response对象,调用service方法
	2.1 得到service方法对象
	Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletRespnose.class);
	2.2 执行方法
	m.invoke(hello,request,response);       --3)servlet的service方法被调用

4)tomcat服务器停止或web应用重新部署时,tomcat服务器调用destroy方法
	2.1 得到destroy方法对象
	Method m = clazz.getDeclareMethod("destroy",null)
	2.2 执行方法
	m.invoke(hello,null);                   --4)servlet的destroy方法被调用

3、时序图描述Servlet的执行过程


Servlet的线程安全问题:

        servlet对象特点: 在tomcat服务器中是单实例多线程的!!!

            1)尽量不要在servlet类中使用成员变量。

            2)如果要使用成员变量,那么就要给使用到成员变量的代码块加上代码锁,尽量缩小同步锁的范围,以避免因为同步产生代码并发执行效率降低的问题。

Servlet的自动加载:

        默认情况下,第一次访问servlet时创建servlet对象。创建对象的过程中会调用构造方法和inti方法。如果init方法的业务逻辑需要消耗比较长的时间,用户的第一次访问servlet时需要等待较长的时间。

       改变servlet对象创建的时机: tomcat服务器启动的时候创建servlet对象。

<servlet>
    <servlet-name>LoadDemo2</servlet-name>
    <servlet-class>gz.itcast.e_load.LoadDemo2</servlet-class>
    <!-- 正整数:数值越大,创建对象的优先级越低 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
ServletConfig对象
ServletConfig创建 

        ServletConfig对象是在创建完servlet对象之后,被创建出来。然后通过有参数的init方法传递到servlet中。

        ServetConfig对象主要用于加载servlet配置参数信息。

ServletConfig的API

       java.lang.StringgetInitParameter(java.lang.String name)   --得到参数

       java.util.EnumerationgetInitParameterNames() 

       ServletContextgetServletContext()    得到servlet上下文对象

       java.lang.StringgetServletName()   得到servlet名称

<servlet>
    <servlet-name>ConfigDemo</servlet-name>
    <servlet-class>gz.itcast.g_config.ConfigDemo</servlet-class>
    <!--  配置servlet参数 -->
    <init-param>
    	<param-name>path</param-name>
    	<param-value>e:/bbs.txt</param-value>
    </init-param>
    <init-param>
    	<param-name>BBB</param-name>
    	<param-value>BBB's value</param-value>
    </init-param>
  </servlet>
ServletContext对象

         ServletContext叫Servlet上下文对象,该对象表示当前的web应用环境信息一个web应用只会创建一个ServletContext对象。

ServletContext的创建时机:ServletContext对象是在tomcat服务器加载完当前web应用后创建出来。ServletContext对象是作为ServletConfig对象成员变量传入servlet中。通过ServletConfig的getServletContext()方法得到ServletContext对象。

ServletContext对象的API

得到web应用的上下文路径      java.lang.String  getContextPath() 

得到web应用的全局参数(所有servlet有效的!!)

         java.lang.String   getInitParameter(java.lang.String name) 

         java.util.Enumeration  getInitParameterNames()

域对象相关的方法

        void setAttribute(java.lang.Stringname, java.lang.Object object) 保存数据

        java.lang.Object  getAttribute(java.lang.String name)  得到数据

        void removeAttribute(java.lang.String name)  清除数据

转发相关的

        RequestDispatcher     getRequestDispatcher(java.lang.String path) 

web应用读取资源文件

        java.lang.String   getRealPath(java.lang.String path) 

        java.io.InputStream   getResourceAsStream(java.lang.String path) 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值