目录
Servlet
Servlet是运行在服务端的Java小程序,是一套规范,用来处理客户端请求,响应给浏览器的动态资源,servlet的实质就是java代码,通过java代码的API动态的向客户端输出内容.
servlet普通Java程序的区别:
1)必须实现servlet接口
2)必须在servlet容器(服务器)中运行
3)servlet程序可以接收用户请求参数以及向浏览器输出数据
Servlet的执行原理:
原理:
1)输入网址:http://localhost/8080/day08/count 通过访问的项目根目录day08,在tomcat服务器的webapps中找到day08文件夹,
2)进入到web.xml配置文件中读取虚拟路径count(url-pattern),然后通过虚拟路径对应的servlet-name,找到<servlet-name>中的servlet-name,最后找到对应的servlet小程序调用执行
3)创建servlet对象------>调用init()初始化对象------>执行servlet中的service方法-------->将数据返回给浏览器对象
4)tomcat关闭的时候,servlet调用destory方法进行销毁.
Servlet的生命周期
生命周期:一个对象从创建到销毁的过程,就是生命周期.在servlet整个周期中涉及到三个方法:
1)init():使用init方法对servlet进行初始化
2)service():处理来自客户端的对service的所有调用
3)destory():从服务中心取出servlet,然后使用destory方法销毁它,最后进行垃圾回收并终止
servlet的一个周期:
servlet的体系结构:
servlet接口
↓
GenericServlet抽象类:通过的servlet,实现了除service方法之外的所有方法,并且实现了servletCOnfig中的所有方法
↓
HTTPServlet接口:httpservlet用来处理http请求,实现了servlet的所有方法并且细分了不同的请求处理方式.
底层原理:
我们自己创建的类继承HTTPServlet,然后HTTPServlet继承了GenericServlet,最后GenericServlet实现了servlet接口,而这样的好处在于:我们创建的新的类不用再重写所有的方法,只需要重写自己想要的方法即可.
Servlet接口:定义了方法(其中包含生命周期的三个方法:init(),service(),destory())
GenericServlet:
1)实现了destory方法(方便程序,以后不再书写销毁的方法,但是如果需要销毁数据,自己可以重写该方法)
2)继续抽象了service方法
3)对init方法进行了实现,(赋值了成员变量,调用了自己的无参init(0))
HTTPServlet:
1)强转reqeust,response对象(功能增强了)
2)调用本类的service方法(获得请求方式,将请求方式一分为七,执行具体的请求方式的方法)
Servlet的路径匹配:
url-pattern:将一个请求网络地址和servlet类建立一个映射关系.
路径编写方式:
1)精确路径匹配:以"/"开头,后面跟上精确路径,
2)目录匹配:以"/"开头,以"*"结尾,
3)后缀名匹配:以"*"开头,以任意后缀名结尾即可.
4)缺省匹配:"/" ,此路径大家不要使用,已经有servlet在用,任何web服务器中都有两个serlvet(默认的servlet和jspservlet)
路径匹配的优先级:精确匹配>目录匹配>后缀名匹配>缺省匹配
servlet的书写:
1)创建类,继承HTTPServlet(直接创建一个servlet也可以)
2)配置web.xml
3)书写doget或者dopost方法即可 .
使用注解:
web.xml配置:
根据需要可以在doget或者dopost中书写需求即可。
ServletContext
Web服务器在启动时,会为每个web项目创建一个对应的ServletContext对象
主要作用:
1)域对象(servlet之间可以通过域对象进行通信,操作共享数据的过程)
2)获取资源在服务器的真实地址,管理整个项目的资源
3)获取全局的配置参数
4)获取文件的MIME类型
域对象:
在范围内共享数据.
存储数据: void setAttribute(String name ,object value)
获取数据: Object getAttribute(String name)
删除数据: void removeAttribute(strng name)
存数据:
public class MyServletContext extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得ServletContext 对象.方法();
ServletContext sc1 = this.getServletContext();
ServletContext sc2 = this.getServletContext();
System.out.println(sc1 );
System.out.println(sc2 );
//往servletContext对象中存数据
//存api
sc1.setAttribute("ds" , "吉吉国王");
//直接获得数据
Object ds = sc2.getAttribute("ds");
System.out.println("oneServlet : " + ds);
}
}
取数据
public class MyServletContext2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得ServletContext 对象.方法();
ServletContext sc1 = this.getServletContext();
ServletContext sc2 = this.getServletContext();
System.out.println(sc1 );
System.out.println(sc2 );
//直接获得数据
//当没有人进行存储的时候 值为null
Object ds = sc2.getAttribute("ds");
System.out.prntln("twoServlet : " + ds);
//删除数据
sc2.removeAttribute("ds");
}
}
管理项目的资源
getRealPath() 获得项目在本地的真实路径(编译后路径)
getResourceAsStream() 获得项目下的资源文件 转换成流(编译后的)
public class GetResourceServlet extends HttpServlet {
/**
* 在java代码中 获得项目的资源 img/1.jpg
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得ServletContext对象
ServletContext sc = getServletContext();
//2.获得这张图片的真实地址 .get 获得 Real 真实 Path路径 获得项目在本地磁盘的真实路径
//获得的是编译路径 获得最后拼接的路径
String realPath = sc.getRealPath("/img/1.jpg");
System.out.println(realPath);
//File file = new File
//直接获得项目下的文件 并转换成流对象
InputStream is = sc.getResourceAsStream("/img/1.jpg");
System.out.println(is);
}
}
获取文件的mime类型:(了解)
- getMimeType("带后缀名的文件名")
获取项目的初始化参数(了解):
参数在web.xml中通过<context-parm>配置项目的初始化参数
getInitParameter("参数name")