package cn.itcast.travel.web.servlet;
// 升级版
/*
* 思路:
* 得到方法名称, 是否可以通过反射来调用方法?
* 步骤:
* 1. 得到方法名, 通过方法名再得到 Method 类的对象
* 2. 需要得到 class, 然后调用它的方法进行查询! 得到 Method
* 3. 我们要查询的是当前类的方法, 所以我们需要得到当前类的 Class
*/
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
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 abstract class BaseServlet extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//完成方法分发
//1.获取请求路径
String uri=req.getRequestURI();
System.out.println("请求你url:"+uri);
//2.获取方法名称
String methodName=uri.substring(uri.lastIndexOf('/')+1);
System.out.println("方法名称:"+methodName);
//3.获取方法对象Method
//谁调用我?我代表谁
System.out.println(this);
//获取方法
try {
Method method =this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
//执行方法
//暴力反射
//method.setAccessible
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 直接将传入的对象序列化为json,并且写回客户端。
* @param obj
*/
//序列化json:
public void writeValue(Object obj,HttpServletResponse response){
//2.序列化JSON返回
ObjectMapper mapper=new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
try {
mapper.writeValue(response.getOutputStream(),obj);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 将传入的对象序列化为json,返回给调用处。
* @param obj
* @return
*/
public String writeValueAsString(Object obj) throws JsonProcessingException {
ObjectMapper mapper=new ObjectMapper();
return mapper.writeValueAsString(obj);
}
}
Servlet---BaseServlet(完成方法分发)
最新推荐文章于 2022-06-28 18:09:27 发布