Servlet

1 Servlet执行过程

1.1 servlet简介

servlet: 用java语言开发网页动态资源的技术。

servlet特点:

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

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

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

1.2 Servlet开发过程

1)编写java类,继承HttpServlet

2servlet程序交给tomcat服务器运行

2.1 servletclass字节码拷贝到WEB-INF/classes目录下

2.2 web.xml文件中配置

<!-- 浏览器访问: http://localhost:8080/day10/hello -->

  <!-- 配置一个servlet -->

  <!-- servlet的配置-->

  <servlet>

   <!-- servlet内部名称。可以自定义-->

   <servlet-name>HelloServlet</servlet-name>

   <!-- servlet类的全名:包名+简单类名-->

   <servlet-class>包名.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>

 

1.3 Servlet的执行过程

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

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

 

http://       http协议

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

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

8080       端口

tomcat8080

/day10      站点下的web应用名称

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

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

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

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

字符串: servlet.HelloServlet

 

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

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

2 Servlet的路径映射

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

url-patttern                  浏览器输入URL

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

 /包名demo1             http://localhost:8080/day10/包名/demo1

 

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

/包名/*                   http://localhost:8080/day10/包名/任意路径

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

*.do

  *.action

  *.jsf

*.html

 

注意:

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

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

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

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

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

 

3 Sevlet缺省路径

/  : 表示servlet的缺省路径。

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

 

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

 

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

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

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

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

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

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

 

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

4 Servlet的生命周期(重点)

4.1 生命周期

以前:以前的程序,java类,自己去new对象,自己去使用对象调用。

    现在: sevlet程序。servlet的生命周期由tomcat服务器控制的。

  servlet什么时候对象创建,什么销毁,什么时候调用什么方法???

4.2 Servlet的四个生命周期

构造方法: 在创建servlet对象时调用。只调用1次。

   证明servlet对象在tomcat服务器中是单实例的。

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

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

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

 

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

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

 

得到字符串: 包名.a_servlet.HelloServlet

 

1tomcat服务器通过反射构造对象

1.1 得到字节码对象

Class clazz = Class.forName("包名.a_servlet.HelloServlet ");

1.2 构造对象

Object hello = clazz.newInstance();       --1) servlet的构造方法被调用

 

2tomcat服务器调用init方法

2.1 得到init方法对象

Method m = clazz.getDeclareMethod("init",ServeletConfig.class);

2.2 执行方法

m.invoke(hello,config);                --2)servletinit方法被调用

 

3tomcat服务器创建requestresponse对象,调用service方法

2.1 得到service方法对象

Method m

= clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletRespnose.class);

2.2 执行方法

m.invoke(hello,request,response);       --3)servletservice方法被调用

 

4tomcat服务器停止或web应用重新部署时,tomcat服务器调用destroy方法

2.1 得到destroy方法对象

Method m = clazz.getDeclareMethod("destroy",null)

2.2 执行方法

m.invoke(hello,null);                   --4)servletdestroy方法被调用

 

4.4 时序图描述servlet执行过程

 

5 Servlet线程安全问题

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

  5.1 引发Servlet多线程问题

多个线程同时操作了Servlet的成员变量(共享数据)。

5.2 避免Servlet并发问题建议

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

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

6 Servlet自动加载

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

 

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

<servlet>

    <servlet-name>LoadDemo2</servlet-name>

    <servlet-class>包名.e_load.LoadDemo2</servlet-class>

    <!-- 正整数:数值越大,创建对象的优先级越低-->

    <load-on-startup>1</load-on-startup>

  </servlet>

 

注意: 值写正整数。数值越大,创建对象的优先级越低

7 Init方法问题

GenericServlet中,有两个init方法。

 

有参数的init方法:该方法是servlet的四个生命周期方法中的一个。由tomcat服务器默认调用的初始化方法。在GenericServet的实现中,该方法会调用无参数的init方法。

无参数的init方法:该方法的是Sun公司设计出来用于给开发者去覆盖,用于实现初始化逻辑的方法。

 

结论: 如果要编写servlet的初始化逻辑,只需要覆盖无参数的init方法即可!!!!

 

Servlet中重要对象:

     1HttpServletRequest对象:封装请求信息

 2HttpServletResponse对象:封装响应信息

 3ServletConfig对象: 封装一个servlet配置参数信息

 4ServletContext对象: 封装web应用环境信息

 

8 ServletConfig对象

8.1 ServletConfig创建

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

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

 

8.2 ServletConfigAPI

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

java.util.Enumeration getInitParameterNames()  

ServletContext getServletContext()    得到servlet上下文对象

java.lang.String getServletName()   得到servlet名称

<servlet>

    <servlet-name>ConfigDemo</servlet-name>

    <servlet-class>包名.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>

 

注意: servlet的配置参数只对当前servlet有效的!!对其他servlet是无效的!!

9  ServletContext对象(重点)

9.1 ServletContext简介

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

9.2 ServletContext创建时机

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

 

class ServletConfig{

ServletContext context;

getInitParameter()

getInitParameterNames();

getServletContext(){

return contex;

}

    }

 

init(ServletConfig config){

context.getServletContext()

}

9.3 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.String name, 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)

 

  9.4得到web应用的上下文路径

java.lang.String getContextPath()  得到web应用上下路径。也就是部署到tomcat服务器上运行的web应用名称

  9.5得到web应用的全局参数

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

java.util.Enumeration getInitParameterNames()

 

<web-app version="2.5" 

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<!-- 配置web应用全局的参数-->

<context-param>

<param-name>AAA</param-name>

<param-value>AAA's value</param-value>

</context-param>

<context-param>

<param-name>BBB</param-name>

<param-value>BBB's value</param-value>

</context-param>

<context-param>

<param-name>CCC</param-name>

<param-value>CCC's value</param-value>

</context-param>

 

注意:

全局参数对当前web应用下的所有servlet都有效的!!!

9.6域对象相关的方法

ServetContext对象是一个域对象!!!

 

域对象的作用: 主要用于保存数据和获取数据,用于在web应用中不同资源之间共享数据。

Servlet1                                     Servlet2

name=eric

response.sendRedirect("/Servlet2?name=eric");          request.getParameter("name");

1)参数形式:  只能传递字符串数据

 

2)使用域对象形式:

Servlet1中保存数据

Servlet2中获取数据

域对象相关的方法:

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

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

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

 

ServletContext域作用范围:

在当前的web应用中有效!!!

 

Servlet中所有域对象:

HttpServletRequest对象:request

ServletContext对象: context

HttpSession对象: session

 

Jsp中域对象:

PageContext对象: page

 

9.7转发相关的

RequestDispatcher getRequestDispatcher(java.lang.String path)  

servlet中实现页面跳转

请求重定向: response.sendRedirect(路径);

请求转发: request.getRequestDispacher(路径).forward(request,respone);

 

=======请求重定向 vs  请求转发  区别====

请求重定向:

1)地址栏改变,改变为重定向到地址

2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。

3)处于两次不同的请求。不可以使用request对象来共享数据。

 

请求转发:

1)地址栏不会改变。

2)只能转发到当前web应用内部资源。

3)处于同一次请求。可以使用request对象来共享数据

 

不同类型资源:

1web应用内部资源。在当前web应用中的资源

2)其他web应用资源。在同一个站点下的其他web应用的资源。

3)站点外的资源。其他站点下的资源。

 

 

web应用中写路径的方法:

1)先给路径加上 斜杠 /

2)思考: 写的路径给谁使用

给服务器使用     / 代表当前web应用的根目录下

给浏览器使用     /  代表当前的站点的根目录下

9.8 web应用读取资源文件

路径:

绝对路径:e:/

相对路径:    .  表示当前路径。表示java命令运行的目录。

 

注意:

1)在java项目中,ecplise工具,java命令的运行根目录设置到项目根目录下。

2)在web项目中,.表示从tomcatbin开始,因为java命令从bin目录开始执行。

 

web应用下读取资源文件方式:

java.lang.String getRealPath(java.lang.String path)  得到资源文件的绝对路径

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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值