2011-10-03 60 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