WEB——Servlet

**WEB简介**
    
    1.网络的架构    C/S        B/S
    2.C/S    客户端/服务器        B/S        浏览器/服务器
        * C/S压力比较小,下载客户端软件,更新    B/S压力比较大,服务器更新。
    
**静态和动态WEB资源**
    
    1.静态:HTML CSS JS    数据不是活的
    2.动态:JSP/Servlet    数据是活的

**服务器简介**

    1.访问:http://ip:端口号/xxx/xxx

**Tomcat服务器**
    
    1.下载和安装服务器
    2.启动服务器    tomcat/bin/startup.bat
    3.关闭服务器    tomcat/bin/shutdown.bat


**常见的启动的问题**

    1.JDK环境没配置好
    2.端口占用的问题

**Tomcat目录结构**

    1.bin        
    2.conf        配置Tomcat配置文件
    3.lib        Tomcat运行时需要的jar包(不是咱们自己编写的第三方jar包)
    4.logs        日志文件
    5.temp        临时文件
    6.webapps    web applications 项目
    7.work        JSP翻译成.java存放的目录

**Tomcat服务器中配置资源**

    1.部署静态的WEB资源
        * 在webapps目录下创建一个文件夹(xxx),直接在xxx目录存放静态资源(HTML CSS JS JSP)
    
    2.部署动态的WEB资源
        * 在webapps目录下创建一个文件夹(yyy)
            yyy   --   项目
             |    --   存放一些静态的资源(HTML CSS JS JSP)
             |   
            WEB-INF    -- 名称都是固定的        
                |    --  存放一些静态的资源(HTML CSS JS JSP)
                |
                web.xml     --  必须要有的(文档声明,根节点)
                classes     --  文件夹(src目录下所有的java代码,编译成.class文件)
                lib         --  第三方的jar包(DOM4J)
    3.访问:http://localhost:80/yyy/hello.html
    4.注意:    如果这些资源要是存放在WEB-INF目录下的话,不能直接访问的。http://localhost:80/yyy/WEB-INF/hello.html
    
**Tomcat部署WEB项目**
    
    1.把项目直接复制到webapps目录下(常用)
    2.配置虚拟路径
        * 第一种:在tomcat/conf/server.xml/在<Host>标签的中间 配置 <Context path="/itcast" docBase="项目的真实路径" />    
        * 第二种:在tomcat/conf/Catalina/localhost/xxx.xml文件,文件的名称作为虚拟路径(访问路径),在xxx文件中编写<Context  docBase="项目的真实路径" />    


**HTTP的协议**
    
    1.什么是HTTP的协议:
    2.HTTP的请求
        * 请求行
            * 请求方式
                * 常用的请求方式有get和post:
                * get方式把参数列表显示到地址栏上    post封装在请求体中
                * get方式不安全            post安全
                * get方式长度有限制        post支持大数据
            * 请求的地址
            * 协议版本(HTTP1.0 和 HTTP1.1)
        * 请求头
            * if-modified-since        控制本地的缓存
            * referer                记住来源(防止盗链 统计网页的访问 )
            * user-agent                判断用的什么浏览器
        * 空行
        * 请求体
            * 封装post提交方式的参数列表
    3.HTTP的响应
        * 响应行
            * 协议版本
            * 状态码
                * 200        一起ok
                * 302        完成重定向的功能
                * 304        和两个一起控制缓存
                * 404        资源不存在(客户端有错误)
                * 500        服务器内部错误
            * 状态码描述
        * 响应头
            * location        和302一起完成重定向
            * last-modefied    和if-modified-since和304一起控制缓存
            * refresh        页面定时刷新
            * Content-Disposition    文件下载的时候
            * 禁用浏览器缓存(不用记)
                * 值是固定的
        * 空行
        * 响应体:展示给用户的数据


## Servlet技术(重点) ##

**Servlet简介**

    1.什么是Servlet:以后看javaee的文档。
        * Servlet是一个接口,下面有5个方法。
        * Servlet有两个实现类,GenericServlet和HttpServlet
    2.Servlet作用:
        * Servlet是一个小的java程序,运行在服务器端。
        * Servlet接收和响应从客户端发送过来的请求,使用的HTTP的协议。
        * Servlet开发中的角色(看图)


    
**编写一个Servlet程序**
    
    1.编写一个类,实现Servlet接口,重写5个方法。
    2.在web.xml文件中编写Servlet配置文件(记住)
         <!-- 配置Servlet的信息 -->
          <servlet>
              <!-- 在Servlet起名称(值是任意的) -->
              <servlet-name>ServletDemo1</servlet-name>
              <!-- 配置Servlet类的包名+类名(Class.forName("包名+类名")) -->
              <servlet-class>cn.itcast.servlet.ServletDemo1</servlet-class>
          </servlet>
          
          <!-- 配置访问的路径 -->
          <servlet-mapping>
              <!--  配置Servlet的名称(注意:servet-mapping的节点下的servlet-name必须和servlet节点下的servlet-name值是必须相同的) -->
              <servlet-name>ServletDemo1</servlet-name>
              <!-- 配置Servlet的访问路径(值有三种写法)想访问ServletDemo1的程序:http://localhost:80/day09/demo1  -->
              <url-pattern>/demo1</url-pattern>
          </servlet-mapping>
    
    3.把day09项目发布到服务器中,启动服务器,访问ServletDemo1的程序。
    4.Servlet被访问的浏览器       

执行流程图:


    
**Servlet生命周期(面试题)**
    
    1.什么是生命周期:从人的角度人的出生、服务社会、死亡。
    2.Servlet实例的生命周期:从Servlet实例被创建,提供服务,Servlet销毁。在生命周期提供一些方法。
    3.生命周期相关的方法
        * Servlet被创建之后(被服务器创建),立即调用init方法初始化Servlet    init()
        * 从客户端发送过来的任何请求,都会使用service方法进行处理。            service()
        * Servlet从服务器中移除,调用destroy方法进行销毁的操作.                destroy()
    
    4.总结:Servlet实例被Tomcat服务器来创建,第一次访问的时候创建(在内存有一个实例(单例模式)),立即调用init方法进行初始化的操作,使用service方法对外提供服务(有一个请求,实例开启一个新线程,处理请求的内容),service有一次请求,service被调用一次。Tomcat服务器关闭或者移除项目的时候,Servlet被销毁,但是在销毁之前调用destroy方法进行一些销毁操作(释放一些资源),调用destory的方法一次。
    
    
**Servlet在Tomcat服务器怎么运行的**
    
    1.看图03

 


    
**Servlet的类之间的关系**


    
    1.Servlet接口
    2.GenericServlet实现类
    3.HttpServlet实现类
        
        Servlet接口
            |
        GenericServlet (5个方法全部都重写了)
            |
        HttpServlet (service方法进行重写了)
            |
        MyServlet(相当于重写了5个方法,)
        
    4.问题:
        * 编写一个类继承GenericServlet,里面有两个init方法,重写init重写哪一个呢?
            *  如果以后想要重写init方法,重写init()方法(没有参数的ini()方法),因为带参的ini(..)方法里有调用不带参的init()方法。
        * 编写一个类,继承HttpServlet,重写了两个service方法,分别干嘛用?
            ServletRequest(请求)            ServletResponse(响应)
                    |                                                      |
            HttpServletRquest                        HttpServletResponse
        * HttpServlet类中有两个service方法,其中一个service的方法的内部,判断请求的方式(get和post),如果是get请求方式,默认调用doGet方法。如果post请求,默认调用doPost的方法。
        
        * 现在在网络上就使用两种请求,一种get和post。如果编写一个类,继承HttpServelt,重写doGet和doPost方法。因为service方法默认去调用doGet或者doPost方法。开发中最简单的方式。
        
    5.开发Servlet程序(最简单的步骤)
        * 编写一个类,继承HttpServlet
        * 重写两个方法doGet和doPost方法
        * 在web.xml中编写配置文件
        
    6.一般的情况下,doGet和doPost方法中的逻辑都是相同,互相调用,简化编程。
        

**Servlet配置自动加载**
    
    1.Servlet是第一次被访问的时候创建Servlet实例,立即调用init方法进行初始化。
    2.假如:AServlet(非常销毁时间的操作),第一次访问的时候,需要等待的时间非常长。
        * 可以配置Servelt自动加载来解决这一类问题。服务器一启动,自动加载Servlet加载。
        
        * 在web.xml的配置文件中,在<servlet>标签的中间
            <!-- 自动加载:服务器一启动,默认加载该类  值是正整数 ,值越小,优先级就越高。 -->
            <load-on-startup>2</load-on-startup>
    3.注意:值是正整数,值越小优先级越高。
    
    
**Servlet配置访问路径**
    
    1.学会怎么配置?学会怎么来访问?优先级,谁的优先级高先访问谁。
    2.在web.xml中,配置<url-pattern>,怎么来访问Servlet程序。
        * <url-pattern>/servlet/demo1</url-pattern>    -- 完全路径匹配 -- 访问:http://localhost/day09/servlet/demo1
        * <url-pattern>/*</url-pattern>    -- 目录匹配 -- 访问:http://localhost/day09/xxx
        * <url-pattern>*.do或者 *.action</url-pattern> -- 扩展名 访问:http://localhost/day09/xxx.do
    
    3.总结
        * 完全路径匹配    /demo1  以/开头        访问:http://localhost/day09/demo1
        * 目录匹配        /*        以/开头      访问:http://localhost/day09/xxx
        * 扩展名匹配        *.do    不能以/开头     访问:http://localhost/day09/yyy.do

    
    4.优先级(一个WEB程序中有多个Servlet程序,到底是访问哪个Servlet呢?)
        * 完全路径匹配 > 目录匹配 > 扩展名匹配
        
        
**Servlet开发中WEB阶段的路径问题**    

    1.学习编写路径
    2.相对路径

 ./表示当前目录

 ../表示父级目录


        * 不能以/开头
        * 相对路径:当前的这个文件和比对的文件的位置关系。
        * 在WEB服务器中开发相对路径的写法
            * 先访问aa.html  http://localhost/day09/aa.html
            * 访问demo5写法      http://localhost/day09/demo5
            * 在aa.html的文件中直接访问demo5     
                * <a href="demo5">aa</a><br/> 
                * <a href="./demo5">aa</a><br/>

            
            * 先访问bb.html  http://localhost/day09/bb/bb.html
            * 访问demo5写法      http://localhost/day09/demo5
            * 在bb.html的文件中访问demo5
                * <a href="../demo5">bb</a><br/>
    
    3.总结:相对路径的写法,需要先找这两个文件之间关系。但是如果一旦文件的位置改变了,写的相对的路径写法存在问题。解决这种问题,写绝对路径。    
    

    4.编写绝对路径(完整路径)
        * 以/开头的
        * http://localhost:8080/day09/demo5
        * 简便写法: /day09/demo5
        
    5.在绝对路径中有分成两种
        * 客户端绝对路径(举个例子,把项目比作班级,客户端就是别的班级的人,服务器端就是本班级的人,那么别的班级的人就需要知道本班级的班级号,也就是客户端要去服务器端寻找资源就需要知道项目名称,所以客户端绝对路径就需要知道项目名称)
            * 包含项目名称    /day09/demo5
        * 服务器端绝对路径(还是上个例子,本班级的人找本班级的人就不需要知道班级号了,因为是在同一个班级中了,所以服务器端不需要项目名称)
            * 不包含项目名称    /demo5

    
**ServletConfig对象**
    
    1.和在web.xml的配置文件中相关的一个对象。
    2.ServletConfig对象的方法
        * String getServletName()         获取配置Servlet的名称(<servlet-name>ServletDemo5</servlet-name>) 
        * String getInitParameter(String name)      获取初始化参数
         * Enumeration getInitParameterNames()          获取初始化参数
        * ServletContext getServletContext()          获取ServletContext对象
    
    3.总结:配置初始化参数只能针对当前的Servlet,不能在其他的Servlet程序中来获取。
        
**ServletContext对象(重要)**

**ServletContext对象的简介**
    
    1.在javaweb的开发中,一共存在(JSP)4个域对象。在Servlet中一共存在3个域对象。
    2.学习的第一个域对象。
    
    3.ServletContext对象
        * 一个WEB项目只有一个ServletContext对象
        * 可以被WEB项目中的所有的Servlet所共享,可以通过ServletContext来传递数据。
        * 与天地同寿。Tomcat服务器一启动,会为每一个WEB应用创建一个ServletContext对象。服务器关闭的时候ServletContext销毁。

    
**获取ServletContext对象**
    
    1.可以通过ServletConfig获取ServletContext对象
    2.可以直接使用该方法:ServletContext getServletContext() 

//例如:
public void init() throws ServletException {
		// 使用this.getServletContext();直接获取ServletContext
		ServletContext context = this.getServletContext();

	}

**域对象**
    
    1.域对象(其实就相当于一个快递员)可以在多个Servlet(小区中的用户)中传递数据(送快递)。以后需要学习JSP技术(JSP和Servlet程序之间通过域对象来传递数据)


    2.可以向域对象中存入数据    
        * setAttribute("属性名称","值");            setAttribute("xx","123")    setAttribute("xx","456")
    3.可以从域对象中获取数据
        * Object getAttribute("属性名称");
    4.从域对象中删除属性
        * removeAttribute("属性名称");
    
**获取ServletContext作用**

    
    1.获取全局的初始化参数
        * String getInitParameter(String name)      
        * Enumeration getInitParameterNames()  
        * 配置全局的初始化参数
        
    2.实现数据的共享(*****)
        *  void setAttribute(String name, Object object)     设置属性的值
        *  Object getAttribute(String name)                  获取属性的值
        *  void removeAttribute(String name)                  删除属性的值
        *  Enumeration getAttributeNames()                     获取属性的名称们
                    
        * 如何统计访问的次数

package ServletContext;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CountServlert
 */
@WebServlet("/CountServlert")
public class CountServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       //获取网站访问次数用 ServletContext
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		ServletContext context = this.getServletContext();
		//设置初始化参数
		context.setAttribute("count", 0);
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		ServletContext context = this.getServletContext();
		//获取
		Integer count = (Integer)context.getAttribute("count");
		//count++
		count++;
		//存count次数
		context.setAttribute("count", count);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
package ServletContext;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ShowServlet
 */
@WebServlet("/ShowServlet")
public class ShowServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ShowServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext context = this.getServletContext();
		//获取count
		Integer count = (Integer)context.getAttribute("count");
		//显示到页面上
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("<h3>网站一共被访问"+count+"次</h3>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

然后开启服务器,输入CountServlet的网址,访问一次后,再输入ShowServlet的网址即可显示网站已经访问一次。
        
    3.读取资源文件(*****String path的写法
        * InputStream getResourceAsStream(String path)      通过文件的路径获取文件的输入流
        * String getRealPath(String path)                     通过文件的路径获取文件的绝对磁盘路径
         
    4.总结:读取资源文件path路径的写法(db指的是db.properties)
        * 如果db放在src目录下:              path = "/WEB-INF/classes/db.properties";
        * 如果db放在某个包下:       path = "/WEB-INF/classes/cn/itcast/context/db.properties";
        * 如果db放在WebRoot目录下:    path = "/db.properties";

        

package cn.itcast.context;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ReadServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
        // run1();
        // run2();
        // run3();
		// run4();
		ReadDB r = new ReadDB();
		r.read1();
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

	// 读取属性文件
	public void run1() throws FileNotFoundException, IOException{
		Properties pro = new Properties();
		// 使用ServeltContext对象,因为这里面有两个方法
		/**
		 * InputStream getResourceAsStream(String path)  	通过文件的路径获取文件的输入流
		 * String getRealPath(String path) 					通过文件的路径获取文件的绝对磁盘路径
		 * path路径的写法:
		 * 	 * 
		 */
		String path = "/WEB-INF/classes/db.properties";
		InputStream in = this.getServletContext().getResourceAsStream(path);
		
		// 把文件输入流加载到Properties文件里面
		// pro.load(new FileInputStream("src/db.properties"));
		
		// 加载文件
		pro.load(in);
		
		// 通过Properties获取内容
		// String username = (String) pro.get("username");
		String username = pro.getProperty("username");
		String password = pro.getProperty("password");
		System.out.println("用户名是:"+username);
		System.out.println("密码是:"+password);
	}

		/**
	 * 读取的db.properties文件(在包下)
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void run2() throws FileNotFoundException, IOException{
		Properties pro = new Properties();
		// 使用ServeltContext对象,因为这里面有两个方法
		/**
		 * InputStream getResourceAsStream(String path)  	通过文件的路径获取文件的输入流
		 * String getRealPath(String path) 					通过文件的路径获取文件的绝对磁盘路径
		 * path路径的写法:
		 */
		String path = "/WEB-INF/classes/cn/itcast/context/db.properties";
		InputStream in = this.getServletContext().getResourceAsStream(path);
		// 加载文件
		pro.load(in);
		// 通过Properties获取内容
		String username = pro.getProperty("username");
		String password = pro.getProperty("password");
		System.out.println("用户名是:"+username);
		System.out.println("密码是:"+password);
	}
	/**
	 * 读取的db.properties文件(在WebRoot的目录下)
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void run3() throws FileNotFoundException, IOException{
		Properties pro = new Properties();
		// 使用ServeltContext对象,因为这里面有两个方法
		String path = "/db.properties";
		InputStream in = this.getServletContext().getResourceAsStream(path);
		// 加载文件
		pro.load(in);
		// 通过Properties获取内容
		String username = pro.getProperty("username");
		String password = pro.getProperty("password");
		System.out.println("用户名是:"+username);
		System.out.println("密码是:"+password);
	}
	
	// 读取属性文件
	public void run4() throws FileNotFoundException, IOException{
		Properties pro = new Properties();
		// 使用ServeltContext对象,因为这里面有两个方法
		/**
		 * InputStream getResourceAsStream(String path)  	通过文件的路径获取文件的输入流
		 * String getRealPath(String path) 					通过文件的路径获取文件的绝对磁盘路径
		 * path路径的写法:
		 * 	 
		 */
		String path = "/WEB-INF/classes/db.properties";
		String realPath = this.getServletContext().getRealPath(path);
		// C:\apache-tomcat-7.0.57\webapps\day09\WEB-INF\classes\db.properties
		System.out.println(realPath);
		// 把文件输入流加载到Properties文件里面
		pro.load(new FileInputStream(realPath));
		// 通过Properties获取内容
		// String username = (String) pro.get("username");
		String username = pro.getProperty("username");
		String password = pro.getProperty("password");
		System.out.println("用户名是:"+username);
		System.out.println("密码是:"+password);
	}
	
}






    5.使用类的加载器来读取资源文件

package cn.itcast.context;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 普通一个类,没有ServeltContext对象
 * @author Administrator
 *
 */
public class ReadDB {
	
	public void read1() throws IOException{
		// 获取类的加载器 通过class对象
		InputStream in = ReadDB.class.getClassLoader().getResourceAsStream("db.properties");
		Properties pro = new Properties();
		// 加载文件
		pro.load(in);
		// 通过Properties获取内容
		String username = pro.getProperty("username");
		String password = pro.getProperty("password");
		System.out.println("用户名是:"+username);
		System.out.println("密码是:"+password);
		
	}

}


    
**缺省的Servlet**
        
    如果浏览器中访问的资源没有在web.xml的url-pattern中匹配,那么就会去寻找缺省的servlet。

<servlet> 
    <servlet-name>DefaultServlet</servlet-name> 
    <servlet-class>com.qf.web.DefaultServlet</servlet-class>
</servlet> 
<servlet-mapping> 
    <servlet-name>DefaultServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>

这段代码配置了一个缺省的Servlet,也就是说,如果在浏览器的url中没有匹配到任何url-pattern,那么就会与配置了"/"的url-pattern进行匹配,并执行该Servlet。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值