package com.javabody.serclet;
import cn.hutool.core.util.StrUtil;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//父类
public class BaseServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
if (!(req instanceof HttpServletRequest &&
res instanceof HttpServletResponse)) {
throw new ServletException("non-HTTP request or response");
}
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
//解决中文乱码
//response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String servletPath = request.getServletPath();
String requestURI = request.getRequestURI();
String name = requestURI.replaceFirst(servletPath+"/",""); // /document/list null或"" "null"
if(StrUtil.isBlank(name)) {
response.sendError(500, "请求URL地址不正确!");
}
else {
Class<? extends BaseServlet> clazz = this.getClass();
try {
/*
1. getMethod(): 只能获取public的方法,包括从父类继承的public方法。
2. get【Declared】Method():可以获取类本身声明的所有方法,包括private、public、protected、default访问修饰的方法,但是不包括继承的方法。
函数式接口、Lambda表达式、Stream API JDK8新特性 好比 :ES6新语法
*/
Method method = clazz.getMethod(name,HttpServletRequest.class,HttpServletResponse.class);
method.setAccessible(true);
//使用反射动态调用处理请求的方法
method.invoke(this, request, response);
} catch (NoSuchMethodException e) {
e.printStackTrace(); // 打印异常堆栈信息
response.sendError(500,"没有找到指定的方法!");
} catch (InvocationTargetException e) {
e.printStackTrace(); // 打印异常堆栈信息
response.sendError(500,"调用处理请求的方法内部出现了异常!");
} catch (IllegalAccessException e) {
e.printStackTrace(); // 打印异常堆栈信息
response.sendError(500,"非法访问处理请求的方法!");
}
}
}
}
package com.javabody.serclet;
import com.javabody.util.JsonUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/document/*")
public class DocumentServlet extends BaseServlet {
public void list(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("查询资料列表请求!");
String pageNow = request.getParameter("pageNow");
String pageSize = request.getParameter("pageSize");
String title = request.getParameter("title");
String[] hobbies = request.getParameterValues("hobbies[]");
String json = """
{"pageNow":%s,"pageSize":%s,"title":%s,"hobbies":%s}
""".formatted(pageNow,pageSize,title,String.join(",",hobbies));
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("code",0);
resultMap.put("msg","操作成功");
resultMap.put("data",json);
JsonUtil.writeJson(resultMap,response);
}
public void add(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("添加资料!");
}
public void update(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("修改资料!");
}
public void delete(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("删除资料!");
}
public void sheny(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("审阅资料!");
}
}
package com.javabody.util;
import com.alibaba.fastjson2.JSON;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class JsonUtil {
/**
* 将json数据输出到客户端
* @param obj 传入对象
* @param response 响应数据
*/
public static void writeJson(Object obj, HttpServletResponse response) {
String json = JSON.toJSONString(obj);
response.setContentType("application/json;charset=utf-8");
PrintWriter out = null;
try {
out = response.getWriter();
out.write(json);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(out != null) {
out.close();
}
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<title></title>
</head>
<body>
<div>
<a href="/document/list">资料列表</a>
<a href="/document/add">发布资料</a>
<a href="/document/update">修改资料</a>
<a href="/document/delete">删除资料</a>
<a href="/document/sheny">审阅资料</a>
</div>
<script src="/static/js/jquery-3.7.1.js"></script>
<script>
$(function (){
$.ajax({
url:"/document/list", //后端服务请求URL地址 --- 接口地址
data:{ //发送给后端服务的数据
pageNow:1,
pageSize:15,
title:'java核心',
hobbies:['我的周末','想要周末','心好累啊']
},
dataType:'json', //服务器返回类型
async:true, //异步请求
type:'GET', //请求方式
success:function (res){
console.log(res)
},
error: function () {
console.log('Network Error!')
}
})
})
</script>
</body>
</html>