1. 程式人生 > >以使用者註冊功能模組為例淺談MVC架構下的JavaWeb開發流程

以使用者註冊功能模組為例淺談MVC架構下的JavaWeb開發流程

JavaWeb應用開發,撇開分散式不談,只討論一個功能服務應用的開發,無論是使用原生的Servlet/JSP方案,還是時下的SSM架構,都有一套經過工程實踐考驗的最佳實踐,這綜合考慮了團隊協作、專案管理、可用性等方方面面的問題。

一些約定

考慮到專案管理的方便,一般前端不能直接訪問到jsp頁面,而是必須通過Servlet來管理到Jsp頁面的跳轉

<li><a href="${pageContext.request.contextPath}/UserServlet?method=registUI">註冊</a></li>

在以上的超連結中,通過定位到繼承了BaseServlet類的UserServlet的registUI方法,來處理跳轉的功能。

public String registUI(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        return "/jsp/register.jsp";
    }

MVC架構下開發步驟

首先,以使用者註冊這一功能模組為例,其服務端的邏輯如圖所示:

一般來說,一個功能模組包括許多的業務功能點,比如使用者註冊,就包括使用者名稱校驗、註冊、傳送啟用郵件、傳送驗證簡訊等等具體的功能點。這些功能點就體現在不同Servlet(或者action或者Controller)的業務方法裡,而所用的方法又會呼叫到Service包和Dao包中的增刪改查原子方法。

根據服務端的執行邏輯,一般的開發流程包括

1. 頁面準備

包括表單屬性新增修改、拼接超連結、新增Ajax等

 1 <div class="col-md-8" style="background:#fff;padding:40px 80px;margin:30px;border:7px solid #ccc;">
 2         <font>會員註冊</font>USER REGISTER   
 3         <form class="form-horizontal" style="margin-top:5px;" action="${pageContext.request.contextPath}/UserServlet?method=userRegist" method=
"post"> 4 <div class="form-group"> 5 <label for="username" class="col-sm-2 control-label">使用者名稱</label> 6 <div class="col-sm-6"> 7 <input type="text" name="username" class="form-control" id="username" placeholder="請輸入使用者名稱"> 8 </div> 9 </div> 10 <div class="form-group"> 11 <label for="inputPassword3" class="col-sm-2 control-label">密碼</label> 12 <div class="col-sm-6"> 13 <input type="password" name="password" class="form-control" id="inputPassword3" placeholder="請輸入密碼"> 14 </div> 15 </div> 16 <div class="form-group"> 17 <label for="confirmpwd" class="col-sm-2 control-label">確認密碼</label> 18 <div class="col-sm-6"> 19 <input type="password" class="form-control" id="confirmpwd" placeholder="請輸入確認密碼"> 20 </div> 21 </div> 22 <div class="form-group"> 23 <label for="inputEmail3" class="col-sm-2 control-label">Email</label> 24 <div class="col-sm-6"> 25 <input type="email" name="email" class="form-control" id="inputEmail3" placeholder="Email"> 26 </div> 27 </div> 28 <div class="form-group"> 29 <label for="usercaption" class="col-sm-2 control-label">姓名</label> 30 <div class="col-sm-6"> 31 <input type="text" name="name" class="form-control" id="usercaption" placeholder="請輸入姓名"> 32 </div> 33 </div> 34 <div class="form-group opt"> 35 <label for="inlineRadio1" class="col-sm-2 control-label">性別</label> 36 <div class="col-sm-6"> 37 <label class="radio-inline"> 38 <input type="radio" name="sex" id="inlineRadio1" value="男" checked="checked">39 </label> 40 <label class="radio-inline"> 41 <input type="radio" name="sex" id="inlineRadio2" value="女">42 </label> 43 </div> 44 </div> 45 <div class="form-group"> 46 <label for="date" class="col-sm-2 control-label">出生日期</label> 47 <div class="col-sm-6"> 48 <input type="date" class="form-control" name="birthday" > 49 </div> 50 </div> 51 52 <div class="form-group"> 53 <label for="date" class="col-sm-2 control-label">電話</label> 54 <div class="col-sm-6"> 55 <input type="text" class="form-control" name="telephone" > 56 </div> 57 </div> 58 59 <div class="form-group"> 60 <label for="date" class="col-sm-2 control-label">驗證碼</label> 61 <div class="col-sm-3"> 62 <input type="text" class="form-control" > 63 </div> 64 <div class="col-sm-2"> 65 <img src="${pageContext.request.contextPath}/img/captcha.jhtml"/> 66 </div> 67 68 </div> 69 70 <div class="form-group"> 71 <div class="col-sm-offset-2 col-sm-10"> 72 <input type="submit" width="100" value="註冊" name="submit" border="0" 73 style="background: url('${pageContext.request.contextPath}/img/register.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0); 74 height:35px;width:100px;color:white;"> 75 </div> 76 </div> 77 </form> 78 </div>

2. 在對應的功能模組Servlet中,新增功能點的方法實現

可以通過添加註釋分解步驟,逐步完善業務程式碼邏輯。

 1 //使用者註冊模組的註冊功能點
 2     public String userRegist(HttpServletRequest request, HttpServletResponse response) throws Exception {
 3         // 接收表單引數
 4         Map<String, String[]> map = request.getParameterMap();
 5         //新建User物件
 6         User user = new User();
 7         //呼叫Utils的popultae方法為User物件賦值
 8         //MyBeanUtil封裝了Apache Common的BeanUtil方法, 添加了轉換時間格式的程式碼
 9         MyBeanUtils.populate(user, map);
10         // 為使用者的其他屬性賦值,如使用者編號, 狀態碼, 啟用碼
11         user.setUid(UUIDUtils.getId());
12         user.setState(0);
13         user.setCode(UUIDUtils.getCode());
14         System.out.println(user);
15 
16         /*
17          * //遍歷map中的資料 Set<String> keySet = map.keySet(); Iterator<String>
18          * iterator = keySet.iterator(); while(iterator.hasNext()){ String
19          * str=iterator.next(); System.out.println(str); String[] strs =
20          * map.get(str); for (String string : strs) {
21          * System.out.println(string); } System.out.println(); }
22          */
23 
24         // 註冊功能點封裝在業務層中
25         UserService UserService = new UserServiceImp();
26         try {
27             UserService.userRegist(user);
28             // 註冊成功,向用戶郵箱傳送資訊,跳轉到提示頁面
29             // 呼叫MailUtils方法, 傳送郵件
30             MailUtils.sendMail(user.getEmail(), user.getCode());
31             request.setAttribute("msg", "使用者註冊成功,請啟用!");
32 
33         } catch (Exception e) {
34             // 註冊失敗,跳轉到提示頁面
35             request.setAttribute("msg", "使用者註冊失敗,請重新註冊!");
36 
37         }
38         return "/jsp/info.jsp";
39     }

3. 完善Service包下的介面和實現類

UserService介面

1 public interface UserService {
2 
3     void userRegist(User user) throws SQLException;
4 
5 }

UserServiceImp介面實現類

 1 public class UserServiceImp implements UserService {
 2 
 3     @Override
 4     public void userRegist(User user) throws SQLException {
 5         
 6         //實現註冊功能
 7         UserDao UserDao=new UserDaoImp();
 8         UserDao.userRegist(user);
 9     }
10 
11 }

4. 完善Dao包下的介面和實現類

UserDao介面

1 public interface UserDao {
2 
3     void userRegist(User user) throws SQLException;
4 
5 }

UserDaoImp介面實現類

 1 public class UserDaoImp implements UserDao {
 2 
 3     @Override
 4     public void userRegist(User user) throws SQLException {
 5         String sql="INSERT INTO USER VALUES(?,?,?,?,?,?,?,?,?,?)";
 6         QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
 7         Object[] params={user.getUid(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),user.getCode()};
 8         qr.update(sql, params);
 9     }
10 
11 }

總結

基本上所有的基於MVC思想的架構開發,都可以遵循這樣的邏輯,來逐步完善應用程式碼。