Servlet学习备忘

1. 学习Servlet。

1.1 如何开发一个Servlet程序

     1.编写Java类,继承HttpServlet类

     2.重写doGet和doPost方法

     3.Servlet程序交给tomcat服务器运行

         3,1 .class放入classes文件夹

         3.2 配置web.xml配置文件

1.2 tomcat如何找到servlet程序

Tomcat启动时。首先加载webapps中的配置文件,通过xml配置文件,浏览器根据url-pattern找到servlet-name,再根据servlet-name找到servlet-class,根据servlet-class获得.class字节码,通过反射即可调用相关函数。

1.2.1 url-pattern(映射路径)

     精确匹配:http://localhost:8080/url       <url-pattern> /url </url-pattern>

     模糊匹配:

http://localhost:8080/(任意路径)     <url-pattern> /*</url-pattern>(/*和/是一个意思)

http://localhost:8080/url_first/(任意路径)     <url-pattern> /url_first/*</url-pattern>

http://localhost:8080/(任意路径).(do/action/html) <url-pattern> *.(do/action/html)</url-pattern>

注意:

1.要么/开头,要么以*开头,/url_first/*.do不可以

2.精确匹配优先,长得最像优先被匹配

3.以后缀名结尾的模糊匹配优先级最低

1.3 Servlet的缺省路径

     Servlet的缺省路径是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web引用的静态资源文件。

问题:URL输入http://localhost:8080/index.html时,tomcat如何读取文件。

1.到web文件夹下的web.xml中查找是否有匹配的url-pattern。

2.如果没有匹配的url-pattern,那么就交给DefaultSeevlet。

3.那么就去conf/web.xml中查找,如果找到该文件,则读取该文件内容。

4.如果找不到,则返回404

     结论:先找动态资源,再找静态资源、

1.4 Servlet的生命周期

     Servlet类对象什么时候创建,调用什么方法,什么时候销毁。

     Servlet程序的生命周期是有tomcat服务器控制的。

     1.先调用静态代码块(类加载过程中的的准备,解析,初始化,<cinit>环节中初始化。)

     2.再调用构造函数(构造函数和init在创建对象时调用,即第一次访问servlet的时候创建servlet对象)

     3.在调用init函数(创建完servlet对象时)

     4.调用service函数(每次发出请求时都会调用)

     5.destroy(停止服务器或者重新部署web应用时调用,销毁servlet对象。)

1.5 伪代码延时Servlet的生命周期

     1.通过映射找到servlet-class的内容,即类全名的字符串 Try.Demo01

     2.通过反射构造Demo01对象

         2.1 得到字节码对象

         Class clazz = Class.forName(“Try.Demo01”);

         2.2 调用无参数的构造方法来构造对象

         Object obj = Clazz.newInstance();

         2.3 创建Demo01对象,并通过反射调用init(ServletConfig);(先无参再有参)

              2.3.1得到方法对象

              Method m = clazz.getDeclareMethod(“init”,ServletConfig.class);

              2.3.2 调用方法

              m.invoke(obj,config);

         2.4 调用service方法

              2.4.1 得到方法对象

            Method m = clazz.getDeclareMethod(“service”,HttpServletRequest.class,HttpServletResponse.class);

              2.4.2 调用该方法

              m.invoke(obj,request,response);

          2.5 调用destroy方法

              2.5.1 得到方法对象

              Method m = clazz.getDeclaredMethod(“destroy”,null);//arg1:函数名 arg2:参数类

              2.5.2 调用方法

              m.invoke(obj,destroy)//arg1:调用对象 arg2:参数

1.6 Servlet的自动加载

     默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问servlet的时候比较慢。

     改变Servlet创建对象的时机,提前到加载web引用的时候。

     解决方法:在servlet的配置信息中,加一个<load-on-startup>即可。按道理来说实在web.xml里面配置,在IDEA中可以用注解解决。<servlet><load-on-startup> n </load-on-startup></servlet>数值越大,优先级越低

1.7 两种init(),有参与无参。

     有参的init方法一定会被Tomcat服务器调用。

     无参的init方法是给开发者用来覆盖的。

     默认情况下,有参会调用无参的方法。一旦覆盖了父类的有参init且不用super,会导致无参的不会被调用。

1.8 servlet在Tomcat中是单例多线程的。

1.9 Servlet对象学习

HttpServletRequest     请求对象:获取请求信息

HttpServletResponse    响应对象:设置响应对象

ServletConfig        servlet配置对象

创建时机:在创建完servlet之后,在调用init之前创建ServletConfig对象。

得到对象:直接从有参的init方法中来 (this.config = config)

ServletConfig config = this.getServletConfig();String value = config.getInitParameter(name);

ServletContext       servlet的上下文对象(代表了整个web.xml)

创建市级:加载web应用时创建对象,且早于ServletConfig

得到对象:从ServletConfig对象中的getServletContext方法中得到

核心API:

                            java.lang.String getContextPath()   --得到当前web应用的路径

 

                            java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数

                            java.util.Enumeration getInitParameterNames() 

 

                            void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法                             

                            void removeAttribute(java.lang.String name) 

 

                            RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

 

                            java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件

                            java.io.InputStream getResourceAsStream(java.lang.String path) 

 

作用:

1.java.lang.String getContextPath()

response.sendRedirect(contextpath+"/testimgs.html");

获得当前webapp的名字,比如http://localhost:9090/test/demo01   /test就是context,因此可以作为重定向的url

2.java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数

java.util.Enumeration getInitParameterNames()

context中的数据相当于是web.xml。相当于是一个全局的,所有/test下的servlet应用(classes文件夹中的class)共享一个web.xml,因此说是全局的。

<context-param>无法通过注解实现,必须在web.xml中手动添加。

3.void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法                             

void removeAttribute(java.lang.String name)

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

举例而言:在不同servlet之间共享不同类型的数据。

 

域对象就是一个容器/中介。ServletContext就是一个域对象,本质是因为ServletContext是全局的,一个应用仅有一个,所有Servlet公用一个,因此可以实现这个效果。

保存数据:setAttribute 获取数据:getAttribute 删除数据:removeAttribute

预告:

HttpServletRequest ServletContext HttpSession PageContext 域对象

4.RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

转发的效果类似重定向,但是转发不会改变地址栏的url

 

     1)转发

         a)地址栏不会改变

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

解释:(1:http://localhost:9090/test/demo01  2:http://localhost:9090/test_2/demo01_2

test中不能通过转发到2,但是重定向可以。

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

         解释:本质上转发用的forward(request,reponse)的request和servlet里面的request是同一个,因此request所承载的数据是可以传递的。但是对于重定向而言,是响应一个302+location,直接跳转到另一个页面,request根本就是两个东西。

 

     2)重定向         

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

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

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

猜你喜欢

转载自blog.csdn.net/w8253497062015/article/details/84283302