MVC 層在 Spring 的 AbstractController 類基礎上進行了繼承和重構,使整個框架僅使用單一的公共控制器,數據操作采用 Spring JdbcTemplate ,在邏輯層中直接集成了 Spring Jdbc 能力,可直接操作數據,表現層 Jstl ,除此之外,未定義任何的表單對象、數據庫表映射對象和其他 ORM 的配置文件,在保留對關鍵功能的集成度的基礎上技術入門度極低,重點關注業務功能和優化 SQL 語句 。
請求處理流傳如圖所示:
1)????? 用戶訪問 http://www.fyyk.com/a.do ;
2)????? Web 應用服務器(如 tomcat )解析擴展名為 *.do 的請求,通過 Spring 分發器 org.springframework.web.servlet.DispatcherServlet 讀取 servlet-do.xml 中的配置,將請求轉發給公共控制器類 LogicController.java ;
3)????? 公共控制器類 LogicController.java 根據 servlet-do.xml 文件中的配置信息調用 DoLogicImpl.java 類中相對應名稱的方法;
4)????? DoLogicImpl.java 類中的方法在處理完成業務邏輯后,將數據內容 ModelAndView 返回給公共控制器類 LogicController.java ;
5)????? 公共控制器類 LogicController.java 處理 ModelAndView 信息,執行 b.jsp 將結果數據顯示出來;
控制器類配置在
1)??? 繼承 AbstractController 類,便于調用應用環境的 Web 特性;
2)?? 只用控制器做請求的轉發,業務實現全部在邏輯層;
3)????? 采用反映射機制( reflect ),運行期調用邏輯類中的方法,而請求 URI 、邏輯類和方法名之間的對應關系只需要在 servlet-xxx.xml 中配置,這樣,控制器實現就只有唯一的一個類文件;
邏輯層類在
邏輯層類首先需要定義一個接口類,統一以 xxxLogic.java 命名,實現類命名為 xxxLogicImpl.java ,并繼承 JdbcDaoSupport 類,這樣邏輯類便具有了數據庫訪問能力。
邏輯類的方法如果被公共控制器類 LogicController.java 的反映射機制直接調用,則其接口類需要繼承空的公共接口類 BasicLogic ,定義方法時參數和返回值是固定的,如果是被其他邏輯類調用則不需要。
public ModelAndView initLogin(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext); |
控制器層直接將請求的
request
、
response
和
servletContext
全部傳遞過來交由邏輯層自由控制,對于
request
中的表單數據,未采用
SimpleFormController
的模式定義表單對象,建議手工獲取,從代碼量本身來將并不復雜,反而更加靈活。在業務處理完成后,必須構造一個
ModelAndView
對象,作為方法返回值回傳給控制器。
范例代碼如下:
public class AdminLogicImpl extends JdbcDaoSupport implements AdminLogic
{
public ModelAndView insertUser(HttpServletRequest request, HttpServletResponse response,
??? ServletContext servletContext) throws DataAccessException
??? {
?
????
??String userId = request.getParameter("userId");
?
????
??String userName = request.getParameter("userName");
?
????
??int age = Integer.parseInt(request.getParameter("age"));
?
????
??double weight = Double.parseDouble(request.getParameter("weight"));
?
????
??String sqlStr = "insert into testuser (userId,username,age,weight,updatetime) values (?,?,?,?,?)";
??
????
?Object[] object = new Object[]{userId, userName, age, weight, new Date()};
??
????
?getJdbcTemplate().update(sqlStr, object);
?
????
?Map<String, Object> model = new HashMap<String, Object>();
??
????
?model.put("msg", "
插入用戶成功!
");
???
????model.put("url", "pageForm.user");
??
????
?String view = "admin/message.jsp";
??
????
?return new ModelAndView(view, model);
??? }
} |
表現層采用 Jstl taglib 1.2 ,在 *.jsp 頁面中加入 taglib 引用即可使用 Jstl 標簽的大部分功能了,標簽的具體使用方法請參考相關文檔。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> |