1.Servlet是使用Java语言编写的运行在服务器端的程序.狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了Servlet这个接口的类,一般情况下,人们理解为后者.
Servlet作用:Servlet主要用于处理客户端传来的HTTP请求.并返回一个响应
Servlet UML图简略:
顶层接口 Servlet ServletConfig Serializalbe
抽象类 GenericServlet
实现类 HttpServlet ---- 我们一般都是继承他
2.Servlet由Servlet容器提供,所谓的Servlet容器是指提供了Servlet功能的服务器,
Servlet容器将Servlet动态的加载到服务器上.
客户端 ---HTTP请求和响应-- HTTP服务器 ----- Servlet容器 ------ Servlet
3.在Servlet接口中定义了5个抽象方法
1.void init(ServletConfig config);
2.ServletConfig getServletConfig();
3.String getServletInfo();
4.void service(ServletRequest req,ServletResponse res);
5.void destory();
4.Servlet接口下的实现类
1.GenericServlet:它是一个抽象类,该类为servlet接口提供了部分实现功能,他并没有HTTP请求处理
2.HttpServlet:HttpServlet是GenericServlet的一个子类,他继承了GenernicServlet类的所有方法,并且为HTTP请求中的post,get等类型提供了具体的操作方法.
5.创建Sservlet方法:
1.直接实现Servlet接口。重写接口里面的所有方法
2.继承GenericServlet
3.继承HttpServlet
6.Servlet的主要方法:
1.初始化Servlet对象的方法:public void init(ServletConfig config);
2.用于处理客户端请求(当客户端请求到来时,容器将调用Servlet实例的service()方法,对请求进行处理):public void service(ServletRequest request, ServletResponse response);
3.当Servlet对象从Servlet中移除时,容器调用该方法释放资源:public void destory();
7.HttpServlet类:
1.作用根据用户请求方式的不同,定义相应的方法去处理用户的请求:
eg:doPost(HttpServletRequest res,HttpServletResponse rep);
2.通过自动调用service()方法,将HTTP请求和HTTP响应分别转为HttpServletRequest和HttpServletResponse类型的对象
8.创建Servlet过程:两种方法
方法1.通过Ecplice开发工具直接创建Servlet
1.在Ecplise的包资源管理器中,右击相应的包,在弹出的快捷菜单中选择"新建"->Servlet->输入要创建的Servlet名字->单击下一步->自由添加Servlet包含的方法->单击完成 --创建结束
方法2.手工创建
配置Web.xml文件
<servlet>
<servlet-name>AServlet(映射名字,随便起,和下面一样就行)</servlet-name>
<servlet-class>com.ServletDemo1(报名.类名)</servlet-class>
</servlet>
<!-- 设置Servlet在tomcat启动时初始化 --!>
<!--
<load-on-startup>1(0,正整数将会在tomcat启动时加载Servlet)</load-on-startup>
--!>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/ServletDemo1(前端访问的路径映射到这里)</url-pattern>
<!--localhost:8080/weblearn(项目名)/ServletDemo1访问到web.xml这里,找到url-pattern,在通过Aservlet映射到servlet-class,然后找到类的全路径,去执行相应的doGet()等方法--!>
</servlet-mapping>
9.实现Servlet的虚拟路径映射(servlet-mapping中的路径url-pattern):
1.Servlet的多重映射:一个Servlet可以对应对个前端访问路径
eg:localhost:8080/Weblearn/ServletDemo1
eg:localhost:8080/Weblearn/ServletDemo2
他们俩都能访问到com.ServletDemo1类中的do**()方法;
<servlet>
<servlet-name>AServlet(映射名字,随便起,和下面一样就行)</servlet-name>
<servlet-class>com.ServletDemo1(报名.类名)</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/ServletDemo1</url-pattern>
<url-pattern>/ServletDemo2</url-pattern>
</servlet-mapping>
2.Servlet映射路径中使用通配符
1.完全目录匹配: 如:/ServletDemo1
2.目录匹配: 如:/abc/*或/*
3.拓展名匹配: 如:*.do,*.action,错误写法:/*.do,前面不能加"/"
eg:localhost:8080/Weblearn/*.do
任何以do结尾的路径都能访问到ServletDemo1类的方法,
eg:localhost:8080/Weblearn/tt.do 访问ServletDemo1类
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
优先级问题: 1 > 2 > 3,先访问1,2,3
3.缺省Servlet:映射路径就是一个"/",代表这是一个缺省的servlet,
就是如果请求地址和web.xml中的url-pattern找不到匹配的URL,则会将访问请求交给缺省Servlet处理,也就是说缺省的servlet通常用来处理请求资源找不到的问题(404)
eg:
<!-- 缺省Servlet,当访问路径不存在自动跳到error包下的Cod1中输出404 -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>error.Code1</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
10.ServletConfig接口:
它是Servlet的配置对象,作用就是获得servlet的初始化参数,如获得web.xml中为Servlet初始化的参数
ServletConfig config = this.getServletConfig();
常用方法:
1.String getInitParameter(String name):返回类型名为name的初始化参数
2.Enumeration getInitParameterNames():获取所有初始化参数名的枚举集合
3.ServletContext geServletContext():返回一个代表当前应用servletContext对象
4.String getServletName():获取Servlet的名字(web.xml中<servlet-name>里面的名字)
11.web.xml中Servlet的其他配置
<init-param>节点表示要设置的初始参数,为Servlet配置初始化参数的
<param-name>:表示参数名称
<param-value>:表示参数值
eg:在<init-param>节点中为ServletDemo1配置一个名为encoding的参数,并设置参数值为UTF-8
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.ServletDemo1</servlet-class>
<!-- 为Servlet配置参数信息 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
访问方法:在ServletDemo1中用ServletConfig对象来获取ServletDemo1的初始化参数
//com.ServletDemo1类
public class ServletDemo1 extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
//获得ServletConfig对象
ServletConfig config = this.getServletConfig();
//得到名为encoding的初始化配置参数
String string = config.getInitParameter("encoding");
out.println(string);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
12.ServletContext接口:
每当Servlet容器启动时,会为每个web应用创建一个唯一的ServletContext对象,代表当前web应用,该对象不仅封装了当前web应用所有信息,而且实现了多个Servlet之间数据共享.
应用1.获取web应用程序的的初始化参数:
在web.xml中不仅可以配置Servlet的初始化信息,还可以配置整个web应用的初始化信息.
web应用初始化参数的配置方法具体如下:
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
eg:web.xml中为整个web应用配置初始化信息
<!-- 为整个web应用配置初始化信息 -->
<context-param>
<param-name>companyName</param-name>
<param-value>itcast</param-value>
</context-param>
<context-param>
<param-name>address</param-name>
<param-value>beijing</param-value>
</context-param>
<!-- ServletDemo1 -->
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>
<!-- ServletDemo1 -->
访问web应用的初始化参数:
public class ServletDemo1 extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
//得到ServletContext对象
ServletContext context = this.getServletContext();
//得到(这个web应用)context对象的参数的枚举集合
Enumeration<String> paramNames = context.getInitParameterNames();
//访问paramNames中的所有参数值
while (paramNames.hasMoreElements()) {
String name = (String) paramNames.nextElement();
String value = context.getInitParameter(name);
out.println(name+": "+value);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
应用2.实现多个Servlet对象共享数据
由于一个web应用中所有Servlet共享同一个SrevletContext对象,因此,ServletContext对象的域属性可以被该web应用中的所有Servlet访问。在Servlet接口中定义了分别用于增加,删除,设置ServletContext域属性的四个方法.
1.Enumeraton getAttributeNames();//返回一个Enumeration对象,该独享包含了所有存放在ServletContext中的所有于属性名
2.Object getAttribute(String name);//根据给定指定属性名返回一个与之匹配的属性值,转换为具体类型要强制转换
3.void removeAttribute(String name);//根据指定的域属性名,从ServletContext中删除匹配的域属性名
4.void setAttribute(String name,Object obj);//设置ServletContext的域属性,其中name是域属性名,obj是域属性值
eg:创建一个ServletDemo1和ServletDemo2实现共享ServletContext域(整个web应用)数据
//com. ServletDemo1.java
public class ServletDemo1 extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//通过setAttribute(name,value)方法配置同一个web下的共享参数
context.setAttribute("data", "this servlet save data!");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
//com. ServletDemo2.java
public class ServletDemo2 extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
//得到这个web应用的ServletContext对象
ServletContext context = this.getServletContext();
//通过context的getAttribute()方法获得属性值
String string = (String)context.getAttribute("data");
out.println(string);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
应用3.读取web应用下的资源文件
实际开发中,有时候可能需要读取web应用下的一些资源,比如配置文件,图片等.
为此,在ServletContext接口中定义了一些读取web资源的方法,这些方法是依靠Servlet容器实现的.servlet容器根据资源文件相对于web应用的路径,返回关联资源的IO流,资源文件在系统中的绝对路径.下面是ServletContext获取资源路径的方法:
参数说明:path以"/"开始,"/"表示当前web应用的根目录,
//返回一个set集合,集合中包含资源目录中子目录和文件的路径名称。
1.Set getResourcePaths(String path);
//返回资源文件在服务器文件系统上的真实路径(文件的绝对路径),如果Servlet容器不能将虚拟路径转换为文件系统的真实路径返回null。
2.String getRealPath(String path);
//返回映射到某个资源文件的URL对象。
3.URL getResource(String path);
//返回映射到某个资源文件的InputStream输入流对象.
4.InputStream getResourceAsStream(String path);
eg:得到itcast.properties文件内容
/*
* 读取itcast.properties文件中的内容
* src下创建的属性文件实际保存在/WEB-INF/classes/itcast.properties下
*/
public class ServletDemo3 extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
ServletContext context = this.getServletContext();
PrintWriter out = resp.getWriter();
//得到itcast.properties文件的输入流对象
InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/itcast.properties");
Properties pros = new Properties();
pros.load(inputStream);
out.println("Company="+pros.getProperty("Company"));
out.println("Address="+pros.getProperty("Address"));
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
itcast.properties文件:
Company = itcast
Address = Beijing
//补充知识:
后缀properties是一种属性文件。
这种文件以key=value格式存储内容
Java中可以使用Properties类来读取这个文件
String value=p.getProperty(key);
就能得到对应的数据
一般这个文件作为一些参数的存储,代码就可以灵活一点
用于适应多语言环境,随着系统的语言环境的变化,读取不同的属性文件,显示对应语言的UI
当配置文件用,在里面读取一些关于路径方面的设置(如ant中的build.properties)
存放一组配置.(类似win下ini, 还要简单些, 因为没有section)
由于难以表达层次, 复杂点可以用xml做配置.
通俗点讲就相当于定义一个变量,在这个文件里面定义这些变量的值,在程序里面可以调用这些变量,好处就是,如果程序中的参数值需要变动,直接来改这个.property文件就可以了,不用在去修改源代码。
优点在于有利于你以后的代码重构,维护方便