一、web.xml中有关servlet的配置
web.xml中Servlet的定义主要有两部分:
- servlet:定义servlet名字与Servlet接口的实现类名,访问对应映射中的url时执行该类的service方法
- servlet-mapping:servlet名字与访问url,形成一个映射,通过浏览器访问时使用此路径,本文使用的默认工程路径为:http://localhost:8080/myWeb/,则访问时使用:http://localhost:8080/myWeb/ms(/hs为映射中设置的路径)
xml定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet> <!--servlet名字与类名(实现Servlet接口),访问对应映射中的url时执行该类的service方法-->
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.my.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping> <!--自定义servlet名字与访问url,形成一个映射-->
<servlet-name>MyServlet</servlet-name>
<url-pattern>/ms</url-pattern> <!--代表资源路径-->
</servlet-mapping>
<servlet>
<servlet-name>MyHttpServlet</servlet-name>
<servlet-class>com.my.servlet.MyHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyHttpServlet</servlet-name>
<url-pattern>/mhs</url-pattern>
</servlet-mapping>
</web-app>
二、自定义servlet类
1.直接实现Servlet接口
实现所有抽象方法(init,service,destroy等方法),显式定义无参构造器
package com.my.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 功能描述
*
* @author yunweixiaocai
* @since 2021-06-25
*/
public class MyServlet implements Servlet {
// 自定义方法返回访问次数
private static int times= 1;
private static void printGoTimes(){
System.out.print("第"+times+"次访问----");
}
public MyServlet() {
printGoTimes();
System.out.println("执行构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
printGoTimes();
System.out.println("执行init方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
printGoTimes();
times++;
System.out.println("执行service方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
printGoTimes();
System.out.println("执行destroy方法");
}
}
浏览器输入url:http://localhost:8080/myWeb/ms,四次访问后返回:
[2021-06-25 11:37:09,609] Artifact myWebApplication:war exploded: Artifact is deployed successfully
[2021-06-25 11:37:09,609] Artifact myWebApplication:war exploded: Deploy took 567 milliseconds
第1次访问----执行构造器方法
第1次访问----执行init方法
第1次访问----执行service方法
第2次访问----执行service方法
第3次访问----执行service方法
第4次访问----执行service方法
初次访问时,实例化该类,构造方法与init只执行一次,service方法执行多次。
通过getMethod()方法获取请求方式:
页面myHtml.html实现post:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/myWeb/hs" method="post">
<input type="submit" value="转到hs" />
</form>
</body>
</html>
使用上面的类改写service方法,通过service方法的第一个参数servletRequest可获得请求方式,实例代码如下
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
printGoTimes();
times++;
HttpServletRequest hsr = (HttpServletRequest)servletRequest;
String method = hsr.getMethod();
System.out.println(method);
if ("get".toUpperCase().equals(method)) {
System.out.println("get请求执行service方法");
}else if("post".toUpperCase().equals(method)){
System.out.println("post请求执行service方法");
}
}
点击按钮后输出:
第1次访问----执行构造器方法
第1次访问----执行init方法
第1次访问----执行service方法
POST
post请求执行service方法
2.生产常用方式,继承HttpServlet类
定义页面myHtml.html放在web目录下,实现不同的请求方式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/myWeb/hs" method="post">
<input type="submit" value="postBtn" />
</form>
<form action="http://localhost:8080/myWeb/hs" method="get">
<input type="submit" value="getBtn" />
</form>
</body>
</html>
页面显示如下:
根据重写方法执行对应请求的执行代码
代码示例:
package com.my.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println("doGetting");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
System.out.println("doPosting");
}
}
分别点击postBtn和getBtn后,输出:
doPosting
doGetting
三、idea中创建servlet类
包右键–>new->Create New Servlet
创建后,web.xml中自动定义一个servlet,需手动添加映射
默认类:
package com.my.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}