Servlet
获取服务器中的动态资源,也就是java代码,依赖于服务器对java类进行运行,而Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
使用流程
- 创建JavaEE项目
- 定义一个类实现Servlet接口
- 实现接口方法
- 配置Servlet,在web.xml中配置Servlet:
<!-- 配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
Servlet执行流程
- 访问地址
http://localhost:8080/day08_web/demo1
,找到服务器和端口,再找到项目,然后资源demo1
- 找是否有标签
<url-pattern>
与资源路径匹配 - 找
<servlet-name>
->找到对应全类名<servlet-class>
- tomcat将对应字节码文件加载进内存
- 创建对象
- 调用被重写的方法方法
service
Servlet生命周期
/**
* 在Servlet创建时执行,只会执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
/**
* 提供服务方法,每一次Servlet被访问时,执行多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello Servlet");
}
/**
* 在服务器正常关闭时执行一次
*/
@Override
public void destroy() {
System.out.println("destoried");
}
init
创建,只执行一次,说明Servlet是单例的只存在一个资源。多个用户同时访问时可能存在安全问题。解决方法是:尽量不要在Servlet中定义成员变量,更不要对其修改,也就是只读
。
在servlet中配置启动时间
<!-- 配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>servlet.ServletDemo1</servlet-class>
<!-- 指定Servlet创建时机
1.第一次访问时创建 <load-on-startup>为负数
2.在服务器启动时创建 <load-on-startup>为0或正数
-->
<load-on-startup>0</load-on-startup>
</servlet>
Service
执行多次,刷新就多执行一次destory
服务器关闭,Servlet摧毁时执行,只执行一次,只有正常关闭时才执行。一般用于释放资源。
Servlet简便用法🌟
注解配置不用xml
JavaEE 新版本可以使用 注解进行配置,不需要xml文件
@WebServlet(urlPatterns = "/demo")
public class ServletAnnotation implements Servlet{}
使用Servlet继承类
GenericServlet
可以不用实现除service以外的方法,继承Servlet
实现类GenericServlet
,只需要实现service
方法,其他方法已经空实现
@WebServlet(urlPatterns = "/demo")
public class ServletAnnotation extends GenericServlet{
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("继承实现类GenericServlet父类");
}
}
HttpServlet
对http协议进行实现,对请求方式进行判断req.getMethod()
。实现doGet()
和 doPost()
方法,进行复写。