servlet学习笔记

来源:互联网 发布:java服务器类型 编辑:程序博客网 时间:2024/06/03 19:28

web技术:

静态: html +css + js

动态: jsp/servlet , sun 公司的一套解决方案.

 

1.servlet快速入门

   a) 建一个 web project .

   b)写一个类继承 HttpServlet.

   c)由于servlet 是动态的web程序,将来web工程下的web应用发布到webapps目录下时,是放在classes目录下.

     所以要想让外界访问 你写好的 helloservlet, 就必须要在web.xml中配置 servlet的对外访问路径了.

      又分为 两个 部分 :

<!--  首先将写好的servlet 注册. -->

  <servlet>

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

<servlet-class>cn.itheima.servlet.HelloServlet</servlet-class>

  </servlet>

 

<!-- 给注册 的servlet 程序提供一个对外访问路径. -->

  <servlet-mapping>

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

<url-pattern>/hello</url-pattern>

  </servlet-mapping>

  d)web工程发布到 tomcat服务器.

  e)启动tomcat服务器访问.

http://localhost:8080/day03/hello  

 

3.Servlet 注意事项

 

  a)Servlet访问过程

servlet 程序是 由 tomcat 服务器调用的因为 没有main函数.

  b)Servlet API在哪里?

javase 的 api 都在 rt.jar (runtime )

 

servlet api ?

javaee 这个 library .

选中工程 --- 右键 点击properties -- >build path ---> myeclipse library --->

javaee6 library

 

实验手动的编译写好的servlet程序然后去访问

a)webapps下 建一个myweb 工程.

 

b)在这个目录下 建一个WEB-INF, 然后在WEB-INF下在建一个 classes 目录.

把写好的servlet粘贴过来.

c)编译写好的servlet.

 javac -classpath D:\tomcat\apache-tomcat-7.0.40\lib\servlet-api.jar -d . HelloServlet.java

 

d)配置web.xml.

注册 ;  映射对外访问路径.

 

e)http://localhost:8080/myweb/hello

 

4.servlet 继承关系.

servlet - sun 公司的一套解决方案.   

sun定义这套接口的时候 在这个接口中找不到任何关于协议的影子.

GenericServlet : 也是直接继承了 servlet接口是一个通用的servlet.

         你也找不到任何关于协议的影子.

HttpServlet:  就定义了 很多与协议相关的 方法 , (api). 如果 我们继承这个类.

实际上也是 间接的实现了servlet接口同时更重要由于是与定义了很多协议

相关的api.所以 就可以简化我们的编程工作.

自己定义的servlet : 就要继承 httpServlet, 如果GenericServlet or servlet ,只会使咱们的编程更加麻烦.

==================================== 如何修改 模板 ================

 

通过向导创建Servlet程序

* MyEclipse默认提供Servlet模板太过复杂,需要手动修改Servlet模板

1、在myeclipse安装 Common\plugins目录中  com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar

2、用压缩工具打开jar包,templates\servlet.java

修改doGetdoPost 模板

 

配置 servlet 启动的 时候就被 加载.

需要在 web.xml 中的 servlet 标签中配置就可以了.

 

***** 5.Servlet生命周期   

init ---->> servlet 初始化(Constructor构造函数)的时候被调用 (Servlet的整个生命周期内,只调用一次)

service---->> 每次 请求该servlet的时候 ,都会被 调用

destroy --- >> servlet 不再 使用的时候也就是servlet被销毁的时候 会被调用.

 

其中service方法是每次都会被调用的,只要有请求.

每次service方法的被调用都是 启用了一个新的线程.

 

当继承了HttpServlet的注意事项

 

6.问题:service方法和 doGet doPost 什么关系 ??? (了解)

Servlet的整个生命周期内,Servletinit方法只被调用一次。

而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servletservice方法。

对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和

一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servletservice()方法,service方法再根据请求方式分别调用doXXX方法。

调用与被调用的关系.

 

7.问题:init() 和 init(ServletConfig) 关系  (了解)

  init(ServletConfig config)  方法是 servlet 接口中定义的 声明周期的方法.

  而在genericservlet中 的带参数的 init方法中又 调用了 不带参数的init方法.

  所以我们在 重写servletinit 方法时 只去 重写 不带 参数的 init 方法了.

 

init(ServletConfig) ----- ServletConfig 对象 Servlet配置对象,

用来在Servlet初始化阶段向Servlet传递信息

* GenericServlet中将 ServletConfig对象保存成员变量,同时提供getServletConfig方法

自定义Servlet中 通过 getServletConfig() 获得ServletConfig 对象

 

小结Servlet 生命周期

1Servlet生命周期 init(ServletConfig) service(ServletRequest,ServletResponse) destroy

2init方法默认在第一次访问Servlet时调用,只执行一次 (通过配置 load-on-startup Servlet在服务器启动时初始化)

3service每次请求都会执行一次 ,HttpServlet中重写service,根据请求方式调用doGet 或者 doPost , 开发Servlet无需覆盖service只需要 覆盖doGetdoPost

4destroy方法 在服务器关闭时调用 ,销毁Servlet

5GenericServlet中 在init(ServletConfig)  调用 无参数init,如果自定义Servlet想进行初始化,只需要覆盖无参数init方法

6、当doGetdoPost 代码逻辑相同时,互相调用简化编程

 

 

8.servlet中路径配置的问题.

URL-Pattern的三种配置方式

1、完全路径匹配 以/开始 不能包含统配符例如: /hello /init

 

2、目录匹配 以/开始, /*结尾 例如: /*  /aa/*  /aaa/bbb/*   

3、扩展名匹配 不能以/开始,以*开始 例如: *.do  *.action

 

经典错误:/*.do  (Don't be radiculous)

 

完全路径匹配 目录匹配 扩展名匹配  (了解)

 

9.Servlet的初始化init(ServletConfig config)------> servletConfig对象

<servlet>

    <servlet-name>ConfigServlet</servlet-name>

    <servlet-class>cn.itheima.servlet.ConfigServlet</servlet-class>

    <init-param>

                  <param-name>company</param-name>

                  <param-value>黑马</param-value>

          </init-param>

          <init-param>

                  <param-name>address</param-name>

                  <param-value>软件元9号楼</param-value>

          </init-param>

  </servlet>

这个参数的配置只能够 被你配置的这个servlet访问到.

 

10.Servlet上下文对象 ServletContext

  应用一:全局初始化参数配置 (直接配置在web.xml的根标签下)

      <context-param>

<param-name>url</param-name>

<param-value>mysql:jdbc://localhost:3306</param-value>

</context-param>

<context-param>

<param-name>username</param-name>

<param-value>root</param-value>

</context-param>

<context-param>

<param-name>password</param-name>

<param-value>root</param-value>

</context-param>

<context-param>

<param-name>charset</param-name>

<param-value>utf-8</param-value>

</context-param>

 主要用来配置web工程中 一些公共的数据 ,达到共享  例如 配置 数据库连接配置 web应用的 字符编码集.

 

  应用二:多个Servlet之间可以共享数据

实际开发过程中多个 servlet 可能 要共享数据.

 

一般应用的场景:

聊天室统计网站的访问次数.

 

 

**************  应用三:读取web工程中资源文件:  (重要)

首先 通过 相对web应用 的绝对路径去获得 磁盘上的绝对路径.

 

 

11. 用类加载器读取    (重要)

   通用的 读取 文件的方法.

 

 a)在一个普通工程下可以直接 使用相对 路径去读取.

 b)web应用中如何读取资源.

 c)用类加载器读取

          //这里/代表classpath根目录(src WEB-INF/classes

String url = Context1.class.getResource("/4.txt").getFile();

String url1 = Context1.class.getResource("/4.txt").getPath();

Context1.class.getClassLoader().getResource("/4.txt");

String path2 = context.getRealPath("WEB-INF/3.txt");

 

   

12.缺省Servlet

如果将某个servlet 的对外访问路径搞成 / , 就表示将该servlet 配置成一个缺省的servlet.

tomcat 中缺省 的servlet conf/web.xml 可以找到 这个default Sservlet.