Servlet技术
* Servlet开发动态的Web资源的技术。
* Servlet技术
* 在javax.servlet包下,接口。
* 一个小的java程序,运行在服务器端,接收和响应从客户端(浏览器)发送过来的请求。
* Servlet开速入门
* 简单类,实现Servlet接口。(5个方法)
* 继承某个类(GenericServlet),重写一个方法。
* 重写public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException方法
* 配置Servlet(*****)
* 带包编译
* javac -d . HelloServlet.java
* javax.servlet 不存在
* 解决问题:
设置临时环境变量:set classpath=%classpath%;servlet-api.jar
* 配置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>
* 启动服务器
* 访问:http://localhost:80/website/hello
* Servlet开发动态的Web资源的技术。
* Servlet技术
* 在javax.servlet包下,接口。
* 一个小的java程序,运行在服务器端,接收和响应从客户端(浏览器)发送过来的请求。
* Servlet开速入门
* 简单类,实现Servlet接口。(5个方法)
* 继承某个类(GenericServlet),重写一个方法。
* 重写public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException方法
* 配置Servlet(*****)
* 带包编译
* javac -d . HelloServlet.java
* javax.servlet 不存在
* 解决问题:
设置临时环境变量:set classpath=%classpath%;servlet-api.jar
* 配置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>
* 启动服务器
* 访问:http://localhost:80/website/hello
在MyEclipse中开发Servlet
* 实现Servlet接口,重写5个方法。
* 配置Serlvet,项目web.xml中配置
Servlet的生命周期
* 生命周期:实例创建,服务,销毁。
* Servlet实例被创建后,立即调用init方法,进行初始化。
init(ServletConfig config);
* 从客户端发来的请求,都被service方法处理
void service(ServletRequest req, ServletResponse res);
* 销毁调用destroy方法。
void destroy()
总结:
* 配置Serlvet,项目web.xml中配置
Servlet的生命周期
* 生命周期:实例创建,服务,销毁。
* Servlet实例被创建后,立即调用init方法,进行初始化。
init(ServletConfig config);
* 从客户端发来的请求,都被service方法处理
void service(ServletRequest req, ServletResponse res);
* 销毁调用destroy方法。
void destroy()
总结:
- 第一次访问的时候,服务器创建了Servlet的实例,立即调用init方法进行初始化,init只调用一次。
- 从客户端发送过来的请求,调用service方法去处理,请求有多少次,service就执行多少次。
- 服务器关闭就销毁Servlet实例,调用destroy方法,调用一次。
关系
Servlet
|
GenericServlet
|
HttpServlet
* 编写一个普通的类,继承GenericServlet,初始化操作,重写init()的方法。
* 编写一个普通的类,继承HttpServlet,重写doGet和doPost方法。
* 如果再编写一个Servlet程序。
* 编写一个普通的类,继承HttpServlet。
* 重写doGet()和doPost()方法
* 配置Servlet。(web.xml)
* doGet和doPost逻辑相同,互相调用,简化编程。
doGet()
* 通过名称,查询数据,返回到页面。
doPost()
doGet()
Servlet
|
GenericServlet
|
HttpServlet
* 编写一个普通的类,继承GenericServlet,初始化操作,重写init()的方法。
* 编写一个普通的类,继承HttpServlet,重写doGet和doPost方法。
* 如果再编写一个Servlet程序。
* 编写一个普通的类,继承HttpServlet。
* 重写doGet()和doPost()方法
* 配置Servlet。(web.xml)
* doGet和doPost逻辑相同,互相调用,简化编程。
doGet()
* 通过名称,查询数据,返回到页面。
doPost()
doGet()
MyEclipse更方便的创建Servlet的方式。
* 右键 -- 选择servlet -- 起名字 -- 选择doGet和doPost
-- 配置web.xml -- 起Servlet名称 -- 设置访问路径
* 修改模板
* 找到MyEclipse安装路径,找到com.genuitec.eclipse.wizards.xxx.jar
* 右键 -- 选择servlet -- 起名字 -- 选择doGet和doPost
-- 配置web.xml -- 起Servlet名称 -- 设置访问路径
* 修改模板
* 找到MyEclipse安装路径,找到com.genuitec.eclipse.wizards.xxx.jar
* 找到com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar
* (千万别解压)-- 右键 -- 打开方式 -- 选择压缩工具 -- templates -- 找到Servlet.java
* MyEclipse先关闭。
* (千万别解压)-- 右键 -- 打开方式 -- 选择压缩工具 -- templates -- 找到Servlet.java
* MyEclipse先关闭。
配置Servlet自动加载:
如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法
* 在<servlet>
<load-on-startup>2</load-on-startup>
</servlet>
* 值是正整数,值越小,优先级越高。
* 在<servlet>
<load-on-startup>2</load-on-startup>
</servlet>
* 值是正整数,值越小,优先级越高。
例如:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。
映射配置
* <url-pattern>/demo</url-pattern>
* 完全路径匹配 以/开头的 /demo
* 只能/demo去访问
* 目录匹配 以/开头的 /* /demo/*
* /xxx都可以访问
* 扩展名匹配 不能以/开头 *.do *.action *.xx
* xxx.do
* 优先级:完全路径匹配 > 目录 > 扩展名匹配
* <url-pattern>/demo</url-pattern>
* 完全路径匹配 以/开头的 /demo
* 只能/demo去访问
* 目录匹配 以/开头的 /* /demo/*
* /xxx都可以访问
* 扩展名匹配 不能以/开头 *.do *.action *.xx
* xxx.do
* 优先级:完全路径匹配 > 目录 > 扩展名匹配
WEB开发中路径的问题
* 相对路径
* 一个文件相对与另外一个文件的位置。
* 写法:不能以/开头 ../demo ./demo demo
* 访问Demo8的Servlet: http://localhost/day08/demo8
* 访问demo1.html的文件:http://localhost/day08/demo1.html
* 相对路径: ./demo8 demo8
* http://localhost/day08/html/demo2.html
* http://localhost/day08/demo8
* 相对路径: ../demo8
* 平时开发中少写相对路径,写绝对路径。
* 绝对路径
* http://localhost/day08/demo8"
* 简便写法:/day08/demo8
* 绝对路径以/开头。
* 服务器和客户端的绝对路径
* 客户端的绝对路径(经常使用)
* /day08/demo8
* 服务器的绝对路径(很少使用)
* /demo8
* 相对路径
* 一个文件相对与另外一个文件的位置。
* 写法:不能以/开头 ../demo ./demo demo
* 访问Demo8的Servlet: http://localhost/day08/demo8
* 访问demo1.html的文件:http://localhost/day08/demo1.html
* 相对路径: ./demo8 demo8
* http://localhost/day08/html/demo2.html
* http://localhost/day08/demo8
* 相对路径: ../demo8
* 平时开发中少写相对路径,写绝对路径。
* 绝对路径
* http://localhost/day08/demo8"
* 简便写法:/day08/demo8
* 绝对路径以/开头。
* 服务器和客户端的绝对路径
* 客户端的绝对路径(经常使用)
* /day08/demo8
* 服务器的绝对路径(很少使用)
* /demo8
ServletConfig接口
A servlet configuration object used by a servlet container to pass information to a servlet during initialization.
init(ServletConfig config);
* String getServletName() 获取Servlet的名称
* ServletContext getServletContext()
* String getServletName() 获取Servlet的名称
* ServletContext getServletContext()
* String getInitParameter(String name) 获取初始化参数
* Enumeration getInitParameterNames() 获取初始化参数所有的名称
* Enumeration getInitParameterNames() 获取初始化参数所有的名称
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
ServletContext域对象
会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
获取WEB应用的全局初始化参数: 一般用于指定编码
* String getInitParameter(String name)
* Enumeration getInitParameterNames()
* String getInitParameter(String name)
* Enumeration getInitParameterNames()
//只需要在web-app下加入即可
<context-param>
<param-name>encoding</param-name>
<param-value>utf8</param-value>
</context-param>
实现数据共享
* void setAttribute(String name, Object object)
* Object getAttribute(String name)
* void removeAttribute(String name)
读取资源文件
* InputStream getResourceAsStream(String path) 通过路径获取文件的输入流
//相对于tomcat对应webapp下用/aa/bb/kk.properties即可.
* String getRealPath(String path) 通过路径获取文件的绝对磁盘路径
* String getRealPath(String path) 通过路径获取文件的绝对磁盘路径
//path的获取方法也是和上面的一样,只是获得物理路径后可以直接new FileInputStream(path)进行更多的操作,不只是读,还能写.
缺省的servlet(了解)
* tomcat/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> //本是false,但改成了true;只改这个
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
* tomcat/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> //本是false,但改成了true;只改这个
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>