一、Servlet的简介
- Servlet的概述
servlet是运行在服务端的java程序 servlet是一套规范(接口) 外界都可以访问到 - servlet的快速入门
步骤:
(1) 创建一个类 实现servlet
(2)覆盖servlet接口中的全部方法(尤其是service方法)
(3)需要进行虚拟路径的配置
web.xml配置部分:<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<!--servlet-name 这里的名字可以任意取,不过需要和 servlet-mapping中的servlet-name匹配
<servlet-name>Demo1</servlet-name>
<!-- 这里需要填写正确的完整包名来指向java源文件 -->
<servlet-class>com.heima.servlet.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<!-- 这里的name需要和servlet标签中的名字匹配 每一个Servlet-mapping 标签中只能配置一组-->
<servlet-name>Demo1</servlet-name>
<!-- 对外访问的路径 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
<welcome-file-list>
<!-- 这里代表的是欢迎页面,可以自己去寻找 -->
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Demo1.java工程内容:
package com.heima.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Demo1 implements Servlet
{
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
// 主要业务处理的地方,每次访问都会执行
PrintWriter writer = res.getWriter();
writer.print("<h1>Hello World</h1>");
writer.print("<h1>Hello World</h1>");
System.out.println(getServletInfo());
}
@Override
public void destroy()
{
// 服务器正常关闭的时候调用
}
@Override
public void init(ServletConfig arg0) throws ServletException
{
// 在服务器servlet对象创建的时候执行
}
@Override
public ServletConfig getServletConfig()
{
// 这个方法用于返回ServletConfig对象,内部封装的是Servlet配置信息
return null;
}
@Override
public String getServletInfo()
{
// 用来返回Servlet的一些信息
return "";
}
}
二、Servlet的生命周期
- java中的生命周期:对象什么时候创建 什么时候销毁 这个过程中必然要实行的方法
- servlet对象的生命周期:
创建:默认第一次访问servlet时创建 创建之后对象驻留在内存中 等待为后面的访问服务,所以说,servlet对象只有一个。
销毁:服务器关闭 web应用从服务器中移除
与生命周期想过的方法说明public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
// 主要业务处理的地方每次访问都会执行
}
@Override
public void destroy()
{
// 服务器正常关闭的时候调用
}
@Override
public void init(ServletConfig arg0) throws ServletException
{
// 在服务器servlet对象创建的时候执行
}
三、Servlet的相关配置文件
- 基本配置
基本格式:
配置servlet的实体:<servlet>
<sevlet-name>随意书写</servlet-name>
<servlet-class>servlet类的一个全包名</servlet-class>
</servlet>
配置servlet的对外访问的虚拟路径
<servlet-mapping>
<sevlet-name>和那么上面的name一致</servlet-name>
<url-pattern>/虚拟路径</url-pattern>
</servlet-mapping>
例子:
<servlet>
<!--servlet-name 这里的名字可以任意取,不过需要和 servlet-mapping中的servlet-name匹配 -->
<servlet-name>Demo1</servlet-name>
<!-- 这里需要填写正确的完整包名来指向java源文件 -->
<servlet-class>com.heima.servlet.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<!-- 这里的name需要和servlet标签中的名字匹配 -->
<servlet-name>Demo1</servlet-name>
<!-- 对外访问的路径 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
虚拟路径的写法:
完全匹配: 就是客户端的访问地址与配置完全一致才可以访问到<url-pattern>/demo1</url-pattern>
目录匹配:以/开始以*结束 /aaa/bbb/*
<url-pattern>/demo1/*</url-pattern>
扩展名匹配:以*开始 以扩展名结束 *.abc ,如果直接写*.abc那么前面就不需要加/
<url-pattern>/demo1/*.jpg </url-pattern>
注意:目录匹配和扩展名匹配不能混用 /aaa/bbb/*.abc(错误的!!!)
- 服务器一启动就实例化servlet
格式:写在Servlet标签内,<load-on-startup>数字</load-on-startup>
数字代表实例化的顺序 数字越小越早创建<servlet>
<servlet-name>Demo2</servlet-name>
<servlet-class>com.heima.servlet.Servlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
- 缺省的servlet
格式:缺省的servlet就是所有的servlet都不匹配 缺省的servlet去负责执行
就是将url-pattern配置成/<servlet-mapping>
<servlet-name>Demo2</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注意:其实所有的web资源都是servlet负责返回的,建议在开发中不要自己写缺省servlet使用Tomcat自己的web.xml文件中的默认缺省
- 欢迎页面:相当于IIS里面的的默认打开页面
<welcome-file-list>
<!-- 这里代表的是欢迎页面,可以自己去寻找 -->
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
- tomcat默认的全局web.xml
- 缺省的servlet
- jsp处理的servlet
- session默认失效时间
- MIME类型(下载资源)
- 欢迎页面
注意:tomcat的全局的web.xml对tomcat中所有的web应用都适用
四、Servlet的继承体系
- 使用IDE工具创建Servlet类和web.xml配置的对应关系
- 我们自己创建servlet的继承关系
关系:自定义servlet----->HttpServlet------>GenericServlet------>Servlet - service方法的演化过程
servlet接口中service方法
GenericServlet中的service方法
HttpServlet中service方法
这里service调用的是本类中的另外一个重载service方法。
在service(HttpServletRequest,HttpServletResponse)方法中可以进行提交方式的判断。通过HttpServlet类中的常量来实现。
HttpServlet类中的常量属性
判断实现的方式: - init(ServletConfig config)演变过程
在servlet接口中的init方法
在GenericServlet中的init方法
这个有参方法用来接收Servlet的配置信息,进行赋值
这个无参重载方法主要用于覆写,切不影响GenericServlet中的一些get方法
问题:有参数的init和无参数的init的关系?
首先他们是重载关系。
有参发放主要用来赋值和调用无参方法。所以在子类中覆盖覆写无参方法不影响最有效果。 - destroy()的演变过程
servlet接口中的destroy方法
GenericServlet中的destroy方法
五、ServletConfig对象
- 概述:是Servlet的配置对象 内部封装的是servlet的配置信息 在web容器调用init方法时 将ServletConfig作为参数进行传递
- 怎样获取?
通过getServletConfig()
查看GenericServlet的源码发现。
可以直接返回GenericServlet类中的config变量,该变量在此类中的有参inti方法中进行了赋值。可以直接调用的原因是应为inti的在服务器开启的时候就自动调用了此方法,所以可以正常服务,而不会去除null值。前提是子类不覆盖有参inti方法。 - ServletConfig的作用
- 获取servlet的名称
ServletConfig sc=getServletConfig();
System.out.println(sc.getServletName());
取出的值就是这里的Servlet-name的值 - 获取初始化参数(多个参数的获取方式)
设置参数方式:通过init-param来设置参数
ServletConfig sc=getServletConfig();
Enumeration <String> names = sc.getInitParameterNames();
while(names.hasMoreElements())
{
String name=names.nextElement();
System.out.println(name+" "+sc.getInitParameter(name));
}
- 可以获取web应用的上下文对象 ServletContext
六、ServletContext对象
- 概述
HttpServletservletContext是servlet上下文对象 实质代表web应用上下文对象 对象只有一个 而且所有的servlet共享一个ServletContext
servletContext什么时候创建?
服务器启动的时候 就会创建ServletContext对象 将这个对象放置在内存中中 供所有的setvlet访问(有点想静态变量)
servletContext什么时候销毁?
关闭服务器时销毁 web应用新哦那个服务器中移除 - 怎么获得ServletContext对象
通过servletConfig对象获得ServletContext context = getServletConfig().getServletContext();
通过getServletContext()直接获得
在GenericServlet类中有此方法 - ServletContext的作用
- 获取初始化参数
XML文件设置:
实现代码:ServletContext context = getServletConfig().getServletContext();
Enumeration <String> enums =context.getInitParameterNames();
while(enums.hasMoreElements())
{
String name=enums.nextElement();
System.out.println(name+" "+context.getInitParameter(name));
}
- 可以获取web资源的绝对路径:context.getRealPath()
重点:getRealPath()相对的位置:相对web应用
ReadFile方法:public void readFile(String path)
{
BufferedReader bufr;
try
{
bufr = new BufferedReader(new FileReader(path));
System.out.println(bufr.readLine());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 可以作为域对象:域对象:代表存储数据的区域的对象
- context.setAttribute(键,值):设置对象的键和值
- context.getAttribute(键):通过键获取值
ServletContext context =getServletContext();
//设置属性键值
context.setAttribute("name", "zhansan");
//通过键获取值
String attribute=(String) context.getAttribute("name");
时间: 2024-08-02 00:57:11