目录
创建Servlet
@WebServlet
Servlet的生命周期
认识和使用HttpServlet
Servlet是JavaEE的一个标准,他就像JDBC一样,由官方定义了一系列接口,而具体的实现由我们自己编写,最后交给Web服务器如Tomcat来运行我们编写的Servlet
Servlet的作用是实现动态网页相应,使用Servlet后,不再是直接由Tomcat服务器发送我们编写好的静态网页内容,而是由我们通过JAVA代码进行动态拼接,实现动态网页的返回
创建Servlet
前提:
- 安装idea专业版
- 在idea中配置好Tomcat
在idea中点击File->New Project,选择Jakarta EE,在application sever中选择配置好对应的Tomcat版本,点击next
系统会为我们自动生成Servlet的实现类
@WebServlet
为了将Servlet注册到Tomcat中,需要使用注解@WebServlet
@WebServlet的定义如下:
public @interface WebServlet {
String name() default "";
String[] value() default {};
String[] urlPatterns() default {};
int loadOnStartup() default -1;
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
- name属性就是Servlet的名称
- urlPatterns和value的功能相同,表示当前Servlet的访问路径:
@WebServlet("/test")
这个访问路径不仅仅可以是一个固定值,也可以使用通配符匹配:
@WebServlet("/test/*")
以上代码表示所有匹配 /test/随便什么 的路径名称都可以访问该Servlet
也可以使用扩展名称的匹配:
@WebServlet("*.js")
这样的话任何以.js结尾的文件,都会由我们自己定义的Servlet处理
当路径为“/”的时候,表示如果没有找到匹配当前访问路径的Servlet,就会使用该Servlet进行处理
此外,还可以为一个Servlet配置多个访问路径
@WebServlet("/test1","/test2")
- loadOnStartUp属性决定了是否在Tomcat启动时就加载此Servlet
默认情况下,Servlet只有在被访问时才会加载
当loadOnStartUp=-1(默认)时,表示不在启动时加载,当loadOnStartUp>0时,开启启动时加载,且数字的大小决定了此Servlet启动的优先级,数字越小启动的优先级越高
Servlet的生命周期
我们来看一下Servlet接口中存在的5个方法:
@WebServlet("/test")
public class TestServlet 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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 在首次启动服务器时,会先调用构造方法(如果有的话)
- 接着调用init方法, 进行Servlet初始化
- 初始化结束后,会调用service方法来处理客户端的请求
- 在关闭浏览器时,会调用destroy方法来销毁Servlet。
需要注意的是,尽管多次尝试去访问页面,init和构造方法都只会执行一次
而每次访问都会创建一个新的线程,去执行service方法,来处理用户的请求
我们注意到,service方法中传入了两个参数,分别为servletRequest和servletResponse
实际上,用户发起的HTTP请求被Tomcat服务器封装成了一个servletRequest对象,我们得到的是Tomcat服务器帮助我们创建的实现类,HTTP请求报文中的所有内容,都可以从servletRequest对象中获取
同理,servletResponse就是我们需要返回给浏览器HTTP响应报文实体类封装
认识和使用HttpServlet
我们知道,访问浏览器有很多不同的请求,例如GET、POST等,而HttpServlet
则是 Java Servlet API 中的一个抽象类,专门用于处理 HTTP 请求和响应
HttpServlet
提供了处理常见 HTTP 方法,如 GET
、POST
、PUT
、DELETE
等
httpServlet中最常用的方法:
doGet(HttpServletRequest request, HttpServletResponse response)
:处理 HTTPGET
请求doPost(HttpServletRequest request, HttpServletResponse response)
:处理 HTTPPOST
请求
而我们只需要继承httpServlet并重新doxxx方法,即可以处理http请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
response.getWriter().write("Hello, " + name);
}
重写了doGet方法后,在使用get方法访问浏览器后,会在浏览器中打印出hello和请求中的参数name对应的值