使用注解方式创建Servlet类,doGet
方法转向doPost
方法
@WebServlet("/svc/*")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
doPost
方法接收HttpServletRequest
, HttpServletResponse
两个参数,无返回值,可以用BiConsumer
接收
通过Map建立字符串到方法的映射
private Map<String, BiConsumer<HttpServletRequest, HttpServletResponse>> routerMap = new HashMap<>();
@Override
public void init() throws ServletException {
routerMap.put("test", this::test);
routerMap.put("login", this::login);
routerMap.put("route1", this::route1);
routerMap.put("route2", this::route2);
}
对req
和resp
进行编码和格式设置
获取请求的地址并截去公共部分字符串
用所获得的字符串从Map中获取到实际处理请求的方法并执行
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
String route = req.getRequestURI().substring(5);
BiConsumer<HttpServletRequest, HttpServletResponse> router = routerMap.get(route);
if (router == null) router = (request, response) -> System.out.println("no route to" + route);
router.accept(req, resp);
}
像写正常的doPost
方法一样写处理请求的方法
public void test(HttpServletRequest req, HttpServletResponse resp) {
req.getParameterMap().forEach((k, v) -> System.out.println(k));
try {
resp.getWriter().print("{\"result\":\"hello\"}");
} catch (IOException e) {
e.printStackTrace();
}
}
public void login(HttpServletRequest req, HttpServletResponse resp) {
// ...
}
// ...
}