且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

【HM】第7课:Servlet

更新时间:2022-10-02 21:48:17

<pre>

 

day07

        

上节内容回顾

         1xml的语法

 

         2xml的解析

                   *xml解析的技术有哪些:domsaxpull

                   *domsax的原理

 

         3tomcat的目录

                   binconfwebapps

 

         4)虚拟路径的配置

 

         5http请求

 

         6http响应

 

         7pull解析xml代码

思维导图

【HM】第7课:Servlet

1servlet的快速入门

         1servletjavaweb中的一个组件(帮我们实现好了一些功能,可以直接使用这些功能进行操作)。

         *通过api文件进行查看(javaeeapi文档)

         *javax.servlet包下面,是一个接口

         **servlet是一个运行在web服务器的java程序,接受和响应来自浏览器的操作

        

         2)实现一个servlet有三种方式

                   第一种:实现servlet接口

                   第二种:继承GenericServlet

                   第三种:继承HttpServlet

                   **如果实现接口,需要把接口里面的所有的方法都实现;但是如果继承一个类,不需要都实现

 

         3)第一个servlet程序

         *实现功能:向页面输出内容 hello servlet

 

         *实现步骤:        

                   1、创建一个servlet (继承GenericServlet类)

                   2、向页面输出内容(是一个响应操作)

                            *service(ServletRequest req, ServletResponse res)

                   3、让web服务器知道这个是一个servlet,而不是一个普通的java程序

                            *在配置文件中进行相应的配置

                            *找到web项目的web.xml进行相应的配置

                            *注意配置的时候一个servlet程序对应一个servlet标签和一个servlet-mapping

                              标签。

                            **

                            <servlet>

                                     <servlet-name>servlet1</servlet-name>

                                     <servelt-class>cn.itheima.servlet1</servlet-class>

                            </servlet>

                            <servlet-mapping>

                                     <servlet-name>servlet1</servlet-name>

                                     <url-pattern>/hello</url-pattern>

                            </servlet-mapping>

 

2servlet的执行过程

         *画图分析servlet执行过程

         *第一步:根据浏览器的地址栏输入的路径,到web项目中的web.xml中找url-pattern里面相同的名称

         *第二步:找到url-pattern对应的servlet名称

         *第三步:到另外一个标签servlet标签里面找servlet名称相同的servlet

         *第四步:得到servlet的位置(包类路径)

         *第五步:利用反射的原理,让servlet里面的service方法自动执行

 

3servlet的生命周期

         *生命周期:比如一个人从出生到死的过程,这个是一个人的生命周期

        

         *servlet从创建到销毁的全过程称为 servlet的生命周期

 

         *servlet接口里面有三个方法是与生命周期相关的方法

         **init方法:初始化的方法,servlet创建时候执行这个方法

         **service方法:每次访问servlet时候回执行这个方法

         **destroy方法:servlet销毁时候会执行这个方法

        

         *servlet在什么时候创建?

         **在第一次访问servlet时候创建,执行init方法

 

         *servlet创建几次?

         **创建一次,init方法执行一次

 

         *service方法会执行几次?

         **每次访问servlet时候,会执行service方法,执行多次

 

         *servlet在什么时候销毁?

         **关闭服务器时候销毁,执行destroy方法,执行一次

 

4servlet开发中的细节问题

         1)代表servlet请求的对象

         *ServletRequestHttpServletRequest关系

         **HttpServletRequestServletRequest子接口

 

         2)代表servlet响应的对象

         *ServletResponseHttpServletResponse关系

         **HttpServletResponseServletResponse子接口

 

         ***sun公司设计的目的:认为未来互联网发展不仅仅限于一种http协议,可能还会有其他的协议,但是现在只有http

         设计了一个ServletRequestServletResponse,如果未来有了新的协议,不需要开发新的接口,可以直接使用。

 

         3GenericServlet类里面init没有参数的方法和init有参数的方法的关系

         *通过servlet的源代码查看

         **init有参数的方法到servlet里面也要调用没有参数的init方法,所以直接使用没有参数的init方法就可以了

 

         4HttpServletservice方法和doXX方法的关系

         *service里面根据不同的提交方式调用不同的doxx方法

         比如get提交方式调用doGet方法,比如post提交方式调用doPost方法

        

         **表单提交方式有很多种,常用有getpost

         **在实际开发中,一般都使用继承HttpServlet类实现servlet,在这个servlet里面直接写dogetdopost方法就可以了

        

         **在实际开发中,一般可以直接通过myeclipse工具直接创建一个servlet

 

         5)简化编程

         *doPost方法里面调用doGet方法,无论是get请求还是post请求都会执行代码

 

         6)修改servelt的模板

 

         7)服务器启动的时候创建servlet

         *如果张三第一个访问servlet,如果创建servlet时候做很多的操作,要查询数据库,读文件,谁第一个访问,会很慢

         *进行相应的配置,在web.xml中进行操作

         **使用一个标签 <load-on-startup>正整数的值</load-on-startup>

         **在要启动的servlet标签里面进行配置

         *** <load-on-startup>2</load-on-startup>

         **配置启动时候创建值,不能写成1,在tomcat里面有默认的servlet值是1

        

5url-pattern的配置

         *在浏览器输入的路径进行访问配置

        

         *有三种:

         第一种:完全路径匹配 

         **写法,首先/必须要有的,/hello , /aa/hello

 

         第二种:目录匹配

         **写法,首先/必须要有的,/bb/* , /*

 

         第三种:扩展名匹配

         **写法,首先不能有/*.action, *.do

 

         **在一个servlet里面可以写多个 <servlet-mapping>,最终只会有一个访问

 

         优先级:完全路径匹配 > 目录匹配 > 扩展名匹配

 

         **ppt上面的例子看明白

 

6、开发中的路径问题

         1)相对路径

         *在一个html中引入图片

         **如果图片和html在一个目录下,直接写图片名称

         **如果图片在html的上层目录,../图片名称

         **如果图片在html的下层目录,目录名称/图片名称

 

         2)绝对路径(使用这种方式)

         *写法一: http://127.0.0.1/day07/img/w02.jpg

         *写法二:/项目名称/路径

                   =/day07/img/w02.jpg

        

         3)绝对路径分成两种

         第一种:客户端路径:在路径里面带项目名称 /day07/.....

 

         第二种:服务器端路径在路径里面不带项目名称

         **经常用在转发的操作里面

         **重定向和转发的区别(重点掌握概念)

 

=========================================================================================

         上午内容的总结

         1servlet的实现方式有三种

         2servlet代码实现的步骤

         3servlet生命周期(记住)

         4Servlet开发注意细节

         5url-pattern配置(三种配置以及优先级)

         6)路径问题

                   *绝对路径

                   *重定向和转发区别(掌握)

 

7ServletConfig对象

         *得到servletConfig的对象getServletConfig()方法

 

         *可以做的事情

         第一个:可以获得当前运行的servlet的名称 使用方法getServletName()

                   =<servlet-name>ServletDemo1</servlet-name>

                   //得到当前运行的servlet的名称 <servlet-name>ServletDemo5</servlet-name>

                   ServletConfigconfig = getServletConfig();

                   Stringname = config.getServletName();

                   System.out.println(name);

 

         第二个:可以得到初始化参数,使用方法getInitParameter(String name)

                   =创建初始化参数,找到web.xml文件,进行相应的配置

                   *找到要配置的servlet标签,进行配置

                   <init-param>

                            <param-name>名称</param-name>

                            <param-value></param-value>

                   </init-param>

 

                   =//得到初始化参数 getInitParameter(String name)

                   publicvoid test2() {

                            //得到servletconfig对象

                            ServletConfigconfig = getServletConfig();

                            //得到初始化参数username

                            Stringvalue = config.getInitParameter("username");

                            System.out.println(value);

                   }

 

                   =Enumeration getInitParameterNames() :得到所有的初始化参数的名称

                   =// getInitParameterNames()使用

                   publicvoid test3() {

                            //得到servletconfig对象

                            ServletConfigconfig = getServletConfig();

                            Enumeration<String>enumration = config.getInitParameterNames();

                            //遍历得到每个名称

                            while(enumration.hasMoreElements()){

                                     Stringname = enumration.nextElement();

                                     System.out.println(name);

                                     System.out.println("value:"+config.getInitParameter(name));

                            }

                   }

                  

                   *使用范围:初始化参数配置在某个servlet标签里面的,所以只能在这个servlet里面获取到这些初始化参数

 

         第三个:得到ServletContext对象,使用方法getServletContext()

                   *一般在实际开发中不用这个方法,得到ServletContext对象使用getServletContext();

 

8servletContext对象(****

         第一件事情:获取全局的初始化参数(在项目里面的所有的servlet里面都可以得到参数)

         不要写在任何的一个servlet标签里面。

         <context-param>

                   <param-name>名称</param-name>

                   <param-value></param-value>

         </context-param>

         =getInitParameter(String name)

                   **//获取全局初始化参数

                   //servletContext对象

                   ServletContextcontext = getServletContext();

                   Stringurl = context.getInitParameter("url");

                   System.out.println(url);

         =getInitParameterNames()

                   **//servletContext对象

                   ServletContextcontext = getServletContext();

                   Enumeration<String>enumration = context.getInitParameterNames();

                   while(enumration.hasMoreElements()){

                            Stringname = enumration.nextElement();

                            System.out.println("name:"+name);

                            System.out.println("value:"+context.getInitParameter(name));

                   }

        

         第二件事情:用于存值和取值的对象

         tomcat服务器启动的时候,tomcat里面可能有多个项目,服务器会为每一个项目创建一个对象servletContext

         在一个项目里面向这个对象里面设置一个值,在这个项目里面的所有的servlet里面都可以取到这个对象里面的值

         *servletContext里面设置值:setAttribute(String name, Object object)

                   =两个参数:第一个参数是值的名称,第二个参数具体值

         *servletContext里面获取值:getAttribute(String name)

 

         **比如:通过servlet1servletContext设置一个值,通过servlet2获取这个值

 

9、练习:使用servletContext统计网站的访问次数

         *创建一个servlet,每次访问这个servlet,代表一次访问

         *servletContext域对象:在一定的范围内,存值和取值,servletContext范围是整个web项目,只有服务器不关闭,一直存在。

 

10、使用servletContext对象读取web项目中的文件

         1)传统方式读取web项目中的文件

 

         2servletContext对象读取web项目中的文件

         *使用到这个对象里面的两个方法

         =InputStream getResourceAsStream(String path) :得到web项目中文件的输入流

 

         **操作一:读取web项目中src下面的文件

         ***使用servletContext里面getResourceAsStream(String path)得到文件的输入流

                   ==path首先第一个位置写 /,理解为项目名称;后面写文件在tomcat里面具体的路径的地址

         =代码

                   //读取src下面的文件

                   //得到properties对象

                   Propertiesp = new Properties();

                   //得到servletContext对象

                   ServletContextcontext = getServletContext();

                   //首先第一个位置是固定的,写理解为项目名称 ;后面文件在tomcat里面具体的路径地址

                   InputStreamin = context.getResourceAsStream("/WEB-INF/classes/db1.properties");

                   p.load(in);

                   Stringurl = p.getProperty("url");

                   Stringusername = p.getProperty("username");

                   Stringpassword = p.getProperty("password");

                   System.out.println(url+""+username+" "+password);

 

         **操作二:读取包里面的文件

         ***首先第一个位置是固定的,写 / 理解为项目名称;后面文件在tomcat里面具体的路径地址

         =InputStream in =context.getResourceAsStream("/WEB-INF/classes/cn/itcast/readfile/db2.properties");

        

        

         3StringgetRealPath(String path) :得到文件的完全路径(带盘符路径)

                   **  首先第一个位置写 /,理解为项目名称;后面写文件在tomcat里面具体的路径的地址

                   //path路径和之前写getResourceAsStream原则是一样的

                   //I:\0621\apache-tomcat-7.0.53\webapps\day07\db3.properties

                   Stringpath = context.getRealPath("/db3.properties");

 

 

11、使用类的加载器来读文件

         *使用范围:只能读取classes里面的文件

         *要想使用类加载器读取文件,首先得到类加载器

         **类加载器如何得到:

         ***首先得到Class类(有三种方式)

         ***其次使用Class类里面的方法

 

         *代码

         //得到Class

         Classclazz = this.getClass();

         //得到类加载器

         ClassLoaderclassLoader = clazz.getClassLoader();

         //使用类加载得到文件的输入流

         InputStreamin = classLoader.getResourceAsStream("db1.properties");

 

12urluri的区别

         *url:指的是浏览器地址栏访问的地址,比如 http://127.0.0.1/day07/read4

         *uri:包含url地址,uri里面也可以有其他网络的地址,比如 zhangsan@163.com  thunder://   ed2k:///

 

 

13、默认Servlet介绍(了解)

         *比如在浏览器的地址栏随便输入一地址,浏览器显示404,这个404的效果是默认的servlet实现的

         *tomcatconf目录,找到web.xml

         *配置<load-on-startup>值是1,自己要自己创建的servlet在服务器启动时候创建,值不能写1,大于1的值

         *默认servlet<url-pattern>/</url-pattern>,如果把一个servlet<url-pattern>/</url-pattern>这个servlet就可以成为一个默认的servlet

 

14、反射的原理(掌握)

         *反射:反射应用在通用比较高的代码里面,比如框架

        

         *反射原理(画图分析)

         **通过反射得到类中的所有的内容

         ***类中:构造方法,属性,普通方法

 

==================================================

         完成的任务:

         1、把今天我写的所有代码至少一遍

         2、把servletContext里面代码至少写两遍

         3、把反射的原理描述清楚

 

</pre>



      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1670376,如需转载请自行联系原作者