servlet:动态的web技术
    servlet介绍:
        运行在服务器端.servlet可以做html能做的一切
        作用:可以开发动态web资源(可以生成动态的内容)
        本质上就是一个类
        servlet执行流程:
            1.浏览器输入一个网址
            2.服务器接受到请求,将请求信息进行封装
            3.查找web.xml找到响应的类,调用类里面的方法
            4.类将生成的动态内容返回给服务器
            5.服务器将动态的内容进行封装,返回给浏览器
    入门案例:
        步骤:
            1.编写一个类
                a.继承HttpServlet
                b.doGet(HttpServletRequest,HttpServletResponse)
            2.编写web.xml(WEB-INF/web.xml)
                a.注册servlet
                b.绑定路径
            3.测试
                访问路径:http://localhost:8080/项目名/绑定路径
                例如: http://localhost:8080/javaee_day09/helloworld
    servlet的体系结构及常用的api:
        Servlet(接口)
            |
            |
        GenericServlet(抽象类)
            |
            |
        HttpServlet(抽象类)
        
        常用方法:
            Servlet常用api:
                void init(ServletConfig config):servlet初始化方法
                void service(ServletRequest,ServletResponse):服务方法,处理业务逻辑
                void destroy:销毁
                
                ServletConfig getServletConfig():获取当前Servlet的配置对象
            GenericServlet常用api:
                除了service方法没有实现,其他方法都实现了
                除了实现了int(ServletConfig),且重载int()
            HttpServlet常用api:
                实现了service(ServletRequest,ServletResponse)
                在方法中把两个参数强转并且调用了自己重载service(HttpServletRequest,HttpServletResponse)
                doGet(HttpServletRequest,HttpServletResponse)
                doPost(HttpServletRequest,HttpServletResponse)
    
    
    service的生命周期 :
        init(ServletConfig config)
            /*
             * init:初始化方法
             * 执行时间:默认第一次访问的时候
             * 执行次数:一次
             * 执行者:服务器
             */
        service(ServletRequest,ServletResponse)
            /*
             * service:服务方法
             * 执行时间:访问来的时候
             * 执行次数:访问一次调用一次
             * 执行者:服务器
             */
        destroy()
            /* 
             * destroy:销毁方法
             * 执行时间:当此servlet被移除的时候或者服务器正常关闭的时候
             * 执行次数:一次
             * 执行者:服务器
             */
        
        描述:
            servlet是一个单实例多线程,默认情况下第一次访问的时候,调用init方法,实现初始化操作,请求一次,创建一个线程,
            调用service方法。直到当此servlet被移除的时候或者服务器正常关闭的时候,调用destroy方法,销毁。
        
        自己编写的servlet拥有init方法,void service(ServletRequest,ServletResponse)方法,
        还有service(HttpServletRequest,HttpServletResponse)方法,
        我们重写了doget或者dopost方法。
    
    url-pattern:☆
        格式1:完全匹配        要求:必须以"/"开始  例如:/a/b/c  /life /hello
        格式2:目录匹配        要求:必须以"/"开始,以"*"结尾  例如:/a/b/*
        格式3:后缀名匹配   要求:必须以"."开始,以字符结尾  例如:.jsp  .do  .action
        
        当我们编写的servlet处理不了请求的时候,tomcat缺省的servlet会帮我们做
            访问 1.html   1234.html(返回404)
        路径的优先级:
            完全匹配>目录匹配>后缀名匹配
            
    load-on-startup:
        作用:修改servlet初始化时机
        使用:在servlet标签下使用load-on-startup标签
            值>=0:服务器启动的时候,就会执行当前servlet的init方法
            值越小,执行的优先级越高
            
    servlet模板修改:
        window --> preferences --> java --> editor -->template --> New --> 
        
        package ${enclosing_package};
        import java.io.IOException;
        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        public class ${primary_type_name} extends HttpServlet {
    
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                
                
            }
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                
                
            }
        }
        
        ctrl+a删除后,输入ser,再alt+/
    
    客户端访问servlet的路径写法:
        1.绝对路径
            a.带协议的绝对路径--访问站外的资源
                例如:localhost:8080/javaee_day09/helloworld
            b.不带协议的绝对路径--最常用
                例如:/javaee_day09/helloworld
        2.相对路径
            ./    当前目录
            jquery.js  当前目录
            ../jquery.js  上一级目录
    
    跳转到servlet的方式:
        1.地址栏 url
        2.a标签 href="url"
        3.form action="url"
        4.window.open(url)
        5.location.href=url
ServletConfig:☆
	  是当前servlet的配置对象。
	  获取:
		    通过servlet的getServletConfig();
	  产生:
		    在servlet创建的同时,创建了servletConfig,通过servlet的init(ServletConfig)将servletConfig对象传递给当前的servlet
	  作用:
		    获取当前servlet的初始化参数
		    获取当前servlet的名称
		    获取全局管理者(上下文)
	  常用的方法:
		    String getInitParameter("key"):获取的是指定key的值
		    Enumeration getInitParameterNames():获取所有Key
			      参数在servlet标签下<init-param>
				        格式:
					          <init-param>
						            <param-name>key</param-name>
						            <param-value>value</param-value>
					          </init-param>
		    String getServletName():获取当前servlet的名称(web.xml中的servlet-name)
		    ServletContext getServletContext():获取全局管理者(上下文)
public class SConfigDemoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取servletConfig ServletConfig config=getServletConfig(); //获取初始化参数(servlet ==> int-param ==> param-name ==> param-value) String url=config.getInitParameter("url"); System.out.println(url); System.out.println("---------------"); Enumeration name= config.getInitParameterNames(); while(name.hasMoreElements()){ String key=(String) name.nextElement(); String value=config.getInitParameter(key); System.out.println(key+":"+value); } System.out.println("---------------"); String servletName=config.getServletName(); System.out.println(servletName); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
ServletContext:
	全局管理者(上下文)
	  获取:
		    方法1:this.getServletConfig().getServletContext();
		    方法2:this.getServletContext();☆
	  产生:(生命周期)
		    在项目一启动的时候,就会创建一个servletContext对象,就是当前项目的引用
		    在项目被移除或者服务器关闭的时候,该对象销毁
	  作用:	
		    获取全局的初始化参数
		    共享数据
		    获取资源
		    其他操作
	  常用的方法:
		    String getInitParameter("key"):获取的是指定key的值
		    Enumeration getInitParameterNames():获取所有Key
			      参数是放在跟元素下面<context-param>
				        格式:
					          <context-param>
						            <param-name>key</param-name>
						            <param-name>value</param-value>
					          </context-param>
		
		     String getRealPath(""):获取指定文件在tomcat上的绝对路径
			      例如:getRealPath("/"): D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\javaee_day09\
		         InputSream getResourceAsStream("路径"):以流的形式返回一个文件
public class SContextDemoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取servletContext ServletContext context=getServletContext(); //获取全局的初始化参数==>content-param==>param-name==>param-value String url=context.getInitParameter("url"); System.out.println(url); System.out.println("--------------"); Enumeration names=context.getInitParameterNames(); while(names.hasMoreElements()){ String key=(String) names.nextElement(); String value=context.getInitParameter(key); System.out.println(key+":"+value); } System.out.println("--------------"); //获取文件路径 String path=context.getRealPath("/"); System.out.println(path); System.out.println("--------------"); String path5=context.getRealPath("/WEB-INF/classes/d/servletcontext/5.txt"); System.out.println(path5); BufferedReader reader=new BufferedReader(new FileReader(path5)); System.out.println(reader.readLine()); System.out.println("-------------------"); //以流的形式返回一个文件 InputStream in=context.getResourceAsStream("/WEB-INF/classes/d/servletcontext/5.txt"); reader=new BufferedReader(new InputStreamReader(in)); System.out.println(reader.readLine()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
  域对象:
		    ServletContext域对象
		    相当于一个Map
		  作用:
			    共享数据(servlet之间通信)
		  常用方法:
			    xxxAttrbute();
				    setAttribute(String key,Object value);存
				    Object getAttribute(String key);取
				    removeAttribute(String key);移除
				
				    Enumeration getAttributeNames()
public class AttrDemoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取servletContext ServletContext context=getServletContext(); //存数据 context.setAttribute("arr",new int[]{1,2,3}); //取数据 int [] array=(int[]) context.getAttribute("arr"); System.out.println(Arrays.toString(array)); //移除 //context.removeAttribute("arr"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
案例:
	统计一个servlet的访问次数
	
	分析:
		  countServlet:被统计的servlet
		  showServlet:用来显示countServlet被访问的次数
CountServlet:记录次数
public class CountServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取servletContext ServletContext context=this.getServletContext(); //首先取次数 Integer count=(Integer) context.getAttribute("count"); //判断次数是否为空 if(count==null){ count=1; }else{ count++; } //将次数放入域中 context.setAttribute("count", count); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
ShowServlet:显示次数
public class ShowServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //作用:显示访问次数 //获取servletcontext ServletContext context=this.getServletContext(); //在域中取访问次数 Integer count=(Integer) context.getAttribute("count"); //打印 System.out.println("访问的次数为"+(count==null?0:count)); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
路径记不住,用的时候查询
classpath的获取: 1.通过字节码文件获取路径 类.class.getResource("").getPath():获取的是当前字节码文件所在的目录 获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/readfile/ 类.class.getResource("/").getPath():获取的是字节码文件的根目录 获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/ 2.通过类加载器获取路径 类.class.getClassLoader().getResource("").getPath():获取的是字节码文件的根目录 获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/ 类.class.getClassLoader().getResource("/").getPath():获取的是字节码文件的根目录 获取的是:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/javaee_day09/WEB-INF/classes/ getRealPath("/"):获取的是项目的根目录 / 案例: 四个文件: 开发中的目录 服务器上的路径 获取方法 1.txt src /web-inf/classes/1.txt 3种 2.txt webcontent /2.txt getRealPath 3.txt web-inf /web-inf/3.txt getRealPath 4.txt 包下 /web-inf/classes/包名/4.txt 第一种 public class ReadFileServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*String path1=ReadFileServlet.class.getResource("").getPath(); String path2=ReadFileServlet.class.getResource("/").getPath(); String path3=ReadFileServlet.class.getClassLoader().getResource("").getPath(); String path4=ReadFileServlet.class.getClassLoader().getResource("/").getPath(); System.out.println(path1); System.out.println(path2); System.out.println(path3); System.out.println(path4); * */ ServletContext context=getServletContext(); String path1=this.getClass().getResource("/1.txt").getPath(); String path2=context.getRealPath("/2.txt"); String path3=context.getRealPath("/WEB-INF/3.txt"); String path4=this.getClass().getResource("4.txt").getPath(); readFile(path1); } private void readFile(String path) throws IOException { FileReader reader=new FileReader(path); BufferedReader bufr=new BufferedReader(reader); String line=null; while((line=bufr.readLine())!=null){ System.out.println(line); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }