“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来,容器将请求封装为servlet中的HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse返回给客户端的过程。
创建maven项目servlet,添加servlet-api依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
添加Web Framework并配置Tomcat容器
创建servlet包并新增HelloServlet 类实现Servlet接口,在service方法中向控制台打印访问信息
public class HelloServlet 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 {
System.out.println(this.getClass() + "被访问了!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
service方法就是专门用来处理请求和响应的
配置WEB-INF下的web.xml文件
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.lilith.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
<!--给servlet程序配置访问地址-->
<servlet-mapping>
<!--指定当前配置的地址给哪个servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet程序访问地址-->
<!--/表示在服务器解析时表示的地址为ip:port/工程路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
标签的作用:
启动配置的Tomcat,浏览器输入地址 http://localhost:8080/hello
servlet URL地址如何定位到Servlet程序去访问的?
客户端浏览器中的地址包含了以下信息
根据web.xml中配置的Servlet访问路径,客户端的请求地址与服务端设置的地址一致就可以实现客户端和服务端的通信,否则会报错404。
Servlet的生命周期主要包括
修改HelloServlet类
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("生命周期1-空参构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("生命周期2-init初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* service方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("生命周期3-service方法");
}
public void doGet(){}
public void doPost(){}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("生命周期4-destroy销毁方法");
}
}
重启Tomcat,浏览器输入地址 http://localhost:8080/hello
根据控制台输出的日志可以确定,Servlet声明周期中的1和2是在第一次访问Servlet程序时会调用,每次访问service方法都会触发生命周期3,当停止Web工程的时候会调用destroy方法
在index.jsp页面的body标签中增加form表单
<form action="/hello" method="get">
<input type="submit">
</form>
重新启动tomcat,浏览器访问 http://localhost:8080/hello, 点击页面的提交按钮,会访问HelloServlet的service方法,此时提交的请求时GET请求
修改form表单为post请求
HelloServlet类的service方法同样也被调用。此时请求方式为POST请求
可以确定service方法既可以处理GET请求也可以处理POST请求。
为了区分GET请求和POST请求,可以通过判断request中的请求方式,根据请求方式调用不同的方式处理。
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("生命周期3-service方法");
System.out.println(this.getClass() + "被访问了!");
HttpServletRequest request = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = request.getMethod();
System.out.println(method);
if ("GET".equals(method)){
doGet();
}else if ("POST".equals(method)){
doPost();
}
}
public void doGet(){
System.out.println("GET请求处理逻辑");
}
public void doPost(){
System.out.println("POST请求处理逻辑");
}
重启Tomcat,进入首页点击提交POST请求
调用了专门处理POST请求的方法
将form表单请求方式改为get,重新启动Tomcat,进入首页再次点击提交GET请求
根据页面的输出可以确定调用专门处理GET请求的方法,通过这种方式可以有效的区分GET请求和POST请求。
自定义Servlet陈旭除了直接实现Servlet接口外,还可以通过继承HttpServlet类;HttpServlet类实现了Servlet接口的方法,自定义Servlet程序继承HttpServlet可以选择重写HttpServlet中的方法
在controller包下新增HiServlet并继承HttpServlet,重写doGet和doPost方法
public class HiServlet extends HttpServlet {
/**
* get请求时调用该方法
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(this.getClass() + "的GET请求的处理方法被调用");
}
/**
* post请求时调用该方法
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(this.getClass() + "的POST请求的处理方法被调用");
}
}
在web.xml中配置HiServlet的访问路径
<servlet>
<servlet-name>HiServlet</servlet-name>
<servlet-class>com.lilith.servlet.HiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HiServlet</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
修改index.jsp页面的表单提交的地址为HiServlet的访问路径
<form action="/hi" method="get">
<input type="submit">
</form>
重启tomcat,浏览器进入index.jsp页面
修改请求方式为post