文章目录
Servlet
概念:
运行在服务端的小程序
其实是定义了一个Java类,可以被浏览器访问的规则 是一个接口
作用:
接收请求
处理请求
做成响应
Servlet的快速入门
1.创建web项目
2.新建一个类 实现Servlet接口
3.重写Servlet接口中的方法
4.配置Servlet WEB-INF/web.xml
<servlet>
<!-- 配置servlet名称 自己起一个-->
<servlet-name>myServlet</servlet-name>
<!-- 配置Servlet的 全路径 -->
<servlet-class>com.edu.web.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<!-- 配置servlet的映射路径,注意前面的斜杠不要少了
可以是多级目录 一个Servlet可以配置多个映射路径 -->
<url-pattern>/hello</url-pattern>
<url-pattern>/aa/bb/cc</url-pattern>
<url-pattern>/bbbb</url-pattern>
</servlet-mapping>
启动项目
打开浏览器进行访问
Servlet原理
Servlet的创建 管理 和销毁
是由服务器来处理的 你只是使用
服务器通过反射创建servlet对象
再通过反射调用servlet中的方法
当服务器开启 会加载web.xml中的配置
Servlet生命周期方法
生命周期:
一个事务从生到死所经历的阶段
创建---对外提供服务---销毁
在不同的阶段 就会调用不同的生命周期方法
Servlet对象创建好之后
当第一次请求时 会调用init()方法
一般会在该方法中做一些准备工作
当不断请求时 会调用service()方法
每次请求 都会执行
做核心的业务逻辑
当servlet对象销毁时 会调用destroy()方法
正常退出服务器
做一些善后工作
配置欢迎页面
<welcome-file-list>
<welcome-file>code.jsp</welcome-file>
</welcome-file-list>
用户体验问题load-on-startup
init()方法
当用户第一次请求时 才会调用
如果init()方法中的业务比较耗时
用户就需要等待半天 用户体验不好
为了让init()方法 能够在服务器开启时就执行
这样就能够提高用户的体验
可以配置init()方法的调用时机 让其提前加载
WEB-INF/web.xml
<servlet>
<!-- 配置Servlet创建时机
默认值是-1
配置成非负的值 就会在服务器开启时
就会创建Servlet对象
数字越小 优先级越高
-->
<load-on-startup>0</load-on-startup>
</servlet>
ServletConfig配置对象
ServletConfig配置对象
由服务器创建 作为init()的形参 传递使用
查看Tomcat源码 找到ServletConfig接口的子类
配置对象中的几个方法:
<!-- 配置初始化参数 -->
<init-param>
<param-name>username</param-name>
<param-value>jack</param-value>
</init-param>
getInitParameter(String name)
获取初始化值
getServletName()
获取Servlet的名字
getServletContext()
获取全局上下文对象
细节:
<init-param>必须在<load-on-startup>前面配置
创建Servlet的几种方式
方式一
创建一个类 实现servlet接口 重写5个抽象方法
方式二
创建一个类 继承GenericServlet类
重写service()
方式三: 最终版
创建一个类 继承HttpServlet类
重写doGet() doPost()
实现servlet接口
public class HelloServlet implements Servlet {
private ServletConfig servletConfig;
public HelloServlet() {
System.out.println("Servlet构造方法调用了");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
//来获取 web.xml中配置的初始化参数
String username = servletConfig.getInitParameter("username");
String password = servletConfig.getInitParameter("password");
System.out.println(username + "====" + password);
//获取Servlet的名字
String servletName = servletConfig.getServletName();
System.out.println(servletName);
//org.apache.catalina.core.StandardWrapperFacade@2983b225
System.out.println("ServletConfig 配置对象:" + servletConfig);
System.out.println("默认情况下 当第一次请求时 会调用init()方法");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service()方法 每次请求 都会执行");
//来获取 web.xml中配置的初始化参数
//通过全局变量来获取
//String username = servletConfig.getInitParameter("username");
//String password = servletConfig.getInitParameter("password");
//通过方法来获取
ServletConfig servletConfig = this.getServletConfig();
String username = servletConfig.getInitParameter("username");
String password = servletConfig.getInitParameter("password");
System.out.println(username + "====" + password);
}
@Override
public void destroy() {
System.out.println("destroy()方法 正常退出服务器 做一些善后工作");
}
//获取 ServletConfig 配置对象
@Override
public ServletConfig getServletConfig() {
return this.servletConfig; //返回配置对象
}
//获取Servlet的版本,以及作者,没啥用处,但是你得空实现
@Override
public String getServletInfo() {
return null;
}
}
创建Servlet最终版
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Post请求来了");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Get请求来了");
//注意加上这行
this.doPost(req, resp);
}
}
idea快捷创建Servlet(代码模板)
注解方式
//urlPatterns="/hehe" 配置Servlet的映射路径
//value="/haha" 配置Servlet的映射路径
//urlPatterns={"/hehe","/haha"} 配置多个映射路径
@WebServlet(name = "MyServlet2")
public class MyServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
web工程jar包的位置
WEB-INF/lib