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
* 修改doGet和doPost 模板
配置 servlet 启动的 时候就被 加载.
需要在 web.xml 中的 servlet 标签中配置就可以了.
***** 5.Servlet生命周期
init ---->> servlet 初始化(Constructor构造函数)的时候被调用 (在Servlet的整个生命周期内,只调用一次)
service---->> 每次 请求该servlet的时候 ,都会被 调用
destroy --- >> 当servlet 不再 使用的时候, 也就是servlet被销毁的时候 会被调用.
其中service方法是每次都会被调用的,只要有请求.
每次service方法的被调用都是 启用了一个新的线程.
当继承了HttpServlet的注意事项
6.问题:service方法和 doGet doPost 什么关系 ??? (了解)
在Servlet的整个生命周期内,Servlet的init方法只被调用一次。
而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和
一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
调用与被调用的关系.
7.问题:init() 和 init(ServletConfig) 关系 (了解)
init(ServletConfig config) 方法是 servlet 接口中定义的 声明周期的方法.
而在genericservlet中 的带参数的 init方法中又 调用了 不带参数的init方法.
所以我们在 重写servlet的init 方法时 只去 重写 不带 参数的 init 方法了.
init(ServletConfig) ----- ServletConfig 对象 Servlet配置对象,
用来在Servlet初始化阶段向Servlet传递信息
* GenericServlet中将 ServletConfig对象保存成员变量,同时提供getServletConfig方法
* 自定义Servlet中 通过 getServletConfig() 获得ServletConfig 对象
小结Servlet 生命周期
1、Servlet生命周期 init(ServletConfig) service(ServletRequest,ServletResponse) destroy
2、init方法默认在第一次访问Servlet时调用,只执行一次 (通过配置 load-on-startup 让Servlet在服务器启动时初始化)
3、service每次请求都会执行一次 ,HttpServlet中重写service,根据请求方式调用doGet 或者 doPost , 开发Servlet无需覆盖service只需要 覆盖doGet和doPost
4、destroy方法 在服务器关闭时调用 ,销毁Servlet
5、GenericServlet中 在init(ServletConfig) 调用 无参数init,如果自定义Servlet想进行初始化,只需要覆盖无参数init方法
6、当doGet和doPost 代码逻辑相同时,互相调用简化编程
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.