JAVAWEB-Servlet编程&&路径问题

1概念

        1.1特点“
            1)servlet是一个普通的java类,继承了HttpServlet
            2)其实实现了Servlet接口的java类,才是一个Servlet类
            3)servlet程序需要交给Tomcat服务器运行!

2.servlet运行过程

        浏览器
            2.1步骤
                前提:Tomcat服务器启动时会把每个网站的web.xml文件加载进内存                
                1)在浏览器输入http://localhost:8080/day09/hello
                2)截取URL的字符串,得到需要访问的资源名称:、/hello
                3)在day09网站下的we.xml信息中搜索是否存在/hello匹配的url-pattern
                4)匹配对应的url-pattern之后,取出当前映射信息中的servlet-name的名称,然后在web.xml信息
                    中搜索是否存在一个相同名称的servlet-name的servlet配置信息
                5.)找到对应的servlet配置信息之后,取出当前配置信息的servlet-class的内容
                    字符串  包名+类名 dxq.HelloServlet
                6)创建HelloServlet对象,然后调用HelloServlet类中的方法
                7)Servlet就把内容返回给浏览呢器用户

3.映射路径

             <servlet>
                <servlet-name>helloSetvlet</servlet-name>
                <servlet-class>dxq.ServletOne.helloSetvlet</servlet-class>
              </servlet>
                //servlet映射信息
            <servlet-mapping>
                servlet内部名称和servlet配置内容保持一致
                <servlet-name>helloSetvlet</servlet-name>
                servlet的映射路径,访问servlet的名称
                <url-pattern>/hello</url-pattern>
              </servlet-mapping>
    精确匹配:               /hello                  http://localhost/day09/hello
    模糊匹配                /*                  http://localhost/day09/任意路径
                        /dxq/*              http://localhost/day09/dxq/任意路径
                        *.后缀名               http://localhost/day09/任意路径.后缀名
                    (*.action
                      *.do                  
                    )

    注意
        1)要以 / 开头或者 * 开头
        错误:/dxq/*.html
        2)当多个url-pattern同时匹配时的情况下
            2.1精确匹配优先(长得像的那个优先级被匹配)
            2.2以后缀名结尾的url-pattern的优先级最低的

4.什么是缺省路径

        在Tomcat服务器内部配置了一个缺省路径    <url-pattern>/</url-pattern>,这个缺省路径在Tomcat服务器内部
    被一个缺省的servlet(DefaultServlet)匹配。缺省的这个servlet的作用是专门用于处理所有网站中的静态网页
        浏览器:http://localhost:8080/day09/hello.html
    一个路径在Tomcat服务器的执行过程
        1)搜索day09下面的web.xml文件信息,搜索是否存在匹配的 <url-pattern>/hello</url-pattern>,
        2)匹配到对应的url-pattern,执行对应servlet程序
        3)如果没有匹配的url-pattern,就把这个请求交给Tomcat服务器的DefualtServlet处理
        4)DefualtServle会在day09的根目录下搜索是否存在一个名字叫hello.html的文件
        5)如果找到此文件,那么DefualtServle读取该文件的内容返回给用户
        6)如果没有找到此文件,那么就返回给用户一个404状态码+404错误页面
        结论:先找动态网页再找静态网页

5.servlet的生命周期*

            5.1概念
                研究servlet的生命周期。就是研究servlet这个在什么时候创建对象,在什么时候调用什么方法,在什么时候销毁对象
                servlet室友Tomcat服务器执行的生命周期
            5.2servlet的四个重要的生命周期方法
                构造方法:创建servlet对象时调用,只调用一次证明了servlet是单例的
                init方法:创建完对象之后调用,只调用1次,该方法用于初始化对象
                service。方法,在每次请求时被调用,调用N次,该方法入口方法,我们的逻辑代码在这里被调用
                destroy方法:在service对象销毁之后调用,只调用1次,重新部署网站或者停止服务器,service对象
                就会销毁。
            5.3用伪代码演示Tomcat服务器如何调用四个方法
                字符串:dxq.HelloServlet
                1)创建HelloServlet的对象

                        /*万物皆对象*
                        *前提,加载class文件
                        *类的相关信息:  Class
                        *构造方法的信息:Contructor
                        *属性:            Filed
                        *普通方法           Method
                        通过以上四个类获取类上的信息,甚至构造类的对象,调用类的对象方法,这就是反射
                        1.1得到HelloServlet的class对象
                            Class clazz=Class.forName("dxq.HelloServlet");
                        1.2通过class对象调用构造方法
                             Object obj=clazz.newInstance();调用无参的构造函数  -1)构造方法被调用
                2)通过反射,调用init方法
                    2.1得到init方法对象
                            Method m=clazz.getDeclaraeMethod("init",ServletConfig.class);
                    2.2调用方法
                            m.invoke(obj.congig);               -2)init方法被调用
                3)通过反射,调用service方法
                    3.1得到service方法对象                
                        Method m=;
                        clazz.getDeclareMethod("service",HttpServletRequset.class,HttpServetResponse.class);
                    3.2调用方法
                        m.invoke(obj,request,response);         -3)service方法被调用
                4)通过反射,调用destroy方法
                    4.1得到destroy方法对象
                        Method m=clazz.getDeclareMethod("destroy",null);
                    4.2调用方法
                        m.invoke(obj null);             -4)destroy方法被调用

6.servlet的线程并发问题

            6.1引入:
                servlet在Tomcat服务器中,是单实例多线程的
                6.2开发线程安全的servlet建议
                    1)尽量不要去使用成员变量,或者静态成员变量。
                    2)必须要使用成员变量,那么给使用了成员变量的代码块加锁,加锁的代码块的范围
                    尽量缩小,因为有可能影响程序并发的效率。
                    synchronize(类名.class)

7.servlet的自动加载机制

            7.1引入
                默认情况servlet对象是在第一次访问的时候创建的,如果在这个servlet的构造方法或者init方执行比较多的逻辑,
            那么第一次访问servlet的用户体验就不好了 

            那么能不能改变创建servlet的机制》可以,可以让servlet在服务器启动的时候自动加载
            7.2自动加载的配置  
                <servlet>
                <servlet-name>helloSetvlet</servlet-name>
                <servlet-class>dxq.ServletOne.helloSetvlet</servlet-class>
             <load-on-startup>1</load-on-startup>//这个配置可以让servlet在Tomcat服务器启动的时候自动创建servlet对象
              </servlet>        
                注意:load-on-start中的整数越大,创建的优先级越低。

8 servlet的init方法

            8.1俩个init方法的作用
                init(ServletConfig)这个有参数的init方法作用就是Servlet的其中一个重要的生命周期方法,这个方法
            一定会被Tomcat服务器调用。
                init()这个无参的init方法作用就是为了提供给开发者方便去覆盖,覆盖这个方法,可以在此方法编写初始化的逻辑,
            这个方法才是真的给开发者做初始逻辑的方法
                小结:
                    servlet对象开发中涉及的对象
                    HttpservletRequest:对象:请求对象
                    HttpServletResponse对象:响应对象
                    ServletConfig对象 servlet配置对象
                    ServletContext对象:servlet的上下文对象

9. ServletConfig对象

            9.1引入:  
                ServletConfig是配置对象,主要是把servlet的初始化参数封装到这个对象中。
                一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息
            9.2配置初始化值
                <servlet>
                <servlet-name>helloSetvlet</servlet-name>
                <servlet-class>dxq.ServletOne.helloSetvlet</servlet-class>
                <init-param>
                    <param-name>path</param-name>
                    <param-value>e:/bbb.txt</param-value>
.               </init-param>
              </servlet>    
                读取到servlet的初始化
                    path=this,getServletConfig().getInitParameter("path");根据参数名获取参数值
                        this,getServletConfig().getInitParameterNames("path");获取所有参数名称

10.ServletContext对象

            10.1引入
                ServletContext对象叫servlet的上下文对象,一个网站只会创建一个ServletContext对象,代表的是这整个网站的环境信息
            10.2获取ServletContext对象
                this.getServletConfig().getServetContext();通过ServletConfig对象获取到ServletContext对象!
                ServletContext:对象:启动时候就创建
                ServletConfig:对象    调用init方法之前创建的,在ServletContext对象创建之前
            10.3ServletContext的5大作用
                1)获取web的上下文路径
                    java.lang.StringgetContextPath();
                    web上下文路径就是项目在Tomcat服务器运行的路径,注意不是开发目录的项目名称
                    作用:
                        请求重定向
                        response.sendRedirect(context.getContextPath()+"/hello.html");
                        可以让获取文件的路径更加灵活
                2)获取全局参数
                    java.langString getInitParameter(name);
                    java.util.Enumeration getInitParameterNames();
                        写在<servlet>外面
                        <context-param>
                            <param-name>AAA</param-name>
                            <param-value>AAA,value</param-value>
                        </context-param>

                        context=this.getServletContext();
                        context.getInitParameter("AAA");
                        Enumeration<String> enums=context.getInitParameterNames();
                        while(enums.hasMoreElements()){
                            String paramName=enums.nextElements();
                            parpamValue=context.getInitParameter(paramName);
                        }                       


                3)和域对象相关的
                    void setAttribute(String name,Object object);
                    Object getAttribute(String name);
                    void removeAttribute(String name);


                什么是域对象
                    域对象在不同来共享数据的,保存数据,获取数据。
                    ServletContext
                    HttpServletRequest
                    HttpSession
                4)请求转发
                    RequestDispatcher getRequestDispatcher(String path);

                    在servlet跳转页面
                    请求重定向:(浏览器行为
                        1)地址栏会发生改变,变成重定向到的地址
                        2)可以跳转到项目内的资源
                        3)可以跳转当前的项目的资源,也可以跳转到其他项目的资源
                        4)浏览器向服务器发出俩次请求,那么就不能使用请求来作为域对象来共享数据

                    请求转发,(服务器行为
                        1)地址栏不会改变
                        2)可以跳转到项目内的资源
                        3)只能转发到当前项目的一个资源
                        4)浏览器向服务器发出一次请求,那么可以使用请求作为域对象共享数据
                    request.getServletContext().getRequestDispatcher().fprward(request,response);
                    request..getRequestDispatcher().fprward(request,response);//简写

                5)读取web项目的资源文件
                    String getRealPath(Stringpath);//获取资源文件的真是路径
                        this.getServletContext().getRealPath("/WEB-INF/classes/news.properties");//服务器行为tomcat 运行下不存在src

                    InputStream getResourceAsStream(Stringpath);获取资源文件的输入流
                        this.getServletContext().getResourceAsStream("/WEB-INF/classes/news.properties");

                    URL getResource(String path);   读取资源文件
                        this.getServletContext().getResource("/WEB-INF/classes/news.properties");   
                        path=url.getPath();     



                    相对路径:

                        当前路径相对于java命令运行的目录
                        注意:Myeslipse工具每次运行java程序,都会把java命令运行的目录指向到当前的根目录下。
                        在web项目中java命令运行的目录就是在Tomcat的bin目录,再web项目里面不能使用相对路径                  

                    复习:
                        如何读取Properties文件?
                        FileInputStream  in=new FileInputStream("./src/new.properties")
                        Properties prop=new Properties ()//使用Properties对象
                        prop.load(in);//使用load加载properties文件
                        prop.getProperty(name);//获取内容

路径问题

            服务器行为   /   代表当前项目的根目录开始
            浏览器行为  /    代表当前站点的根目录开始(webapps)


        有可能会路径的地方
            转发
            request..getRequestDispatcher("/hello.html").fprward(request,response);
            重定向
            response.sendRedirect("/day09/heelo.html");
            HTML超链接
            response.getWruter().write("<a href="/day09/heelo.html"></a>)
            HTML页面的表单提交
            response.getWruter().write("<form  ="/day09/heelo.html"></a>)   

总结

    servlet编程:
        1)servlet编写
        2)servlet1的映射路径(精确匹配,模糊匹配,缺省路径)
        3)servlet的生命周期(构造方法 init方法 service方法 destory方法)
        4)多线程并发问题(单例实例多线程,servlet使用成员变量,同步锁解决)
        5)自动加载(load-on-startup)+俩个init方法的区别
        6)ServletConfig对象,读取初始化参数
        7)ServletContext对象
            5大作用
                1)读取web上下文路径(1)
                2)读取全局数据(2)
                3)作为域对象使用(3)
                4)可以跳转页面(1)
                5)读取web资源文件(3)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值