篇【SSH進階之路】Struts基本原理 + 實現簡單登錄(二),我們介紹MVC和Struts的基本理論,並實現了一個簡單登錄的實例。從中我們知道了,Struts是MVC的框架,MVC其實是Model2,M代表了模型,我們可以理解爲業務邏輯,V代表了視圖,主要是界面顯示,使用jsp顯示,C代表控制,控制最典型方式是使用servlet,可以獲取參數,調用業務邏輯,另外還可以轉向其他界面。
經過對上篇博客的介紹,我們知道了Struts對MVC做了封裝,Struts到底是怎麼封裝的MVC,一直還沒有解決,從這篇博客開始,我們一步步重構MVC實現一個基本的Struts框架的雛形,幫助我們更深入的學習Struts的基本流程提供保證。下面我們開始。
我們嚴格按照上篇博客Model2的時序圖或如下圖,使用jsp+servlet來給大家演示一個簡單的MVC,一步步的重構,完善,把框架的一個實現給大家引出來。
假設是一個關於用戶的增、刪、改、查的功能,下面我們敲一下各部分的代碼。新建java web項目,test_struts1,如下圖:
首先,新建一個索引頁面,提供一個表單,僅僅提供一個用戶姓名,比如實現添加用戶功能,作爲主界面。
index.jsp
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
- <title>Insert title here</title>
- </head>
- <body>
- <form action="servlet/addUser.do" method="post">
- 姓名:<input type="text" name="username"><br>
- <input type="submit" value="提交"><br>
- </form>
- </body>
- </html>
C,控制器,使用Servlet來實現控制器的職責,取得表單數據,調用業務邏輯,轉向頁面。客戶端一點提交,提交到Servlet,代碼如下:
TestServlet.java
- package com.liang.servlet;
- import java.io.IOException;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * 使用servlet做相關的控制,轉向多個(V)視圖
- * @author liang
- *
- */
- public class TestServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //取得訪問的URI
- String reqeuestURI = request.getRequestURI();
- System.out.println(reqeuestURI);
- //截取URI,獲得路徑
- String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));
- System.out.println(path);
- //獲得表單數據
- String username = request.getParameter("username");
- UserManager userManager = new UserManager();
- String forward ="";
- //根據url執行相關的功能
- //等於添加,調用添加方法,添加成功轉到添加頁面
- if("/servlet/addUser".equals(path)){
- //調用添加的業務邏輯
- userManager.add(username);
- forward ="/add_success.jsp";
- //刪除,調用刪除方法,刪除成功轉到刪除
- }else if("/servlet/delUser".equals(path)){
- //調用刪除的業務邏輯
- userManager.del(username);
- forward ="/del_success.jsp";
- //修改,調用修改方法,修改成功轉到修改頁面
- }else if("/servlet/modifyUser".equals(path)){
- //調用修改的業務邏輯
- userManager.modify(username);
- forward ="/modify_success.jsp";
- //查詢,調用查詢方法,查詢成功轉到查詢成功頁面
- }else if("/servlet/queryUser".equals(path)){
- //調用查詢的業務邏輯
- List userList = userManager.query(username);
- request.setAttribute("userList", userList);
- forward ="/query_success.jsp";
- }else{
- throw new RuntimeException("請求失敗");
- }
- //統一完成轉向
- request.getRequestDispatcher(forward).forward(request, response);
- }
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- }
控制器需要調用業務邏輯和轉到相應頁面,給用戶提示一下,成功或失敗,代碼如下:
M,業務邏輯,我們完成增、刪、改、查的功能,不再操作數據庫,以控制檯打印信息的形式,做簡單的演示。
UserManager.java
- package com.liang.servlet;
- import java.util.ArrayList;
- import java.util.List;
- public class UserManager {
- //添加用戶
- public void add(String username){
- System.out.println("UserManager.add()-->>>username:" + username);
- }
- //刪除用戶
- public void del(String username){
- System.out.println("UserManager.del()-->>>username:" + username);
- }
- //修改用戶
- public void modify(String username){
- System.out.println("UserManager.modify()-->>>username:" + username);
- }
- //查詢用戶
- public List query(String username){
- System.out.println("UserManager.query()-->>>username:" + username);
- List userList = new ArrayList();
- userList.add("a");
- userList.add("b");
- userList.add("c");
- userList.add("d");
- return userList;
- }
- }
轉向頁面,添加成功jsp:
add_success.jsp
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
- <title>Insert title here</title>
- </head>
- <body>
- 添加成功!
- </body>
- </html>
刪除成功頁面和修改成功頁面同上,只有一句表示不同頁面。
查詢成功頁面,query_success.jsp
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
- <title>Insert title here</title>
- </head>
- <body>
- 查詢成功!
- <p></p>
- <%=request.getAttribute("userList") %>
- </body>
- </html>
配置信息web.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <!-- 配置TestServlet類 -->
- <servlet>
- <servlet-name>TestServlet</servlet-name>
- <servlet-class>com.liang.servlet.TestServlet</servlet-class>
- </servlet>
- <!-- 怎麼訪問,與jsp的action的路徑一致 -->
- <servlet-mapping>
- <servlet-name>TestServlet</servlet-name>
- <!-- 只要是.do請求都會到達servlet -->
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- </web-app>
如果你想訪問業務邏輯其他功能,只需要修改index.jsp中的action的值即可。到此爲止,我們實現了一個簡單的用於增刪改查用戶功能的MVC。
我們現在看一下上面TestServlet的代碼,有很多的問題:
1、所有的業務邏輯和跳轉路徑都耦合在TestServlet這個類裏面了。想添加其他需求,需要修改TestServlet,違反了開放封閉原則。
2、在Servlet裏面存在很多的if-else語句,if語句很不穩定,總需要改變。
假如要再添加一個查詢功能,需要修改servlet,添加一個if..else語句,太麻煩了,違反了開放封閉原則,擴展性一點都不好。
3、所有的轉向頁面都寫死了,顯示和控制分離,如果想換一個視圖,要修改代碼。
我們一步步將上面的問題都解決,最後實現Struts框架的雛形。下篇博客【SSH進階之路】一步步重構MVC實現Struts框架——封裝業務邏輯和跳轉路徑(四),首先解決我們的第一個問題。