Servlet
动态web资源
什么是servlet
实现Servlet接口,重写5个方法
servlet是一个小的java程序,运行再服务器中,接收和响应从客户端(浏览器)发送过来的请求
快速入门
编写一个类,实现Servlet接口,重写5个方法
编写一个类,集成GenericServlet,重写一个方法
public class HelloServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException,IOException{
res.getWriter().write("hello servlet...");
}
}
配置文件,配置Servlet信息(必须会)
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet的声明周期
什么是生命周期:实例被创建,对外提供服务,销毁。
Servlet中有一个方法区初始化Servlet
Servlet被创建后,然后调用init方法
void init(ServletConfig config)
从客户端发送的所有的请求是service方法进行处理
void service(ServletRequest req, ServletResponse res)
从服务器中移除Servlet服务,调用destroy方法
void destroy()
* Servlet实例被创建后,调用init方法进行初始化
* 什么时候创建?
* 不是服务器一启动就创建,第一次访问时才创建
* init方法调用几次
* 只调用一次
* service调用几次呢?
* 几个次请求就调用几次
* Servlet实例什么时候被销毁呢?
* 服务器关闭,手动移除
* destory调用几次?
* 一次
Servlet的关系
Servlet接口
|
GenericServlet(重写5个方法)
|
HttpServlet(继承了GenericServlet实现了Servlet接口)
|
MyServlet
为什么会有GenericServlet?为什么有HttpServlet?
注意事项:
以后重写无参的init()方法即可
开发步骤
编写一个类,继承HttpServlet
重写doGet()和doPost()方法
在doPost()方法中调用doGet()方法
表单是get方法,调用doGet
标点是post方法,调用doPost方法
doGet和doPost互相调用
在web.xml配置
修改Servlet模板
先找到MyEclipse安装路径
myeclips\Common\pluginscom.genuitec.eclipse.wizards_9.0.0.XXX.jar
千万别解压,右键--选择压缩工具打开--templates--Servlet.java
修改Servlet.java
关闭myeclipse的条件下,把Servlet.java拖回去
Servlet自动加载
Servlet默认是第一次访问时候去创建实例。
init做初始化非常耗费时间
在<servlet>标签下
<load-on-startup>3</load-on-startup>
值是正整数
如果值越小,优先级越高
配置虚拟路径(访问路径)
<servlet-mapping>
<url-pattern>/demo5</url-pattern>
</servlet-mapping>
完全路径匹配
以/开头 /demo5
访问:http://localhost/day09/demo5
目录匹配
以/开头 /*
访问:http://localhost/day09/XXX
扩展名匹配
不能以/开头 *.do *.action *.xxx
访问:http://localhost/day09/demo5.do
优先级:完全路径匹配>目录匹配>扩展名匹配
WEB开发中路径的问题
相对路径
一个文件相对于另一个文件的位置
不能以/开头 写法: ./demo demo ../demo
访问1.html http://localhost:8080/wday09/1.html
访问demo5 http://localhost:8080/wday09/demo5
从1.html中去访问 ./demo5 demo5
绝对路径(推荐使用)
以/开头
简写方式:/day05/demo5
客户端的绝对路径
/day09/demo5
服务端的绝对路径
/demo5 不能写项目名
ServletConfig对象,和配置文件相关
配置初始化参数
需要在<servlet></servlet>标签下配置
如果要是配置在某个servlet的标签下,那么只能在该servlet中获取初始化参数
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
String getServletName() 获取<servlet-name>标签的名称
String getInitParameter(String name) 获取初始化参数
Enumeration getInitParameterNames() 获取初始化参数的名称们
ServletContext对象(域对象)
web容器在启动时,他会为每个web应用程序创建一个对应的ServletContext对象,它代表当前web应用
一个web应用对应一个ServletContext对象
一个web应用下有多个Servlet程序
所有的servlet程序都共享同一个ServletContext对象
demo1存入内容 ServletContext demo2中取出来
作用:
获取web应用的全局初始化参数
在web.xml中配置
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
String getInitParameter(String name)
Enumeration getInitParameterNames()
实现数据的共享
void setAttribute(String name, Object object) 存入数据
void removeAttribute(String name) 删除数据
Object getAttribute(String name) 获取数据
读取资源文件
InputStream getResourceAsStream(String path) 通过文件的地址获取输入流
String getRealPath(String path) 通过文件的地址获取文件的绝对路径
http的协议
请求
响应
响应头
location 和302一起来完成重定向
refresh 页面的定时刷新
last-modefied和if-modefied-since和304状态码一起来控制缓存
缺省的servlet(了解)
自己编写的servlet,不要配置/
在tomcat/conf/web.xml中的配置
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>