Servlet
B/S架构的原理
-
B(browser)S(server)
-
服务器里面部署了 静态资源、动态资源,
静态资源:html、css、javascript
动态资源:servlet,jsp【Java类(没有主方法,依赖服务器如tomcat 执行它)需要 遵守一定的规则,服务器才能识别并执行它】
servlet基础详解(server applet)
-
概念:servlet是运行在服务器端的小程序,servlet是一个接口
-
servlet定义了Java类被服务器访问到的规则,将来来我们需要自己定义一个类,直接或间接实现servlet接口,再复写方法
servlet快速入门
-
在src文件夹里面自定义一个类,直接或间接实现servlet接口,尤其注意重写service方法
-
在web.xml 文件里面配置这个类的访问信息
<!--配置实现类的url路径(在web.xml里面配置)-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.zgq.web.servlet.demo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
- 利用配置里面的 url-pattern 访问该Java类 (IP地址:端口号/虚拟路径/url-pattern)
ps: 虚拟路径在 Edit Configuration 里面配置 application context
servlet执行原理分析
- 将浏览器接受到客户端的请求后,会解析请求URL路径,获取请求访问的servlet的资源路径
- 查找web.xml ,看是否有对应的 url-pattern
- 如果找到url-pattern,tomcat会将全类名servlet-class对应的字节码文件加载进内存,并创建其对象。Class.forName() XXX.newInstance().
- 调用创建的对象的方法
servlet中的生命周期
-
被创建(被创建执行init)
servlet什么时候被创建?
1. 默认情况下,在第一次访问时,servlet被创建
- 我们可以指定servlet被创建的时期(在中添加x)
X的值默认为负数,我们可以修改为0或正整数 ,如果想在第一次被访问时创建,设置X为负数,如果想在服务器被启动时创 建,设置X为0或正整数
- init方法只执行一次,说明一个servlet类只有一个对象,即为单例地设计模式
- 单例设计模式会存在线程安全问题,加线程锁又会影响效率
- 解决办法:尽量不要在servlet定义成员变量,最好只定义方法内地局部变量。即使定义了成员变量,那么也不要对其进行修改操作,只执行获取操作
-
提供服务(每访问一次就会执行一次service)
-
被销毁(服务器正常关闭时执行一次destroy)
destroy方法在servlet被销毁之前执行,一般用于释放资源
package cn.zgq.web.servlet; import javax.servlet.*; import java.io.IOException; public class demo2 implements Servlet { //初始化方法,在创建的时候调用 @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init......."); } //获取servletConfig对象 @Override public ServletConfig getServletConfig() { return null; } //提供服务的方法,每一次访问servlet的时候都会执行一次 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service......"); } //获取servlet的一些信息 @Override public String getServletInfo() { return null; } //销毁方法,在正常关闭服务器的时候执行,只会执行一次 @Override public void destroy() { System.out.println("destroy......"); } }
servlet快速入门补充
- 在servlet3.0及以上版本,可以不再用 web.xml 文件配置servlet,而是用 注解 代替。
在类上面使用注解
//方式一
@WebServlet(urlpatterns="/demo1")
//方式二
@WebServlet("/demo1")
- urlpatterns的配置参数补充
//此注解中的urlpatterns实际是一个数组,故我们可以传入多个url路径,即一个资源对应多个url路径,但注意,不能与已有的urlpattern重名,否则会报错
@WebServlet({"/demo1","/demo2","/demo3")
-
urlpatterns的配置方式补充
//方式一:多重结构 @WebServlet("/user/login") //方式二:使用通配符(使用通配符的urlpattern在客户端访问时优先级最低) @WebServlet("/user/*") @WebServlet("/*") //方式三: @WebServlet("*.do")
servlet体系结构
Servlet的实现类
GenericServlet(抽象类,实现了Servlet) 和HttpServlet(抽象类,继承了GenericsServlet)
-
GenericServlet实现了Servlet,对servlet里的所有方法做了空实现,同时对service方法写成abstract方法
方案一:通过 extends GenericServlet,只需要覆写service()方法
-
HttpServlet继承了GenericServlet,并对service根据http请求做了覆写(是对Http协议的一种封装封装)
方案二:HttpServlet类里面的service()会根据请求方式来调用HttpServlet类里面的doPost()或doGet()等方法,我们只需 要写一个类去继承HttpServlet类,并覆写doPost()或doGet()等方法。