1.Servlet的快速入门
什么是servlet?
servlet就是java程序,可以接受和响应来自客户端的请求。
实现servlet:(1)实现Servlet接口(2)继承GenericServlet类(3)继承HttpServlet类
如果实现Servlet接口,需要把接口里面的方法都实现,使用继承类,就不用。
例子:向页面输出内容hello servlet
(1)开发步骤
继承GenericServlet类实现servlet
向页面
配置web.xml
<servlet-name>hello</servlet-name>
<servlet-class>包名.类名</servlet-class>
2.servlet执行过程
servlet执行过程图解
http://1127.0.0.1/servlet/hello
第一布:根据地址栏输入的地址找到servlet配置文件中url-pattern里面相同地址
第二步:去找地址对应servlet-name
第三步:找到另外一个servlet标签里面和相同的servlet名称
第四步:找到servlet包类的路径,利用反射得到类所有的内容,反射里的invoke
3.servlet的生命周期
就是servlet的生命周期:就是从创建到销毁的生命周期
servlet接口有五个方法:有三个方法与生命周期相关的
init方法:servlet创建的时候来执行这个方法,servlet在第一次访问时候创建,创建一次
service方法,处理客户端请求的时候执行这个方法,每次请求时候都执行,都执行
destroy方法,销毁servlet的时候执行这个方法,关闭服务器时候销毁servlet,执行一次
4.接口的继承关系
GenericServlet,HttpServlet,里面的方法参数是HttpServletResponse,HttpServletRequest,
ServletRequest HttpServletRequest:提供请求信息为servlet提供
ServletResponse HttpServletResponse:响应请求信息 HTTP 的发送响应功能。例如,该接口拥有访问 HTTP 头和 cookie 的方法。
HttpServletRequest和HttpServletResponse是ServletRequest ServletResponse的子接口
HttpServletRequest和HttpServletResponse专注于http协议的接口
ServletRequest ServletResponse
5.注意事项
(1)GenericSerclet里面init有参数和没参数的:init有参数的方法最终也会执行没参数的方法
(2)HttpServlet里面的service和doXX方法:根据提交方式执行相应的doxx方法,比如提交get方法,执行doGet()
在实际开发中一般都是实现HttpServlet方法实现
(3)简化编程:
无论什么提交方式,都会执行照这个代码
在doPost方法里面调用doGet():this.doGet(response,request);
(4)Servlet启动时候创建,在服务器启动时候创建,而不是第一次访问
在web.xml中找到启动的servlet,<load-on-startup>
(5)修改模板
6.url-pattern的配置
第一种:完全路径匹配:使用/开头/hello/aa/hello
第二种:目录匹配:使用使用/开头/aa/*/*
第三种:扩展名匹配:不使用/开头*.action *.do
配置优先级:完全路径匹配>目录匹配>扩展名匹配
7.开发中的路径问题
相对路径:和html的一样
绝对路径:一般开发中都使用绝对路径
第一种写法:http:127.0.0.1/day08/img/w10.png
第二种写法:直接访问/day08/img/w10.png(一般都用这种)
路径分类有两种
第一类:客户端 :带项目名称 一般重定向 /day08/img/w0.png
第二类:服务器端路径:不需要带项目名称 在服务器内部经行访问的操作,一般使用转发
8.ServletConfig对象的使用
第一个作用:
配置初始化参数:
在web.xml中找到servlet
配置初始化参数:
在web.xml中找到要配置servlet,只能在当前配置的servlet里面使用,不能再其他的servlet里面使用
<init-param>
<param-name>url</param-name>
<param-value>192.0.0.1</param-value>
</init-param>
方法:
getInitParameter(String name)获取初始化参数的值
getInitParameterNames():获取所有的初始化参数的名称
代码
//得到servletconfig对象
ServletConfig config = getServletConfig();
//执行 getInitParameterNames()所有初始化参数的名称
Enumeration<String> enumeration = config.getInitParameterNames();
//遍历
while(enumeration.hasMoreElements()) {
//得到每一个初始化参数的名称
String name1 = enumeration.nextElement();
//得到初始化参数的值
String value1 = config.getInitParameter(name1);
System.out.println(name1+" :: "+value1);
}
第二个作用:得到当前运行的servlet的名称<serlvet-name></serlvet-name>:getServletName()
第三个作用:得到servlet的对象 getServletContext();
9.servletContext对象
启动tomcat服务器,在tomcat里面可能有很多的项目,这个时候服务器会为每一个项目创建一个对象servletContext。
在这个项目里面,如果通过servlet1向servletContext里面存一个值,这个时候在项目里面其他所有的servlet里面都 可以取到这个值
servletContext域:在一定的范围以内,做存值和取值操作
servletContext域范围:整个的web项目
存值和取值
存值:setAttribute(String name, Object object) :两个参数,第一个参数设置值的名称,第二个参数是值
取值:getAttribute(String name) :参数是设置值的名称
10.通过servletContext对象读取全局的初始化参数
全局的初始化参数:所有的servlet里面都可以使用
配置全局初始化参数
在web.xml中,但是不能配置在任何的一个servlet里面
<context-param>
<param-name>url</param-name>
<param-value>192.0.0.1</param-value>
</context-param>
方法:
getInitParameter(String name) :得到全局初始化参数的值
代码
//得到servletContext对象
ServletContext context = getServletContext();
//得到username的值
String username = context.getInitParameter("username");
System.out.println("username: "+username);
getInitParameterNames() :得到所有的全局初始化参数的名称
代码
//得到servletContext对象
ServletContext context = getServletContext();
//得到所有的全局初始化参数的名称
Enumeration<String> enumeration = context.getInitParameterNames();
//遍历
while(enumeration.hasMoreElements()) {
//每一个全局初始化参数的名称
String namev = enumeration.nextElement();
//得到值
String valuev = context.getInitParameter(namev);
System.out.println(namev+" :: "+valuev);
}
12.读取web项目中的文件
properties文件格式
读取properties文件
使用load(InputStream )
classes/db.properties路径是一个相对路径,相对jvm的路径,web项目,tomcat启动时候创建jvm 而启动项在bin目录下,则是相对与bin目录的,而 我们的项目不能放在bin目录下
inputStream getResourceAsStream("文件路径");
首先第一个位置是固定就是项目的路径/
在src的同级目录下面
//InputStream in= context.getResourceAsStream("/WEB-INF/classes/db.properties");
//在包下面
//InputStream in= context.getResourceAsStream("/WEB-INF/classes/cn/itcast/servlet/db1.properties");
// 放在webroot下面
//InputStream in= context.getResourceAsStream("/db2.properties");
和webroot同级目录下,无法读取到,根本就没有发布到tomcat里面去
使用传统方式,只要写完全路径
读取webroot下面的文件
使用getResourceAsStream("文件的路径")
首先第一个位置是固定 / : 理解为项目的名称,后面的部分是文件在tomcat里面具体的路径
//得到servletContext对象
ServletContext context = getServletContext();
//读取文件流
//第一个位置 /
//后面的位置 文件在tomcat里面具体的路径
InputStream in = context.getResourceAsStream("/db2.properties");
如果文件放到项目路径下(webroot在同一级目录),文件不能使用servletContext对象读取到
文件根本没有发布到tomcat里面
String getRealPath(String path) :得到文件的完全路径 带盘符
13.反射的一个过程
反射是一些通用性比较高的代码,一般使用在框架里面
通过反射得到类里面的所有的内容
所有内容包含:构造方法(有参数和没有参数),属性,普通方法
画图分析反射的过程
创建一个java文件,
第一步:保存到本地硬盘,
第二步:编译成.class文件
第三步:使用类加载器加载到内存中(依赖于jvm)
class文件在内存中可以使用Class类进行表示
首先得到Class类
有三种方式
类名.class
对象.getClass()
Class.forName("包类路径")
构造方法使用Constructor类表示
属性使用Filed类表示
普通方法使用Method类表示
15.默认servlet
如果页面出现404问题,由默认的servlet操作
在tomcat的web.xml中招默认的servlet
需要把这个值设置成true,直接访问项目
16、url和uri的区别
url:专门指的是网络地址 比如 http://www.itcast.cn http://www.baidu.com
uri: 所有的网络地址 比如 [email protected]
17、类的加载器来读文件
使用类加载器使用范围:读取web项目中classes里面的文件
得到类加载器
首先Class类(有三种方式)
通过Class类里面.getClassLoader()得到类加载器
在类加载器里面使用方法 getResourceAsStream()得到文件的输入流
直接写classes里面的文件的名称
//得到Class类
// Read4.class
Class clazz = this.getClass();
//得到类加载器
ClassLoader classLoader = clazz.getClassLoader();
//读取文件
InputStream in = classLoader.getResourceAsStream("db.properties");
8、默认servlet
如果页面出现404问题,由默认的servlet操作
在tomcat的web.xml中找默认的servlet
配置启动时候创建servlet ,使用<load-on-startup>这里面的值不能写成1,会与默认的servlet冲突
<url-pattern>/</url-pattern>
如果把项目里面的一个servlet里面url-pattern写成/,就会成为一个默认的servlet
在默认的servlet里面配置
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
需要把listings值设置成true,直接访问项目里面一个文件夹,可以把文件夹里面的所有的内容显示出来