2011-10-03 72 views
1

我知道有很多方法使用java-ee設計web應用程序,但似乎對我最有意義的方法是模型2或mvc,我們將代碼和設計分隔成servlet和jsp頁面。適當的模型2設計

基於我所做的研究,正確的方法是通過一個servlet訪問一個頁面,然後將用戶指向正確的方向,但我很難將這個想法包裹在我的腦海中,所以請告訴如果這個真實世界的例子讓我感覺實際的模型2。

說我有一個網站,主頁是登錄。所以這裏用戶會去www.mysite.com/Login(其中Login是servlet的名稱)。這個servlet可能是這個樣子:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    HttpSession session = request.getSession(); 

    if(request.getParameter("username") != null && request.getParameter("password") != null){ 

     User user = new User(); 
     user.setUsername(request.getParameter("username")); 

     try { 
      user.setPassword(com.portraitcreationsnc.services.EncryptionService.getInstance().encrypt(request.getParameter("password"))); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      if(!user.userExist(user)){ //No Match. 
       String errMessage = "You have entered an invalid Username/Password combination."; //Error Message 
       request.setAttribute("message", errMessage); 
       request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); 
       System.out.println("Login Error"); 
      } else { 
       //Match found. 
       session.setAttribute("user", user); 

       System.out.println("User Login Successful"); 
       pageForward(request, response); 
      } 
     } catch (SQLException e) { 
      throw new ServletException("DB error ", e); 
     } 

    }else{ 
     if(session.getAttribute("user") == null){ 
      request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); 
     }else{ 
      //User already logged in. Send to home. 
      response.sendRedirect("Welcome"); 
     } 
    } 
} 

private void pageForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
    response.sendRedirect("Welcome"); 
} 

主要這裏的想法是,在servlet負載最初並檢查它是否具有requestParameters的。如果不是這樣,它重定向到的login.jsp這可能看起來像:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<!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=UTF-8"> 
<title>Login</title> 
</head> 
<body> 
<h3>Simple Login</h3> 
<form action="LoginAuth" method="post"> 
Username <input type="text" name="username"> 
Password <input type="password" name="password"> 
<button type="submit">Login</button> 
</form> 
<% 
Object errMessage = request.getAttribute("message"); 
if(errMessage != null){ 
out.println(request.getAttribute("message")); 
out.println("<br>"); 
} 
%> 

<br> 
If you do not have a username, <a href="register.html">click here to register.</a> 
</body> 
</html> 

這反過來將當表單提交,servlet將識別請求數據,並與檢查進行再次調用servlet用戶針對數據庫等等等等。

似乎有些後退不只是首先加載jsp,但在其他情況下,首先加載servlet更有意義。我所做的研究得出的結論是,對於模型2,您應該幾乎完全不會調用jsp頁面,而是將所有鏈接指向將用戶傳遞給jsp的servlet。我的設計是完成這個的正確方法嗎?

+0

在一個偏離主題的筆記中,這是一個地方的很多代碼,相對於它實際做的相對較高的圈複雜度 - 很難測試和推理。 –

回答

0

你說得對。請注意,您最初可能指向另一個servlet(我們稱之爲LoginDisplay),該servlet將僅發送給登錄JSP。 JSP將提交給LoginAuth servlet,該servlet期望所有必需的參數都在那裏。

如果你想使用這樣的模型,不要重新發明輪子。有很多框架已經實現了這個模型,並提供了其他有用的服務:Stripes,Spring MVC,Struts等等。

+0

謝謝。無論如何,我很高興知道我在正確的道路上。我計劃研究Spring和/或Struts,但我是Java-EE的新手,希望一次一步。 – ryandlf