2021-11-16

学习java第三天

1.Servlet技术
1.1 Servlet概述:
什么是servlet:它是运行在web服务器端的一个java小程序,简单来说,它就是一个java类
在使用servlet时,需要导入javax.servlet下的jar包。比如:tomcat服务器提供了
servlet的servlet-api.jar包,所以在开发时用tomcat服务器就不需要再导入servlet的jar包。
Servlet它是一个资源,是用来被用户访问的资源,同时是一个动态资源,它是由sun指定的servlet规范。
Servlet的作用:它是基于Http协议的,主要是用来接收客户端发送的请求,处理请求,把数据响应给客户端。
1.2 Servlet的入门
Servlet的接口和实现类:
>>>Servlet它是一个接口,在javax.servlet 包下面。
五个方法:
* destroy():执行这个方法,销毁了servlet对象
* init(ServletConfig config):在web服务器创建servlet对象以后,执行这个初始化方法。
* service(ServletRequest req, ServletResponse res) :服务方法,用来接收客户端发送的请求,并且响应数据到客户端
* getServletConfig():现在不讲
* getServletInfo():servlet 的信息,比如作者、版本和版权,这个方法在开发中不用。
>>>GenericServlet,它是一个类,实现了Servlet接口
>>>HttpServlet,它是一个类,实现了Servlet接口,同时继承了GenerciServlet
创建servlet三种方式
>>>直接实现Servlet接口。
>>>继承GenericServlet类
>>>继承HttpServlet类。
一般在开发中,创建servlet,通常去继承这个HttpServlet.
比如:class MyServlet extends HttpServlet{ 重写咱们所需要的方法}
1.3.实现第一个Servlet程序
>>> 1.自己手动创建Servlet,通过Dos命令窗口编译Servlet,把编译好的class文件部署到tomcat服务器运行。
>>> 2.通过Eclipse创建Servlet,部署到tomcat服务器,然后就可以访问咱们所需要的Servlet。
步骤:
1.创建HelloWordServlet,继承GenericServlet
2.重写父类GenerciServlet的service方法。
3.在服务方法里面,处理客户端的请求后,把数据响应给客户端。
比如:

	public class HelloWordServlet extends GenericServlet{
					@Override
					public void service(ServletRequest arg0, ServletResponse response)
							throws ServletException, IOException {
						// 处理客户端发送的请求,并且把数据响应给客户端
						 System.out.println("接收了客户端的请求-------------------");
						 //把数据响应给客户端,与浏览器绑定的输出流,作用向浏览器输出数据
						  PrintWriter pw = response.getWriter();
						  pw.print("Hello World");
					}
				}
 访问Servlet,提供servlet的访问路径:
	     比如:
     <!-- 配置访问/hello路径,对应的servlet -->
			  <servlet>
				<servlet-name> helloWorld</servlet-name>
				<servlet-class>cn.itcast.firstmyapp.servlet.HelloWordServlet</servlet-class>
			  </servlet>
			    <!-- 配置浏览器访问servlet的路径 -->
			  <servlet-mapping>
					<servlet-name> helloWorld</servlet-name>
					<url-pattern>/hello</url-pattern>
			  </servlet-mapping>
	    通过浏览器访问:http://localhost:8080/webFirst/hello
			    就找到对应的HelloWorldServlet,把数据响应给浏览器。
	
	 导入jar包:先拷贝对应的jar包,放到WebContent下面的WEB-INF下面的lib文件夹下面。
		            jar的图标就变成小奶瓶。
1.3.Servlet的生命周期:
	   生命周期:自然界人从出生到最终走向西方极乐世界,这个周期过程就是人的生命周期,
		     其实servlet的生命周期和人的一样,从servlet对象被创建,经过使用servlet对象,
		     到最终servlet对象被销毁,整个过程就是servlet的生命周期。
	  与生命周期相关的三个方法:
	  >>> 初始化阶段:
		init(ServletConfig config) 初始化方法:首次访问这个Servlet,servlet对象会被创建,执行初始化方法,执行一次。
	  >>> 运行阶段:
		service(ServletRequest req, ServletResponse res) 服务方法:每次访问servlet时,服务方法都会被执行,执行多次。。
	  >>> 销毁阶段:
		destroy()销毁方法:在服务器正常关闭时。会执行销毁方法,执行一次。
	  比如:
 public class LifeServlet extends GenericServlet {
				/**
				 * 初始化方法
				 */
				@Override
				public void init(ServletConfig config) throws ServletException {
					System.out.println("首次访问LifeServlet时,会执行这个初始化方法-------------");
				}
				/**
				 * servlet的服务方法
				 */

				@Override
				public void service(ServletRequest arg0, ServletResponse arg1)
						throws ServletException, IOException {
					System.out.println("每次访问lifeservlet,都会执行这个服务方法--------");
					
				}
				/**
				 * 销毁方法
				 */
				@Override
				public void destroy() {
					System.out.println("在服务器关闭时,会执行销毁方法----------");
				}
			}
			在web.xml文件上面配置访问路径:
				  <servlet>
					    <servlet-name>lifeServlet</servlet-name>
					    <servlet-class>cn.itcast.firstmyapp.servlet.LifeServlet</servlet-class>
				  </servlet>
				  <servlet-mapping>
					    <servlet-name>lifeServlet</servlet-name>
					    <url-pattern>/life</url-pattern>
				  </servlet-mapping>
1.4 Servlet应用-HttpServlet
    在开发中,通常浏览器访问web服务器端的资源,是带有协议的访问,比如说http协议、https协议等,所以说
    在创建servlet时。需要使用带有协议的servlet,那么咱们程序员在创建servlet时,通常用继承HttpServlet的
    方式来实现。
    1.查看HttpServlet源码得到的结论:
	   在HttpServlet里面重写service方法时,因为在service方法里面,最终调用doGet或者doPost方法,
	   所以说在重写服务方法时,一般情况下不会重写service方法,而是直接重写doGet和doPost方法
	   在客户端发送get请求,在服务器端就用doGet方法接收、
	   在客户端发送Post请求,在服务器端就用doPost方法来接收
    代码如下:
	  public class MyHttpServlet extends HttpServlet{
				/**
				 * 接收客户端发送的get请求
				 */
				public void doGet(HttpServletRequest req, HttpServletResponse resp)
						throws ServletException, IOException {
					String method = req.getMethod();
					System.out.println(method);
					System.out.println("这是发送的get请求");
				}
				/**
				 * 接收客户端发送的post请求
				 */
				public void doPost(HttpServletRequest req, HttpServletResponse resp)
						throws ServletException, IOException {
					String method = req.getMethod();
					System.out.println(method);
					System.out.println("这是发送的Post请求");
				}

			}
   在开发中,注意的细节:
   >>>1.在使用对象时,使用带有协议的请求和响应对象HttpServletRequset和HttpServletResponse
   >>>2.在开发时,继承HttpServlet是,直接重写doGet和doPost方法,而不是重写service方法
   访问servlet的具体执行过程:见图分析。

1.5 使用Eclipse工具开发servlet
    通过开发工具创建servlet有两种方式:
    >>> 1.先创建一个普通的java类,需要去实现Servlet接口,或者继承对应的HttpServlet(GenericServlet)类,
          咱们普通的java类就具有了servlet功能,所以需要手动在web.xml配置文件中添加访问servlet的路径信息。
    >>> 2.直接创建servlet,会自动在web.xml文件中添加访问servlet的路径信息。
    步骤:
    1.新建web项目:
      比如说:创建一个web项目名称:chapter03
    2.创建一个servlet程序:
      比如说:先创建一个包,名称cn.itcast.servlet ,servlet的名称:TestServlet01
    3.部署和访问servlet:
       通过开发工具部署web项目,如chapter03,访问它下面的servlet资源:
       访问的地址:http://localhost:8080/chapter03/testServlet01
      
    注意:一般情况下,为了简化开发,咱们会在doPost方法里面调用doGet方法。
    具体见下代码:
	 /**
			 *  doGet方法,用来接收浏览器发送的get请求
			 */
			protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				// TODO Auto-generated method stub
				PrintWriter out = response.getWriter();
				out.print("this servlet is created by eclipse");
			}

			/**
			 * doPost方法,用来接收浏览器发送的post请求
			 */
			protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				this.doGet(request, response);
			}
	需求: 可以发送get请求和post请求得到1到100之间的和
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				int sum=0;
				for(int i=0;i<=100;i++){
					sum=sum+i;
				}
				------
			}

			/**
			 * doPost方法,用来接收浏览器发送的post请求
			 */
			protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				this.doGet(request,response);
			}
1.6 实现Servlet的虚拟路径映射
    1.Servlet的多重映射:一个Servlet,可以对应多个访问路径。
	    比如:一个servlet对应的访问路径:/test02 或者 /test03
</servlet-mapping>
			   <servlet-mapping>
			    <servlet-name>TestServlet01</servlet-name>
			    <url-pattern>/test02</url-pattern>
			  </servlet-mapping>
			   <servlet-mapping>
			    <servlet-name>TestServlet01</servlet-name>
			    <url-pattern>/test03</url-pattern>
			  </servlet-mapping>
   2.Servlet的映射路径可以使用通配符
     servlet的映射路径有三种方式:、
     >>> 完全目录匹配: 比如 /hello 
     >>> 目录匹配: 比如 /abc/* 或者 /*
     >>> 扩展名匹配: *.do ,*.action 注意 /*.do这种写法是错误的。
     优先级:完全目录匹配>目录匹配>扩展名匹配
   3.缺省Servlet
     什么是缺省Servlet:它的映射路径 “/” ,代表这是一个缺省的servlet.
     缺省的servelt作用:处理请求的资源找不到的问题(404 代表请求的资源找不到)

2.ServletConfig接口
什么是ServletConfig: 它是servlet的配置对象,作用就是获取与servlet的初始化参数。
它的子类是GenericServlet和HttpServlet.
它被实列化是通过web服务器实现的。
得到servletConfig对象:getServletConfig()
ServletConfig常用的方法:
>>>> 1. 获取servlet的初始化参数的值:getInitParameter(String name):根据encoding获取utf-8
>>>> 2. 获取servlet初始化参数的名称:getInitParameterNames() :获取encoding和username等名称
>>>> 3. 得到servletContext对象:getServletContext()
>>>> 4. 获取servlet的名称:getServletName():对应web.xml里面TestServlet02
初始化参数的配置:

	<!-- servlet初始化参数的配置 -->
		<init-param>
				<param-name>encoding</param-name>
				<param-value>utf-8</param-value>
		</init-param>
		<init-param>
				<param-name>username</param-name>
				<param-value>x</param-value>
		</init-param>

3.ServletContext接口
ServletContext对象是在web服务器启动时就创建了,是web服务器创建的servletContext对象,
每一个web项目只有一个ServletContext对象。
ServletContext对象的作用:获取web应用程序的初始化参数,在web应用程序能共享数据,获取web项目下的资源文件。
得到ServletContext对象:
>>>>1.通过ServletConfig对象: config.getServletContext()
>>>>2.直接得到: getServletContext();

1.获取web应用程序的初始化参数(web应用程序就是web项目)
	>>>> 1. 获取全局初始化参数的值:getInitParameter(String name)
	>>>> 2. 获取全局初始化参数的名称:getInitParameterNames() 
	比如:
		<!-- 配置全局的初始化参数 -->
		<context-param>
				<param-name>AAA</param-name>
				<param-value>aaa</param-value>
		</context-param>
		<context-param>
				<param-name>BBB</param-name>
				<param-value>bbb</param-value>
		</context-param>
2.实现多个servlet对象之间共享数据:因为一个web项目只有一个ServletContext对象。
  ServletContext对象就是域对象:域对象在一定范围内能存值和取值。
  域对象相关的方法:
	* 存值:void setAttribute(String key,Object obj);
	*  取值:Object obj = getAttribute(key);
	*  删除值:void removeAttribute(key);
  比如:在TestServlet04里面存值:
 //1.得到ServletContext对象
			ServletContext context = this.getServletContext();
			//2.存值
			 context.setAttribute("key", "servlet04里面存的值----");
		 在TestServletO5里面获取值:
			 //1.得到servletContext对象
			ServletContext context = this.getServletContext();
			//2.从ServletContext取值
			Object obj =context.getAttribute("key");
			String value=obj.toString();
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().print(value);
  3.获取Web下面的资源文件
	通过ServletContext对象能够获取Web项目下面文件的字节输入流,或者文件的绝对路径。
	路径问题:
	 普通java项目:直接使用jdk编译java文件,所以说文件的路径是相对于工作空间。
			比如:
	Properties por = new Properties();
					InputStream inStream = new FileInputStream("src/config.properties");
					por.load(inStream);
					String value =por.getProperty("key");
					System.out.println(value);
	 web项目:运行在tomcat服务器上面的,所有说文件的路径是相对于tomcat服务器。
	          服务器端是没有src这个目录,写路径不能写src,必须相对于tomcat服务器端的路经。
	 1.获取文件的自己输入流:路径是相对于tomcat服务器的路径
	   InputStream  in =getResourceAsStream(String path)  
	   比如:
// 获取文件的字节输入流
			 ServletContext context = this.getServletContext();
			 String path="/WEB-INF/classes/config.properties";
			 InputStream in = context.getResourceAsStream(path);
			 Properties pro= new Properties();
			 pro.load(in);
			 //获取配置文件的值
			 String v1 = pro.getProperty("Company");
			 String v2= pro.getProperty("Address");
			 response.getWriter().print("company name :"+v1+" company address :"+v2);
	2.获取文件的绝对路径:路径是相对于服务器端的路径
  String realPath = getRealPath(path);
		  比如:
			 //1.得到ServletContext对象
			ServletContext context = this.getServletContext();
			//2.获取文件的绝对路径
			String path="/WEB-INF/classes/config.properties";
			//3.调用getRealPath
			//E:\soft\apache-tomcat-7.0.55\webapps\chapter03\WEB-INF\classes\config.properties
			String realPath = context.getRealPath(path);
			System.out.println(realPath);
			InputStream in = new FileInputStream(realPath);
上一篇:Servlet简单介绍


下一篇:javaweb 获取资源