列如:
每一个添加方法
BrandServletAdd
BrandSelectAll

非常的浪费资源
所以我们把每个方法都提取到一个类里面就想Mapper接口一样
public interface BrandMapper {
@Select("select * from tb_brand")
@ResultMap("brandResultMap")
List<Brand> selectAll();
@Insert("insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})")
void add(Brand brand);
@Select("select * from tb_brand where id = #{id}")
@ResultMap("brandResultMap")
Brand selectById(int id);
@Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName},ordered = #{ordered},description = #{description},status = #{status} where id = #{id}")
void Update(Brand brand);
@Delete("delete from tb_brand where id = #{id}")
void deleteById(int id);
}
所以我们可以换一种思路来写创建一个类继承
public class BaseServlet extends HttpServlet{}
把方法名字的路径和方法名字写成一样,方待会反射调用方法列如路径名字是selectAll
我们就可以把他当做方法名传给反射里面的 getMethod 就可获取到该方法
这样就不用创建过多的类了案列如下
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String s = req.getRequestURI();
int i = s.lastIndexOf("/");
String u = s.substring(i + 1);
Class<? extends BaseServlet> aClass = this.getClass();
try {
Method method = aClass.getMethod(u, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
以上是获取地址然后拆分获取到路径最后一位,就是方法名字啦
然后在设置一个类比如Brand继承着现在这个类
@WebServlet("/brand/*")
public class BrandServlet extends BaseServlet{
private BrandServletImpl bs = new BrandServletImpl();
public void selectAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Brand> brands = bs.selectAll();
String s = JSON.toJSONString(brands);
response.setContentType("text/json;charset=utf-8");
response.getWriter().write(s);
}
public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BufferedReader reader = request.getReader();
String s = reader.readLine();
System.out.println(s);
Brand brand = JSON.parseObject(s, Brand.class);
BrandServletImpl brandServlet = new BrandServletImpl();
brandServlet.add(brand);
response.getWriter().write("ok");
}
}
记住路径一定要 /brand/* 用通配符这样可以接收一切的路径
总结:每添加一个方法方法就要多添加一个servlet这样很浪费空间,所以我们要把所有方法放在一个类里面,用方法名来判断该用那个方法,这样提高了代码的复用性
本文介绍了一种优化Servlet的方法,通过创建一个基类`BaseServlet`,使用反射根据请求路径调用相应的方法,减少大量独立Servlet的创建。示例中展示了如何将Brand相关操作集中到一个Servlet中,提高代码复用性和效率。此外,还提到路径设置为`/brand/*`以接收不同请求。
395

被折叠的 条评论
为什么被折叠?



