E011Web学习笔记-Servlet 傷城~ 2024-04-18 08:43 18阅读 0赞 # 一、Servlet入门 # ## 1、概述 ## ### 概念: ### 运行在服务器上的小程序; 实际上Servlet是一个接口,定义了Java类被浏览器访问到(或者说被Tomcat识别的)规则; ### 使用: ### 自定义一个类实现Servlet接口,复写其中方法; ## 2、快速入门 ## ### 步骤: ### 第一步:创建一个JavaEE项目; 在学习Tomca的时候创建了web项目; 第二步:定义一个类,实现Servlet接口; public class MyServlet implements Servlet{ //... } 第三步:实现接口中的抽象方法; 可根据IDEA的提示实现; 例如: package com.zibo.servlet; import javax.servlet.*; import java.io.IOException; public class MyServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } //提供服务的方法 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet!"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } } 第四步:配置Servlet -- 在web.xml中配置: <!--配置Servlet--> <servlet> <servlet-name>my</servlet-name> <servlet-class>com.zibo.servlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>my</servlet-name> <url-pattern>/my</url-pattern> </servlet-mapping> 访问[http://localhost:8080/web\_war\_exploded/my][http_localhost_8080_web_war_exploded_my]的结果是: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI5Njg5MzQz_size_16_color_FFFFFF_t_70][] ## 3、执行原理 ## **第一步:当服务器接收到浏览器客户端发出的请求后,会解析请求的URL路径,获取访问的Servlet的资源路径;** **第二步:查找web.xml文件,是否存在对应的<url-pattern>标签体内容;** **第三步:如果有则查找到对应的<servlet-class>全类名;.** **第四步:Tomcat会将字节码文件加载到内存,并创建其对象;** **第五步:调用对象的方法;** # 二、Servlet生命周期方法 # ## 1、被创建 ## 执行init方法,执行一次; **一般用于加载资源;** ### Servlet被创建的时间: ### Servlet被创建的时间: 默认情况下,第一次被访问时,Servlet被创建; 可以指定Servlet被创建的时间; 指定Servlet被创建的时间: <!--配置Servlet--> <servlet> <servlet-name>my</servlet-name> <servlet-class>com.zibo.servlet.MyServlet</servlet-class> <!--指定servlet被创建时间 值为负整数(默认):第一次访问时创建; 值为正整数:在服务器启动时创建; --> <load-on-startup>1</load-on-startup> </servlet> ### Servlet是单例的 ### 问题: Servlet只执行一次,说明只有一个Servlet对象,Servlet是单例的,当多个用户同时访问时,可能存在安全问题; 解决: 尽量不要在Servlet中定义成员变量。即使定义了成员变量也不要对其值进行修改操作; ## 2、提供服务 ## 执行service方法,执行多次; 每次访问Servlet时,service方法都会被调用一次; ## 3、被销毁 ## 执行destroy方法,执行一次; Servlet被销毁之前(服务器正常关闭时)执行,但是服务器若没有正常关闭,destroy方法是不会执行的; **一般用于释放资源;** ## 4、方法介绍: ## package com.zibo.servlet; import javax.servlet.*; import java.io.IOException; public class MyServlet implements Servlet { //初始化方法-在Servlet被创建时执行,只会执行一次; @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init..."); } //(了解)获取ServletConfig对象——Servlet的配置对象 @Override public ServletConfig getServletConfig() { return null; } //提供服务的方法,每次Servlet被访问时执行,会执行多次 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet!"); } //(了解)获取Servlet的一些信息:版本、作者... @Override public String getServletInfo() { return null; } //销毁方法,在Servlet被杀死时(之前)(服务器被正常关闭时)执行,只执行一次 @Override public void destroy() { System.out.println("destroy..."); } } # 三、Servlet3.0注解配置 # ## 1、好处 ## 支持注解配置,可以不需要web.xml了; ## 2、步骤 ## 第一步:创建JavaEE项目,选择Servlet3.0以上的版本,可以不勾选 web.xml; 第二步:定义一个类,实现Servlet接口,并复写其方法; 第三步:在类上使用@WebServlet注解进行配置; 注解如:只需要配置虚拟目录(资源路径)名字 @WebServlet(urlPatterns = "/my3") 或者 @WebServlet("/my3") # 四、IDEA与Tomcat的相关配置 # ## 1、IDEA会为每一个Tomcat部署的项目单独建立一份配置文件; ## 查看控制台的log:Using CATALINA\_BASE: "C:\\Users\\Administrator\\.IntelliJIdea2019.2\\system\\tomcat\\Tomcat\_9\_0\_24\_web\_servlet3" ## 2、工作空间项目和Tomcat部署的项目,不是同一个,但后者会自动同步前者的所有内容(资源); ## WEB-INF目录下的资源不能被浏览器直接访问; 断点调试:使用“小虫子”启动——debug启动; # 五、Servlet的体系结构 # ## 1、Servlet接口的实现类 ## GenericServlet -- 抽象类,Servlet的实现类; HttpServlet -- 抽象类,GenericServlet的子类; ## 2、GenericServlet ## 可以通过继承GenericServlet来实现自定义的Servlet类; 继承GenericServlet只需要复写server方法即可,如下: package com.zibo.servlet; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet("/my") public class MyServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("成功通过继承GenericServlet实现……"); } } ### 但是,实际开发中并不用这种方式! ### ## 3、HttpServlet ## 是对http协议的封装,可以简化操作; ### 使用步骤: ### 第一步:自定义Servlet类继承HttpServlet; 第二步:复写doGet/doPost方法; ### 代码示例: ### package com.zibo.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/my") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); System.out.println("doGet……"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); System.out.println("doPost……"); } } ## 4、Servlet相关配置 ## ### ①urlpartten:Servlet访问路径: ### 单个访问路径示例:@WebServlet("/my") 多个访问路径示例:@WebServlet({"/my","/my1","/my2"}) ### ②路径定义规则 ### 三种方式: 1、/xxx 2、/xxx/xxx /*,*表示随意写都可以访问,如/1、/sfd、/423fsf; /*的优先级最低; 3、*.do *.do表示随意写都可以访问,任意字符加上.do,而且do也不是固定的,可以.其他; # 六、知识补充 # ## 1、将请求从一个servlet转发到另一个资源(servlet,jsp或HTML文件) ## 示例: req.getRequestDispatcher("/index.jsp").forward(req,resp); [http_localhost_8080_web_war_exploded_my]: http://localhost:8080/web_war_exploded/my [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI5Njg5MzQz_size_16_color_FFFFFF_t_70]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/17/e62541a627c24af9bffee23e6a90e1df.jpg
还没有评论,来说两句吧...