【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)

来源:互联网 发布:未授权域名 编辑:程序博客网 时间:2024/06/05 08:02

目录:

      【SSH进阶之路】Struts基本原理 + 实现简单登录(二)

      【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)

      【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)

      【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉逻辑判断(五)

      【SSH进阶之路】一步步重构MVC实现Struts框架——完善转向页面,大功告成(六)

 

       Struts的第二篇博客【SSH进阶之路】Struts基本原理 + 实现简单登录(二),我们介绍了MVC和Struts的基本理论,上篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三),我们实现了一个MVC模型,这篇博客我们解决一下上篇博客留下的第一个问题:封装业务逻辑和跳转路径。

       我们先回顾一下上篇博客中的TestServlet的代码:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.liang.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.List;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10. /** 
  11.  * 使用servlet做相关的控制,转向多个(V)视图 
  12.  * @author liang 
  13.  * 
  14.  */  
  15. public class TestServlet extends HttpServlet {  
  16.   
  17.     @Override  
  18.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         //取得访问的URI  
  21.         String reqeuestURI = request.getRequestURI();  
  22.         System.out.println(reqeuestURI);  
  23.         //截取URI,获得路径  
  24.         String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));  
  25.         System.out.println(path);  
  26.         //获得表单数据  
  27.         String username = request.getParameter("username");  
  28.           
  29.         UserManager userManager = new UserManager();  
  30.           
  31.         String forward ="";  
  32.         //根据url执行相关的功能  
  33.         //等于添加,调用添加方法,添加成功转到添加页面  
  34.         if("/servlet/addUser".equals(path)){  
  35.             //调用添加的业务逻辑  
  36.             userManager.add(username);  
  37.             forward ="/add_success.jsp";  
  38.             //删除,调用删除方法,删除成功转到删除  
  39.         }else if("/servlet/delUser".equals(path)){  
  40.             //调用删除的业务逻辑  
  41.             userManager.del(username);  
  42.             forward ="/del_success.jsp";  
  43.         //修改,调用修改方法,修改成功转到修改页面  
  44.         }else if("/servlet/modifyUser".equals(path)){  
  45.             //调用修改的业务逻辑  
  46.             userManager.modify(username);  
  47.             forward ="/modify_success.jsp";  
  48.         //查询,调用查询方法,查询成功转到查询成功页面  
  49.         }else if("/servlet/queryUser".equals(path)){  
  50.             //调用查询的业务逻辑  
  51.             List userList = userManager.query(username);  
  52.             request.setAttribute("userList", userList);  
  53.             forward ="/query_success.jsp";  
  54.         }else{  
  55.             throw new RuntimeException("请求失败");  
  56.         }  
  57.         //统一完成转向  
  58.         request.getRequestDispatcher(forward).forward(request, response);  
  59.     }  
  60.   
  61.     @Override  
  62.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
  63.             throws ServletException, IOException {  
  64.         doGet(request,response);  
  65.     }  
  66.   
  67. }  

       

       从TestServlet中我们发现,它就是一个简单的Servlet,它是Struts的前端控制器,负责把所有的URL截取下来,通过IF语句根据URL的不同执行相关的功能,并且添加,删除,修改和查询各自有各自的业务逻辑和跳转路径,我们可以各自的业务逻辑和跳转路径封装成不同的类,并抽象出一个公共接口,如下所示:




下面,我们看一下接口和实现类的代码:


接口Action

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.liang.servlet;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. public interface Action {  
  7.       
  8.     public String execute(HttpServletRequest req, HttpServletResponse resp)  
  9.     throws Exception;  
  10. }  

添加用户AddUserAction

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.liang.servlet;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. public class AddUserAction implements Action {  
  7.   
  8.     @Override  
  9.     public String execute(HttpServletRequest req, HttpServletResponse resp)  
  10.             throws Exception {  
  11.         //获取参数  
  12.         String username = req.getParameter("username");  
  13.           
  14.         UserManager userManager = new UserManager();  
  15.         //调用业务逻辑  
  16.         userManager.add(username);  
  17.         //返回跳转页面  
  18.         return "/add_success.jsp";  
  19.     }  
  20.   
  21. }  

删除用户DelUserAction

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.liang.servlet;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. public class DelUserAction implements Action {  
  7.   
  8.     @Override  
  9.     public String execute(HttpServletRequest req, HttpServletResponse resp)  
  10.             throws Exception {  
  11. <span style="white-space:pre">        </span>//获取参数  
  12.         String username = req.getParameter("username");  
  13.           
  14.         UserManager userManager = new UserManager();  
  15.         //调用业务逻辑  
  16.         userManager.del(username);  
  17.         //返回跳转页面  
  18.         return "/del_success.jsp";  
  19.     }  
  20.   
  21. }  

修改用户ModifyUserAction

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.liang.servlet;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. public class ModifyUserAction implements Action {  
  7.   
  8.     @Override  
  9.     public String execute(HttpServletRequest req, HttpServletResponse resp)  
  10.             throws Exception {  
  11.         //获取参数  
  12.         String username = req.getParameter("username");  
  13.   
  14.         //调用业务逻辑  
  15.         UserManager userManager = new UserManager();  
  16.   
  17.         userManager.modify(username);  
  18.         //返回跳转页面  
  19.         return "/modify_success.jsp";  
  20.     }  
  21.   
  22. }  

查询用户QueryUserAction

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.liang.servlet;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. public class QueryUserAction implements Action {  
  9.   
  10.     @Override  
  11.     public String execute(HttpServletRequest req, HttpServletResponse resp)  
  12.             throws Exception {  
  13.         //获取参数  
  14.         String username = req.getParameter("username");  
  15.           
  16.         //调用业务逻辑  
  17.         UserManager userManager = new UserManager();  
  18.   
  19.         List userList = userManager.query(username);  
  20.         req.setAttribute("userList", userList);  
  21.       
  22.         userManager.query(username);  
  23.         //返回跳转页面  
  24.         return "/query_success.jsp";  
  25.     }  
  26.   
  27. }  

我们再对比看一下我们封装之后的TestServlet

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.liang.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import com.liang.action.Action;  
  10. import com.liang.action.AddUserAction;  
  11. import com.liang.action.DelUserAction;  
  12. import com.liang.action.ModifyUserAction;  
  13. import com.liang.action.QueryUserAction;  
  14. /** 
  15.  * 使用servlet做相关的控制,转向多个(V)视图 
  16.  * @author liang 
  17.  * 
  18.  */  
  19. public class TestServlet extends HttpServlet {  
  20.   
  21.     @Override  
  22.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.         //取得访问的URI  
  25.         String reqeuestURI = request.getRequestURI();  
  26.         System.out.println(reqeuestURI);  
  27.         //截取URI,获得路径  
  28.         String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));  
  29.         System.out.println(path);  
  30.           
  31.         Action action = null;  
  32.         //等于添加,调用AddUserAction  
  33.         if ("/servlet/addUser".equals(path)) {  
  34.             action = new AddUserAction();  
  35.         //等于删除,调用DelUserAction  
  36.         }else if ("/servlet/delUser".equals(path)) {  
  37.             action = new DelUserAction();  
  38.         //等于修改,调用ModifyUserAction  
  39.         }else if ("/servlet/modifyUser".equals(path)) {  
  40.             action = new ModifyUserAction();  
  41.         //等于查询,调用QueryUserAction  
  42.         }else if ("/servlet/queryUser".equals(path)) {  
  43.             action = new QueryUserAction();  
  44.         }else {  
  45.             throw new RuntimeException("请求失败");  
  46.         }  
  47.         String forward = null;  
  48.         //返回不同的转向页面  
  49.         try {  
  50.             forward = action.execute(request, response);  
  51.         } catch (Exception e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.         //根据路径,统一完成转向  
  55.         request.getRequestDispatcher(forward).forward(request, response);  
  56.     }  
  57.   
  58.     @Override  
  59.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
  60.             throws ServletException, IOException {  
  61.         doGet(request,response);  
  62.     }  
  63.   
  64. }  

      通过对比,我们可以发现简单了很多,但是实现的道理基本一样,仍然是将path截取出来,做相应的判断,进入对应的分支,New一个刚写的Action,New谁调谁,但是此时仅仅是完成了功能,系统并不灵活,IF...ELSE并没有去掉,扩展性不好,不能适用需求。


      下篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉判断逻辑(五),我们解决第二个问题:IF...ElSE的问题。


       源码下载

0 0
原创粉丝点击