概念:
运行在服务端的小程序
其实是定义了一个Java类,可以被浏览器访问的规则 是一个接口
作用:
接收请求
处理请求
做成响应
1.创建web项目
2.新建一个类 实现Servlet接口
3.重写Servlet接口中的方法
4.配置Servlet WEB-INF/web.xml
<servlet>
<servlet-name>myServletservlet-name>
<servlet-class>com.edu.web.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>myServletservlet-name>
<url-pattern>/hellourl-pattern>
<url-pattern>/aa/bb/ccurl-pattern>
<url-pattern>/bbbburl-pattern>
servlet-mapping>
启动项目
打开浏览器进行访问
Servlet的创建 管理 和销毁
是由服务器来处理的 你只是使用
服务器通过反射创建servlet对象
再通过反射调用servlet中的方法
当服务器开启 会加载web.xml中的配置
生命周期:
一个事务从生到死所经历的阶段
创建---对外提供服务---销毁
在不同的阶段 就会调用不同的生命周期方法
Servlet对象创建好之后
当第一次请求时 会调用init()方法
一般会在该方法中做一些准备工作
当不断请求时 会调用service()方法
每次请求 都会执行
做核心的业务逻辑
当servlet对象销毁时 会调用destroy()方法
正常退出服务器
做一些善后工作
<welcome-file-list>
<welcome-file>code.jspwelcome-file>
welcome-file-list>
init()方法
当用户第一次请求时 才会调用
如果init()方法中的业务比较耗时
用户就需要等待半天 用户体验不好
为了让init()方法 能够在服务器开启时就执行
这样就能够提高用户的体验
可以配置init()方法的调用时机 让其提前加载
WEB-INF/web.xml
<servlet>
<load-on-startup>0load-on-startup>
servlet>
ServletConfig配置对象
由服务器创建 作为init()的形参 传递使用
查看Tomcat源码 找到ServletConfig接口的子类
配置对象中的几个方法:
<init-param>
<param-name>usernameparam-name>
<param-value>jackparam-value>
init-param>
getInitParameter(String name)
获取初始化值
getServletName()
获取Servlet的名字
getServletContext()
获取全局上下文对象
细节:
<init-param>必须在<load-on-startup>前面配置
方式一
创建一个类 实现servlet接口 重写5个抽象方法
方式二
创建一个类 继承GenericServlet类
重写service()
方式三: 最终版
创建一个类 继承HttpServlet类
重写doGet() doPost()
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;
}
}
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);
}
}


//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-INF/lib