java中利用反射编写通用servlet

    xiaoxiao2023-03-24  3

           在用户模块开发中,我们发现用传统的开发方式开发,这样会导致一个请求对应一个servlet:这样会导致这个开发模块中的servlet过多,那能不能做一个处理?从而让一个模块使用一个servlet呢?下面我们通过两个案例来分析一下。

    用户模块功能:

    注册:http://localhost:8080/store/UserServlet?method=regist

    登陆:http://localhost:8080/store/UserServlet?method=login

    激活:http://localhost:8080/store/UserServlet?method=active

    查询商品模块功能:(只列举几个方法来作为例子)

    查询所有的商品:http://localhost:8080/store/ProductServlet?method=findAll

    查询某个分类的商品:http://localhost:8080/store/ProductServlet?method=findById

    传统方式:

    用户代码UserServlet:

    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp){ // 接收参数(method后所跟的方法名称) String methodName = request.getParameter(“method”); //根据方法名称,执行相应的方法。 if(“regist”.equals(methodName)){ regist(req,resp); }else if(“login”.equals(methodName)){ login(req,resp); } } public void regist(HttpServletRequest req,HttpServletResponse resp){ //跳转到相应的jsp页面 return “/regist.jsp”; } public void login(HttpServletRequest req,HttpServletResponse resp){ //跳转到相应的jsp页面 return “/login.jsp”; } } </span> 查询商品代码ProductServlet:

    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class ProductServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp){ // 接收参数: String methodName = request.getParameter(“method”); //根据方法名称,执行相应的方法。 if(“findAll”.equals(methodName)){ findAll(req,resp); }else if(“findById”.equals(methodName)){ findById(req,resp); } } //跳转到相应的jsp页面 public void findAll(HttpServletRequest req,HttpServletResponse resp){ } //跳转到相应的jsp页面 public void findById(HttpServletRequest req,HttpServletResponse resp){ } } </span>         通过上面的两个servlet我们可以发现,两个servlet之间有很多的相同的地方,那我们能不能抽取出一个相同的servlet从而简化代码呢?在这里我们可以通过反射来实现我们的目的。

    下面我们还是通过一个案例来介绍:

    通用servlet:BaseServlet

    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class BaseServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp){ //获得传递过来的方法名称 String methodName = request.getParameter(“method”); // 获得Class,其中的this是指继承BaseServlet类的子类 Class clazz = this.getClass(); //获得方法对象 Method method = clazz.getMethod(methodName,HttpServletRequest.class,Ht,tpSerlvetResponse.class); •//执行相应的方法 String path = (String)method.invoke(this,req,resp); if(path != null){ req.getRequestDispatcher(path).forward(req,resp); } } } </span> 继承了BaseServlet的UserServlet代码:

    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserServlet extends BaseServlet { public String regist(HttpServletRequest req,HttpServletResponse resp){ //跳转到相应的jsp页面 return “/login.jsp”; } public String login(HttpServletRequest req,HttpServletResponse resp){ //跳转到相应的jsp页面 return “/index.jsp”; } } </span> 继承了BaseServlet的ProductServlet代码:

    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class ProductServlet extends BaseServlet{ public String findAll(HttpServletRequest req,HttpServletResponse resp){ } public String findById(HttpServletRequest req,HttpServletResponse resp){ } } </span>       我们通过将两个案例比较可以发现利用反射可以提高我们的代码利用率,同时可以更加方便的操作代码,但是反射也有它的不足,就是将代码复杂化了,从而降低了软件的性能,所以对于反射我们要灵活的使用它。

    转载请注明原文地址: https://ju.6miu.com/read-1201297.html
    最新回复(0)