蚂蚁学堂(1):9-深入理解Servlet

一、Web项目结构

|- WebRoot :   web应用的根目录

                            |- 静态资源(html+css+js+image+vedio)
                            |- WEB-INF : 固定写法。

                                   |-classes: (可选)固定写法。存放class字节码文件

                                   |-lib: (可选)固定写法。存放jar包文件。

                                   |-web.xml                                                  

 注意:

        1)WEB-INF目录里面的资源不能通过浏览器直接访问

        2)如果希望访问到WEB-INF里面的资源,就必须把资源配置到一个叫web.xml的文件中。

二、手动开发动态资源

2.1静态资源和动态资源的区别

静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源。

动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变。

2.2源的开发技术

Servlet : 用java语言来编写动态资源的开发技术。

Servlet特点:

          1)普通的java类,继承HttpServlet类,覆盖doGet方法

          2)Servlet类只能交给tomcat服务器运行!!!!(开发者自己不能运行!!!)

三、Servlet

1、Servlet重要的四个生命周期方法

       1)构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象只调用1次。证明servlet对象在tomcat是单实例的。

       2)init方法: 创建完servlet对象的时候调用。只调用1次。

       3)service方法: 每次发出请求时调用。调用n次。

       4)destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

2、伪代码演示servlet的生命周期,Tomtcat内部代码运行:

1)通过映射找到到servlet-class的内容,字符串: com.itmayiedu.a_servlet.FirstServlet
2)通过反射构造FirstServlet对象
 2.1 得到字节码对象
                    Class clazz = class.forName("com.itmayiedu.a_servlet.FirstServlet");
2.2 调用无参数的构造方法来构造对象
                    Object obj = clazz.newInstance();     ---1.servlet的构造方法被调用
3)创建ServletConfig对象,通过反射调用init方法
3.1 得到方法对象
                    Method m = clazz.getDeclareMethod("init",ServletConfig.class);
3.2 调用方法
                    m.invoke(obj,config);                         --2.servlet的init方法被调用
4)创建request,response对象,通过反射调用service方法
4.1 得到方法对象
                    Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
4.2 调用方法
                    m.invoke(obj,request,response);       --3.servlet的service方法被调用
5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
5.1 得到方法对象
                    Method m = clazz.getDeclareMethod("destroy",null);
5.2 调用方法
                    m.invoke(obj,null);                            --4.servlet的destroy方法被调用

四、Servlet的多线程并发问题

 注意: servlet对象在tomcat服务器是单实例多线程的。

因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题

解决办法:

           1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)

            2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

五、ServletContext对象

5.1得到web应用路径

        java.lang.String getContextPath()  用在请求重定向的资源名称中

5.2域对象有关的方法

           域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。         

          方案1: 可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。

          方案2: 可以使用域对象共享数据,好处:可以共享任何类型的数据!!!!!

ServletContext就是一个域对象!!!!

          保存数据:void setAttribute(java.lang.String name, java.lang.Object object)                               

           获取数据: java.lang.Object getAttribute(java.lang.String name)  

           删除数据: void removeAttribute(java.lang.String name)

ServletContext域对象:作用范围在整个web应用中有效!!!

所有域对象:

          HttpServletRequet 域对象

          ServletContext域对象

           HttpSession 域对象

           PageContext域对象

5.3转发与重定向

          RequestDispatcher getRequestDispatcher(java.lang.String path)

 1)转发

                  a)地址栏不会改变

                  b)转发只能转发到当前web应用内的资源

                  c)可以在转发过程中,可以把数据保存到request域对象中

2)重定向                  

                  a)地址栏会改变,变成重定向到地址。

                  b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。

                 c)不能再重定向的过程,把数据保存到request中。

结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值