JavaWeb-Servlet的总结

转载于传智播客教程.

今天内容
	1.Servlet(重点)
	2.ServletCofig(次重点)
	3.ServletContext(重点)
-----------------------------------------------------------------
		1.servlet
			servlet是什么?它的作用是什么?
				servlet是一门开发动态web资源的技术.
				servlet它叫服务器端小应用程序。
				它可以理解服务器端的一个资源,它可以进行请求与响应的处理.
			servlet技术怎样使用?
				sun公司在api中提供了Servlet接口
				
				我们开发Servlet可以有三种方式.
					1.实现  javax.servlet.Servlet接口
					2.继承  javax.servlet.GenericServlet
					3.继承  javax.servlet.http.HttpServlet
					
					
			对于我们开发一个servlet它步骤有两个.
				1.实现或继承 Servlet接口或  GenericSerlvet,HttpServlet。
				2.在web.xml文件对Servlet进行配置.
				
					<servlet>
						<servlet-name>任意起的一个名称,一般会使用servlet的类名</servlet-name>
						<servlet-class>servlet的全名  就是包名.类名.</servlet-class>
					</servlet>
					
					
					<serlvet-mapping>
						<servlet-name>要与上面的servlet-name的值一样</servlet-name>
						<url-pattern>/名称</url-pattern>
					</servlet-mapping>
			------------------------------------------------------
				关于请求方式  get与post
				
					在浏览器上直接输入url----get请求.
					超链接方式也是  get请求.
					
					如果想要以post方式提交,只能通过表单,设置method=post.
					
					
		--------------------------------------------------------------------------
			问题1:我们提交请求时,为什么get请求就会调用doGet方法,post请求,会调用doPost方法?
			问题2:为什么我们重写时,只重写了无参数的init方法,不需要重写有参数的init?
			
			研究servlet的生命周期(******************************)
			
				在我们Servlet接口中定义了三个方法.
					init(ServletConfig config)
					service()
					destroy();
					
			问题1解决:
					是因为在HttpServlet的service方法中,它进行了重写,重写后分根据请求方式不同,调用不同的方法.
						String method=request.getMethod();
						
						if("get".equals(method)){
							doGet();
						}else if("post".equals(method)){
							doPost();
						}
				
			问题2解决:
					在GenericServlet 中定义了一个无参数init方法,重写Servlet接口中的init(ServletConfig config)方法.
					当servlet对象创建后会调用有参数的init方法。在有参数的init方法中又调用了无参数的init方法。
					对于我们来说,我们只需要重写无参数的init就可以。
		--------------------------------------------------------------------------------------------------------
			关于servlet的自动加载.
				正常情况下,servlet是第一次被访问时,会创建servlet实例。并初始化,也就是调用init方法。
				
				我们可以通过对servlet进行配置,让servlet可以随着服务器的启动而自动创建与初始化.
				
				只需要在web.xml文件中在配置servlet时,加上<load-on-startup>	
				
				servlet跟随服务器启动的作用是什么?
					根据特点来分析,当前servlet的init方法是服务器启动了,init方法就被调用了,
					那么我们就可以将一些需要提前加载的信息在servlet的init方法中定义。
					
		------------------------------------------------------------------------------------------------------------
			关于url-pattern的写法.
				
				url-pattern它的作用是什么?
					它的值要与浏览器输入的地址相匹配,通过url-pattern可以查找到servlet-name,在通过serlvet-name可以查找到
					对应servlet类.
					
				它的写法有两种:
					1.完全匹配  要求以/开始,名称与url一致.
					2.使用通配符  *
						1.目录匹配   以/开始,以*结束.
						2.扩展名匹配.    不能以/开始,以*.xxx对束
						
					最经典错误   /*.do	
					
					
					优先级:	完全匹配>目录匹配>扩展名匹配
			--------------------------------------------------------------------------------
			关于访问servlet时的路径问题(客户端访问服务器端资源路径问题):******************
				
				访问一个servlet它的路径有两种写法,一种是绝对路径,一种是相对路径.
				
				绝对路径:<br>
						1.带协议的绝对路径<br>
						<a href="http://localhost/day09/demo2">demo2 servlet</a><br>
						2.不带协议的绝对路径<br>
						<a href="/day09/demo2">demo2 servlet</a>
						
					在开发中,带协议的绝对路径一般应用于访问站外资源。
					而不带协议的绝对路径我们一般是在站内访问时使用的,也是推荐使用的。
					
				******相对路径
					相对路径:<br>
						<a href="./demo2">demo2 servlet</a>
						对于当前路径下的资源我们一般写成:
						<a href="demo2">demo2 servlet</a>
						
					分析:	
						访问admin.html的路径是: http://localhost/day09/admin.html
						访问demo2Servlet的路径是:http://localhost/day09/demo2
						
						通过上面的路径分析,发现admin.html与demo2是同级别,那么它们相对关系就是当前路径下的某某...
						
						
						如果将admin.html放置在main目录下.
						
						访问admin.html的路径是: http://localhost/day09/main/admin.html
						访问demo2Servlet的路径是:http://localhost/day09/demo2
						
						
						那么相对路径就需要改变。
				
							<a href="../demo2">demo2 servlet</a>
							
							
				总结:
					我们在开发中建议使用不带协议的绝对路径.
					它的写法是  /虚拟目录名称/资源路径
					
					根据以上的分析,说明在客户端的 /代表的是就相当于服务器根目录.
					

			---------------------------------------------------------------------
			ServletCofnig
				它是什么?它有什么用?它是由谁创建的?
				
					ServletConfig是Servlet的一个配置对象.					
					每一个servlet都有一个对应的ServletCofnig。
					ServletConfig是由web服务器创建的,它通过Servlet的init方法传递到了
					Sevlet中.
					
					ServletCofnig作用:(它是servlet的一个配置对象)
							1.可以获取Servlet的名称   getServletName();---web.xml文件中的<servlet-name>的值.
							2.可以获取初始化参数
									getInitParameter(String name);   根据name获取value
									getIniteParameterNames();  获取所有的name值,它返回的是一个Enumeration.
									
									对于Enumeration它相当于是一个Iterator。
									Iterator     hasNext()          next()
									Enumeration  hasMoreElement()   nextElement();
									
							3.可以获取ServletContext对象。		
							
					通过代码去测试一下这些操作

						问题:我们在Servlet中怎样获取ServletConfig对象 
							
							我们要查看怎样获取ServletConfig对象,
							我们现在知道,ServletConfig对象是由服务器创建,通过Servlet的init方法传递到Servlet中.
							
							在Servlet类中通过this.getServletConfig()就获取了ServletConfig对象.
							
						问题:什么是初始化参数?
						
							我们在每一个Servlet的配置中,都可以通过
							<init-param>
								<param-name>name</param-name>
								<param-value>value</param-value>
							</init-param>
							进行配置,这个就是servlet的初始化参数
							
						问题:初始化参数的作用?	
						
							我们可以将一些servlet运行时需要加载常量定义在初始化参数中,当我们需要使用时,
							可以直接通过ServletConfig获取到这些值。
							
						ServletConfig总结:
							1.每一个Servlet都有自己的ServletConfig对象.
							2.ServletCofnig对象是由服务器创建,通过Servlet的init方法传递到Servlet中。
							3.ServletConfig对象代表的是Servlet的配置对象,可以通过它获取Servlet的名称与相关初始化参数。
							4.在Servlet中要获取ServletConfig对象,只需要直接调用getServletConfig()就可以。
							5.可以通过ServletConfig获取ServletContext对象.
		-----------------------------------------------------------------------------------------------------------					
			ServletContext对象**************************************************************
				
				它是一个全局的web容器对象.它代表的就是当前工程。
				
				
				类的成员变量:
					这个类的每一个对象都具有这个成员变量.
				类的静态变量
					当前类的所有对象都使用同一个静态变量。
					
				ServletContext代表一个web应用,在这个web应用中所有Servlet使用的就是这一个。	
				每一个Servlet都有ServletConfig。

				
				因为在一个web应用中就一个ServletContext,所有的servlet使用的是同一个ServletContext,
				那么我们这些servlet就可以通过serlvetContext去实现通信。
				
				ServletContext对象它是一个容器对象。(大家将其想像成是一个map集合)
				我们将这种功能的对象叫做域对象(上下文对象)
				
			----------------------------------------------------------------------	
				获取WEB应用的全局初始化参数

				通过ServletContext对象实现数据共享
				案例--- 统计站点访问次数

				利用ServletContext对象读取资源文件
				
				要完成以上的操作,出现的问题:
					1.问题:我们在servlet中怎样获取ServletContext对象,它是由谁创建的?
						ServletContext对象是由服务器创建,它代表web应用.
						要想获取我们可以通过ServletConfig对象去获取.
						
						this.getServletConfig().getServletContext();
						this.getServletContext();这种方式底层也是通过ServletConfig获取的.
						
					2.ServletContext的功能有什么
						1.可以完成Servlet与Servlet之间的通信.
							setAttribute(String name,Object value)
							getAttribute(String name);
							removeAttribute(String name);
							
						2.可以设置全局初始化参数.
							1.在web.xml文件中可设置全局初始化参数
								<context-param>
									<param-name>global</param-name>
									<param-value>this is message</param-value>
								</context-param>
								
							2.怎样获取全局初始化参数
								getInitParameter(String name);
								getInitParameterNames();
													
								设置全局初始化参数在开发中有什么用?
									例子:我们在全局初始化参数中可以设置一个变量来描述整个web应用的字符编码.
									     我们在任意的一个servlet中都可以获取到这个字符编码。
										 
									全局初始化参数它是针对于web工程共享的信息。	 
									
						3.获取Mime类型.
							
							String getMimeType(String name)
							
							我们在讲文件下载时会使用到.
							
						4.在ServletContext中有一些获取路径操作.	
							
							getRealPath(String path); 它返回的是一个String
								
								例如:context.getRealPath("/"); 获取的是当前web应用在磁盘上的绝对路径.
										E:\apache-tomcat-7.0.26\webapps\day09\
								
							getResource(String source);  它返回的是一个URL
							
								例如:context.getResource("/");
									返回的是  /localhost/day09
							
						    getResourceAsStream(String path)   它返回的是一个InputStream
								例如:context.getResourceAsStream("/a.txt");
									得到一个指向了WebRoot下的a.txt文件的一个输入流。
									
									
					以后操作中应用比较多的是1,与4.
				-----------------------------------------------------------------------------------	
					利用ServletContext对象读取资源文件---关于路径问题
					
							在web应用中如果要读取资源文件,我们需要得到文件的绝对磁盘路径。
							
							context.getRealPath("/"); 这时得到的就是tomcat/webapps/工程名/     路径。
							得到文件位置只需要在/后面加上相关的路径就可以.
							
							
							注意:src下的内容会被部署到classes中。而没有在src或WebRoot下的内容不会被部署到tomcat中.
							
					------------------------------------------------------
						关于classpath问题.
							
							javaProject工程  java源文件被编译后会被放置在bin目录.
							java web project工程  java源文件编译后会被放置在classes目录.
							
							我们管bin或classes这样的可以保存class文件的目录叫  classpath路径.
							
							
							在java中,我们要想获取classpath路径可以通过任意一个类的字符码对象获取.
							
							String path=类.class.getResource("/2.txt").getPath()
					
							这时我们就得到了classes目录下的2.txt文件的绝对磁盘路径。
							
					-----------------------------------------------------------------
						总结:
							getRealPath() 它可以得到tomcat下的web应用中的文件的绝对磁盘路径。
							
							类.class.getResource().getPath();是获取classpath路径。就是我们的bin或classes目录路径。
					
					
		----------------------------------------------------------
	
				
				
					
					
				
			

猜你喜欢

转载自blog.csdn.net/qq_41690324/article/details/83210512
今日推荐