转载于传智播客教程.
今天内容
1.Servlet(重点)
2.ServletCofig(次重点)
3.ServletContext(重点)
-----------------------------------------------------------------
1.servlet
servlet是什么?它的作用是什么?
servlet是一门开发动态web资源的技术.
servlet它叫服务器端小应用程序。
它可以理解服务器端的一个资源,它可以进行请求与响应的处理.
servlet技术怎样使用?
sun公司在api中提供了Servlet接口
我们开发Servlet可以有三种方式.
1.实现 javax.servlet.Servlet接口
2.继承 javax.servlet.GenericServlet
3.继承 javax.servlet.http.HttpServlet
对于我们开发一个servlet它步骤有两个.
1.实现或继承 Servlet接口或 GenericSerlvet,HttpServlet。
2.在web.xml文件对Servlet进行配置.
<servlet>
<servlet-name>任意起的一个名称,一般会使用servlet的类名</servlet-name>
<servlet-class>servlet的全名 就是包名.类名.</servlet-class>
</servlet>
<serlvet-mapping>
<servlet-name>要与上面的servlet-name的值一样</servlet-name>
<url-pattern>/名称</url-pattern>
</servlet-mapping>
------------------------------------------------------
关于请求方式 get与post
在浏览器上直接输入url----get请求.
超链接方式也是 get请求.
如果想要以post方式提交,只能通过表单,设置method=post.
--------------------------------------------------------------------------
问题1:我们提交请求时,为什么get请求就会调用doGet方法,post请求,会调用doPost方法?
问题2:为什么我们重写时,只重写了无参数的init方法,不需要重写有参数的init?
研究servlet的生命周期(******************************)
在我们Servlet接口中定义了三个方法.
init(ServletConfig config)
service()
destroy();
问题1解决:
是因为在HttpServlet的service方法中,它进行了重写,重写后分根据请求方式不同,调用不同的方法.
String method=request.getMethod();
if("get".equals(method)){
doGet();
}else if("post".equals(method)){
doPost();
}
问题2解决:
在GenericServlet 中定义了一个无参数init方法,重写Servlet接口中的init(ServletConfig config)方法.
当servlet对象创建后会调用有参数的init方法。在有参数的init方法中又调用了无参数的init方法。
对于我们来说,我们只需要重写无参数的init就可以。
--------------------------------------------------------------------------------------------------------
关于servlet的自动加载.
正常情况下,servlet是第一次被访问时,会创建servlet实例。并初始化,也就是调用init方法。
我们可以通过对servlet进行配置,让servlet可以随着服务器的启动而自动创建与初始化.
只需要在web.xml文件中在配置servlet时,加上<load-on-startup>
servlet跟随服务器启动的作用是什么?
根据特点来分析,当前servlet的init方法是服务器启动了,init方法就被调用了,
那么我们就可以将一些需要提前加载的信息在servlet的init方法中定义。
------------------------------------------------------------------------------------------------------------
关于url-pattern的写法.
url-pattern它的作用是什么?
它的值要与浏览器输入的地址相匹配,通过url-pattern可以查找到servlet-name,在通过serlvet-name可以查找到
对应servlet类.
它的写法有两种:
1.完全匹配 要求以/开始,名称与url一致.
2.使用通配符 *
1.目录匹配 以/开始,以*结束.
2.扩展名匹配. 不能以/开始,以*.xxx对束
最经典错误 /*.do
优先级: 完全匹配>目录匹配>扩展名匹配
--------------------------------------------------------------------------------
关于访问servlet时的路径问题(客户端访问服务器端资源路径问题):******************
访问一个servlet它的路径有两种写法,一种是绝对路径,一种是相对路径.
绝对路径:<br>
1.带协议的绝对路径<br>
<a href="http://localhost/day09/demo2">demo2 servlet</a><br>
2.不带协议的绝对路径<br>
<a href="/day09/demo2">demo2 servlet</a>
在开发中,带协议的绝对路径一般应用于访问站外资源。
而不带协议的绝对路径我们一般是在站内访问时使用的,也是推荐使用的。
******相对路径
相对路径:<br>
<a href="./demo2">demo2 servlet</a>
对于当前路径下的资源我们一般写成:
<a href="demo2">demo2 servlet</a>
分析:
访问admin.html的路径是: http://localhost/day09/admin.html
访问demo2Servlet的路径是:http://localhost/day09/demo2
通过上面的路径分析,发现admin.html与demo2是同级别,那么它们相对关系就是当前路径下的某某...
如果将admin.html放置在main目录下.
访问admin.html的路径是: http://localhost/day09/main/admin.html
访问demo2Servlet的路径是:http://localhost/day09/demo2
那么相对路径就需要改变。
<a href="../demo2">demo2 servlet</a>
总结:
我们在开发中建议使用不带协议的绝对路径.
它的写法是 /虚拟目录名称/资源路径
根据以上的分析,说明在客户端的 /代表的是就相当于服务器根目录.
---------------------------------------------------------------------
ServletCofnig
它是什么?它有什么用?它是由谁创建的?
ServletConfig是Servlet的一个配置对象.
每一个servlet都有一个对应的ServletCofnig。
ServletConfig是由web服务器创建的,它通过Servlet的init方法传递到了
Sevlet中.
ServletCofnig作用:(它是servlet的一个配置对象)
1.可以获取Servlet的名称 getServletName();---web.xml文件中的<servlet-name>的值.
2.可以获取初始化参数
getInitParameter(String name); 根据name获取value
getIniteParameterNames(); 获取所有的name值,它返回的是一个Enumeration.
对于Enumeration它相当于是一个Iterator。
Iterator hasNext() next()
Enumeration hasMoreElement() nextElement();
3.可以获取ServletContext对象。
通过代码去测试一下这些操作
问题:我们在Servlet中怎样获取ServletConfig对象
我们要查看怎样获取ServletConfig对象,
我们现在知道,ServletConfig对象是由服务器创建,通过Servlet的init方法传递到Servlet中.
在Servlet类中通过this.getServletConfig()就获取了ServletConfig对象.
问题:什么是初始化参数?
我们在每一个Servlet的配置中,都可以通过
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
进行配置,这个就是servlet的初始化参数
问题:初始化参数的作用?
我们可以将一些servlet运行时需要加载常量定义在初始化参数中,当我们需要使用时,
可以直接通过ServletConfig获取到这些值。
ServletConfig总结:
1.每一个Servlet都有自己的ServletConfig对象.
2.ServletCofnig对象是由服务器创建,通过Servlet的init方法传递到Servlet中。
3.ServletConfig对象代表的是Servlet的配置对象,可以通过它获取Servlet的名称与相关初始化参数。
4.在Servlet中要获取ServletConfig对象,只需要直接调用getServletConfig()就可以。
5.可以通过ServletConfig获取ServletContext对象.
-----------------------------------------------------------------------------------------------------------
ServletContext对象**************************************************************
它是一个全局的web容器对象.它代表的就是当前工程。
类的成员变量:
这个类的每一个对象都具有这个成员变量.
类的静态变量
当前类的所有对象都使用同一个静态变量。
ServletContext代表一个web应用,在这个web应用中所有Servlet使用的就是这一个。
每一个Servlet都有ServletConfig。
因为在一个web应用中就一个ServletContext,所有的servlet使用的是同一个ServletContext,
那么我们这些servlet就可以通过serlvetContext去实现通信。
ServletContext对象它是一个容器对象。(大家将其想像成是一个map集合)
我们将这种功能的对象叫做域对象(上下文对象)
----------------------------------------------------------------------
获取WEB应用的全局初始化参数
通过ServletContext对象实现数据共享
案例--- 统计站点访问次数
利用ServletContext对象读取资源文件
要完成以上的操作,出现的问题:
1.问题:我们在servlet中怎样获取ServletContext对象,它是由谁创建的?
ServletContext对象是由服务器创建,它代表web应用.
要想获取我们可以通过ServletConfig对象去获取.
this.getServletConfig().getServletContext();
this.getServletContext();这种方式底层也是通过ServletConfig获取的.
2.ServletContext的功能有什么
1.可以完成Servlet与Servlet之间的通信.
setAttribute(String name,Object value)
getAttribute(String name);
removeAttribute(String name);
2.可以设置全局初始化参数.
1.在web.xml文件中可设置全局初始化参数
<context-param>
<param-name>global</param-name>
<param-value>this is message</param-value>
</context-param>
2.怎样获取全局初始化参数
getInitParameter(String name);
getInitParameterNames();
设置全局初始化参数在开发中有什么用?
例子:我们在全局初始化参数中可以设置一个变量来描述整个web应用的字符编码.
我们在任意的一个servlet中都可以获取到这个字符编码。
全局初始化参数它是针对于web工程共享的信息。
3.获取Mime类型.
String getMimeType(String name)
我们在讲文件下载时会使用到.
4.在ServletContext中有一些获取路径操作.
getRealPath(String path); 它返回的是一个String
例如:context.getRealPath("/"); 获取的是当前web应用在磁盘上的绝对路径.
E:\apache-tomcat-7.0.26\webapps\day09\
getResource(String source); 它返回的是一个URL
例如:context.getResource("/");
返回的是 /localhost/day09
getResourceAsStream(String path) 它返回的是一个InputStream
例如:context.getResourceAsStream("/a.txt");
得到一个指向了WebRoot下的a.txt文件的一个输入流。
以后操作中应用比较多的是1,与4.
-----------------------------------------------------------------------------------
利用ServletContext对象读取资源文件---关于路径问题
在web应用中如果要读取资源文件,我们需要得到文件的绝对磁盘路径。
context.getRealPath("/"); 这时得到的就是tomcat/webapps/工程名/ 路径。
得到文件位置只需要在/后面加上相关的路径就可以.
注意:src下的内容会被部署到classes中。而没有在src或WebRoot下的内容不会被部署到tomcat中.
------------------------------------------------------
关于classpath问题.
javaProject工程 java源文件被编译后会被放置在bin目录.
java web project工程 java源文件编译后会被放置在classes目录.
我们管bin或classes这样的可以保存class文件的目录叫 classpath路径.
在java中,我们要想获取classpath路径可以通过任意一个类的字符码对象获取.
String path=类.class.getResource("/2.txt").getPath()
这时我们就得到了classes目录下的2.txt文件的绝对磁盘路径。
-----------------------------------------------------------------
总结:
getRealPath() 它可以得到tomcat下的web应用中的文件的绝对磁盘路径。
类.class.getResource().getPath();是获取classpath路径。就是我们的bin或classes目录路径。
----------------------------------------------------------