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) servlet的生命周期 : 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 { }}