Servlet的详解笔记


1、servlet入门
        * servlet就是一个javaee程序,可以接受和响应来自客户端的请求。

        如何实现servlet?
            * 实现Servlet接口
            * 继承GenericServlet类
            * 继承HttpServlet类

        复习:继承interface需要重写接口里的所有方法,但是继承class不需要

        使用记事本开发servlet的步骤:
            1.继承GenericServlet类实现servlet
            2.向页面输出内容:使用service()方法里面参数response向页面输出
            3.部署到tomcat里面,通过配置让服务器知道不是一个普通的java程序,而是一个servlet

         1)创建hello.java文件

                package com.fenqing.servlet;
                import javax.servlet.*;
                public class hello extends GenericServlet{

                    public void service(ServletRequest req,ServletResponse res) 
                        throws ServletException,java.io.IOException{
                        res.getWriter().write("hello servlet");
                    }

                }
         2)在文件 web.xml 中加入如下代码
            <servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>com.fenqing.servlet.hello</servlet-class> <!--servlet的包类路径,包+类名-->
            </servlet>
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello</url-pattern><!--表示通过/hello来访问-->
            </servlet-mapping>          

2、servlet的执行过程
        1)根据访问的路径到web.xml中找url-pattern
        2)找mapping中的servlet-name名称
        3)找另一个servlet-name标签里面和上一个name相同的servlet
        4)找到包类路径
        5)利用反射,,使用servlet里面的方法执行

3、servlet的生命周期
        * 什么是生命周期?
                从出生到死亡的全过程
        * servlet的生命周期?
                servlet从创建到销毁的全过程

        * servlet接口里面有5个方法,其中3个与生命周期相关
            - init()    创建servlet时执行
                    在第一次访问地址的时候创建,只创建一次
            - service() 处理客户端请求
                    每次请求都会执行一次,可以执行多次
            - destroy() 销毁servlet时执行
                    关闭服务器的时候销毁servlet

4、服务器启动时创建servlet-init()
        * 在web.xml中找到要启动的servlet
        * 语法:
                <load-on-startup>任意正整数(不包括1)</load-on-startup>

        *       <servlet>
                    <servlet-name>d01servlet</servlet-name>
                    <servlet-class>com.fenqing.servlet.d01servlet</servlet-class>
                    <load-on-startup>6</load-on-startup>
                </servlet>

5、修改servlet的模板
        1)找到plugins/com.genuitec.eclipse.wizards.xxx.jar
        2)打开jar包中的Templates文件夹可以看到Servlet.java源代码,直接修改
        3)重启Myeclipse

6、url-pattern的配置
        有三种方式:

            1)完全路径匹配
                    ** 使用 / 开头  /hello  /aa/hello

            2)目录匹配
                    ** 使用 / 开头  /aa/*  /*  所有路径

            3)扩展名匹配
                    ** 不使用/开头
                    ** *.ation   *.do
        优先级:完全 > 目录 > 扩展名

        # 如果在配置文件里面配置了多个url-pattern,最终只能执行一个

7、开发中的路径问题
        * 相对路径 
            - 同级目录:直接写
            - 上级目录:../
            - 下级目录:/a/xxx.x

            缺点:如果图片变化了位置,每次写的路径都不一样

        * 绝对路径(开发)
            - ip 端口号 项目名称
                http://127.0.0.1:8080/a.html

            - 直接写项目名称
                /a.html

        路径分两类
            1.客户端路径 
                    * http://127.0.0.1:8080/a.html
                    * 一般用在 重定向
            2.服务器端路径
                    * 在服务器内部进行的访问的操作,经常使用在转发操作
                    * 不需要加项目名称 /a.jpg

8、ServletConfig对象的使用
        1)获取初始化参数
                - 在web.xml中找到要配置的Servlet
                - 加入代码
                    <init-param>
                        <param-name>url</param-name>
                        <param-value>127.0.0.1</param-value>
                    </init-param>

                - getInitParameter(String name):获取初始化参数的值
                    ServletConfig config = getServletConfig();
                    String urlvalue=config.getInitParameter("url");
                    syso(urlvalue);

                - getInitParameterNames():获取所有初始化参数的名称
                    ServletConfig config = getServletConfig();
                    Enumeration<String> enumeration=config.getInitParameterNames();
                    while(enumeration.hasMoreElements()){
                        String name=enumeration.nextElement();
                        syso(name);
                    }

        2)得到当前运行的Servlet的名称 <servlet-name>servlet1</servlet-name>
                ServletConfig config = getServletConfig();
                String servletname=config.getServletName();
                syso(servletname);

        3)得到ServletContext对象
                - getServletContext()

9、servletContext对象
        * 启动tomcat服务器,在tomcat里面可能有很多的项目,这时服务器会为每一个项目创建一个对象,也就是servletContext对象

        * 在这个项目中,如果通过servlet向servletContext里面存一个值,这时在项目里面其他所有servlet里面都可以取到这个值

        * servletContext域:在一定的范围内,做存取值的操作
        *servletContext域范围:整个的web项目

        * 存值和取值
            - 存值:setAttribute(String name,OBject object)参数1:设置值的名称  参数2:值
            - 取值:getAttribute(String name)参数:设置值的名称

            ServletContext context= getServletContext();

10、通过servletContext对象读取全局的初始化参数
        * 全局初始化参数:所有的servlet里面都可以使用
        * 配置全局初始化参数
            - 配置在web.xml中,但是不能配置在任何一个servlet
            <context-param>
                    <param-name>url</param-name>
                    <param-value>127.0.0.1</param-value>
            </context-param>

        * getInitParameter(String name):得到全局初始化参数的值
        * 
                ServletContext context= getServletContext();
                String usernamevalue=context.getInitParameter("username");
                syso(uesrnamevalue);

        * getInitParameterNames():得到所有的全局初始化参数的名称
        *
                ServletConfig context = getServletConfig();
                    Enumeration<String> enumeration=context.getInitParameterNames();
                    while(enumeration.hasMoreElements()){
                        String name=enumeration.nextElement();
                        syso(name);
                    }

11、使用传统方式读取web项目中的文件
        * properties文件格式
        * 读取数据 url username
        * 里面的数据格式 类似 key value形式
        *       url=localhost
                username=tom
                password=123456
                ip=1.0.0.1

        * 读取properties文件
            - 使用Properties类,在java.util包里
            - load(InputStream inStream) 加载文件流
            - 字节流和字符流:字符流只能操作文本文件,如果是图片不能操作,一般都是字节流

                InputStream in = new FileInputStream("classes/db.properties");
                Properties p=new Properties();//得到对象
                p.load(in);     //加载文件流
                syso(p.getProperty("url"));     //得到每一个值
                syso(p.getProperty("username"));
                syso(p.getProperty("password"));
                syso(p.getProperty("ip"));

12、使用servletContext对象读取web项目中的文件
        * 方法一:InputStream getRecourseAsStream(String path)

                * 读取src下面文件的方法

                        ServletContext context = getServletContext();
                        //使用getResourceAsStream(String path)获取文件输入流
                        //首先第一个位置固定是/,后面的部分是文件在tomcat里的路径
                        InputStream in=context.getResourceAsStream("/WEB-INF/classes/db.properties");
                        //使用properties类  读取文件
                        Properties p=new Properties();
                        //加载文件输入流
                        p.load(in);
                        System.out.println(p.getProperty("url"));
                        System.out.println(p.getProperty("username"));
                        System.out.println(p.getProperty("password"));
                        System.out.println(p.getProperty("ip"));            

                * 读取包下面的文件

                        ServletContext context = getServletContext();
                        //路径的第一个位置固定是 / 后面的是文件在tomcat里的具体路径
                        InputStream in=context.getResourceAsStream("/WEB-INF/classes/com/fenqing/read/db1.properties");
                        Properties p=new Properties();
                        //加载文件输入流
                        p.load(in);
                        System.out.println(p.getProperty("url"));
                        System.out.println(p.getProperty("username"));
                        System.out.println(p.getProperty("password"));
                        System.out.println(p.getProperty("ip"));

                * 读取webroot下的文件

                        ServletContext context = getServletContext();
                        //路径的第一个位置固定是 / 后面的是文件在tomcat里的具体路径
                        InputStream in=context.getResourceAsStream("/db2.properties");
                        Properties p=new Properties();
                        //加载文件输入流
                        p.load(in);
                        System.out.println(p.getProperty("url"));
                        System.out.println(p.getProperty("username"));
                        System.out.println(p.getProperty("password"));
                        System.out.println(p.getProperty("ip"));

        * 方法二:String  getRealPath(String path)

                * InputStream in=new FileInputStream("完全路径");
                * 需要使用servletContext里面的另一个方法 getRealPath()方法

                        ServletContext context=getServletContext();
                        //使用getRealPath(String path)得到具体路径,带盘符
                        String path=context.getRealPath("/db2.properties");
                        //使用传统方式读取文件
                        InputStream in=new FileInputStream(path);
                        //使用properties类读取文件
                        Properties p=new Properties();
                        p.load(in);
                        System.out.println(p.getProperty("url"));
                        System.out.println(p.getProperty("username"));
                        System.out.println(p.getProperty("password"));
                        System.out.println(p.getProperty("ip"));

14、反射的原理
        * 反射是一些通用性比较高的代码,一般使用在框架里

        * 通过反射得到类里面的所有的内容
        ** 所有内容包含:构造方法(有参和无参),属性,方法

        * 创建一个java文件
            1)保存到本地硬盘
            2)编译成.class文件
            3)使用类加载器加载到内存中(依赖于jvm)

        ** class文件在内存中可以使用Class类进行表示
        ** 首先得到Class类
        ** 有三种方式
            - 类名.class
            - 对象.getClass
            - Class.forName("包类路径");

        ** 构造方法使用Constructor类表示
        ** 属性使用Filed类表示
        ** 方法使用Method类表示

15、url和uri的区别
        * url:专门指的是网络地址
        * uri:所有的网络地址 

16、类加载器来读文件
        * 适用范围:读取web项目中classes里面的文件
                        Class class1=this.getClass();
                        //使用getClassLoader()得到类加载器
                        ClassLoader classloder=class1.getClassLoader();
                        //直接写classes里面的文件的名称,不需要加 /
                        InputStream in=classloder.getResourceAsStream("db.properties");
                        Properties p=new Properties();
                        p.load(in);
                        System.out.println(p.getProperty("url"));
                        System.out.println(p.getProperty("username"));
                        System.out.println(p.getProperty("password"));
                        System.out.println(p.getProperty("ip"));

17、默认servlet
        *  如果页面出现404问题,由默认servlet操作

        * 在tomcat的web.xml中找默认servlet

        * 配置启动时候创建servlet,使用这里面的值不能写成1

        * <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,直接访问项目里面一个文件夹,可以把文件夹里面的所有的内容显示出来













servlet的执行过程

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值