需求:将什么AddServlet、SelectAllServlet。。。全部都写在一个servlet里面进行统一管理,以后访问需要的servlet的时候直接访问方法名。步骤:4步走
步骤一 ①新建一个BaseServlet
代码:
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.Method;
/**
* 替换 HttpServlet,根据请求的最后一段路径来进行方法分发
*/
public class BaseServlet extends HttpServlet {
// 根据请求的最后一段路径来进行方法分发
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取请求路径 "/brand-case/brand/selectAll"
String uri = req.getRequestURI();
// 2. 获取最后一段路径,方法名
int index = uri.lastIndexOf("/");
String methodName = uri.substring(index + 1); // selectAll
// 3. 执行方法
// 3.1 获取 BrandServlet / 字节码对象 Class
// 谁调用我(this 所在的方法),我(this)代表谁
// System.out.println(this); // BrandServlet
Class<? extends BaseServlet> cls = this.getClass();
// 3.2 获取方法 Method 对象,执行方法
try {
Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个servlet只需要复制即可,作为轮子来使用。如有异常直接抛出去
步骤二② 根据表建立相应的servlet。里面写上需要操作的servlet方法。
比如我操作的brand表,取名BrandServlet。路径访问就写@WebServlet(“/brand/*”)。这里管理所有有关brand表的servlet。比如现在我需要使用add和查询所有
import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import com.itheima.service.impl.BrandServiceImpl;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;
@WebServlet("/brand/*")
public class BrandServlet extends BaseServlet{
private BrandService brandService = new BrandServiceImpl();
/**
* 查询所有
* @param request
* @param response
* @throws IOException
*/
public void selectAll(){}
/**
* 新增数据
* @param request
* @param response
* @throws IOException
*/
public void add(){}
}
步骤三③写具体的servlet执行代码。
import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import com.itheima.service.impl.BrandServiceImpl;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;
@WebServlet("/brand/*")
public class BrandServlet extends BaseServlet{
private BrandService brandService = new BrandServiceImpl();
/**
* 查询所有
* @param request
* @param response
* @throws IOException
*/
public void selectAll(HttpServletRequest request, HttpServletResponse response){
}
/**
* 新增数据
* @param request
* @param response
* @throws IOException
*/
public void add(HttpServletRequest request, HttpServletResponse response){
}
}
每一个方法都传入
HttpServletRequest request, HttpServletResponse response
,这两个参数,这就是以前在dopost或者service里面的东西。现在,就可以在下面写代码了,以前的代码怎么写这个就怎么写。
import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import com.itheima.service.impl.BrandServiceImpl;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;
@WebServlet("/brand/*")
public class BrandServlet extends BaseServlet{
private BrandService brandService = new BrandServiceImpl();
/**
* 查询所有
* @param request
* @param response
* @throws IOException
*/
public void selectAll(HttpServletRequest request, HttpServletResponse response) throws IOException {
//1. 调用service进行查询
List<Brand> brands = brandService.selectAll();
//2. 转为json
String jsonString = JSON.toJSONString(brands);
//3. 防止乱码以及写数据
response.setContentType("text/json;charset=utf-8");
response.getWriter().write(jsonString);
}
/**
* 新增数据
* @param request
* @param response
* @throws IOException
*/
public void add(HttpServletRequest request, HttpServletResponse response) throws IOException {
BufferedReader br = request.getReader();
String params = br.readLine();//这个就是接收到的参数字符串
//转为brand
Brand brand = JSON.parseObject(params, Brand.class);
//调用service进行添加
brandService.add(brand);
//响应一个成功信号
response.getWriter().write("success");
}
}