Java Model - View - Control:
Architecture, Design, & Implementation

 

Architecture

Context

M - V - C

Layers: Servlet Engine

Layers: Enterprise System

M -  V - C Navigation: Basic

M -  V - C Navigation: Layered
 

Design

Views

Separate Components

Multiple Implementation Choices

Data Passed To Them, Not Generated

Often Include a Form
 

Control

Navigation, Link Between Views and Models

Patterned, Best Practices Structure

Core Function

Multiple Implementation Choices (Frameworks)

Model

Provide Semantic Processing, or Interface to Such

Perform Function or Pass to Semantic Process or Storage Component

Verify Results of Processing

Return Results

Implementation Choices

Implementation

Views

Implement (Separate) Components, Using Appropriate Technology (e.g., Java POJO, JSP, etc.)

Navigated to from Control

In Servlet Context, Provide any Necessary HTTP Header Parameters.

Render Results (e.g., Generate HTML for Form, Report, or Display).

Example, Using JSP:


<html>

<head>

<%@ page 
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>

<%! String projectName = jbs.eb2cbasicjsp.util.Context.getProjectName(); %>

<META http-equiv='Content-Style-Type' content='text/css'>
<LINK href='/<%= projectName %>/theme/Master.css' rel='stylesheet' type='text/css'>

<title>eb2cbasicjsp login</title>

</head>

<jsp:useBean id="beanUser" scope="request" class="jbs.eb2cbasicjsp.databean.BeanUser"/>

<body>

<h1>Welcome to MyStore</h1>

<h3>Please Login</h3>
		
<form action='/<%= projectName %>/servlet/jbs.eb2cbasicjsp.control.ControlSwitch' method='post'>

<INPUT type='hidden' name='source' value='login'/>

<table cellpadding='0' cellspacing='0' width='100%' border='0'>

<TBODY>
		
<tr>
<td align='right' width='20%'><b>Email: </b></td>
<TD align='left' width='60%'>
<INPUT type='text' name='email' value='
<jsp:getProperty name='beanUser' property='email'/>
' size='20'>
</TD>
</tr>

<tr>
<td align='right' width='20%'><b>Password: </b></td>
<TD align='left' width='60%'>
<INPUT type='password' name='password' value='
<jsp:getProperty name='beanUser' property='password'/>
' size='20'>
</TD>
</tr>

<tr>
<td align='left' width='20%'> </td>
</tr>

<tr>
<td align='right' width='20%'></td>
<td align='left' width='60%'>
<INPUT type='submit' name='userAction' value='Login' style='background-color: rgb(224, 250, 226)'>
</td>
</tr>

<tr>
<td align='left' width='20%'> </td>
</tr>
		
<tr>
<td align='right' width='20%'><b>Messages: </b></td>
<TD align='left' width='60%'>
<TEXTAREA name='message' rows='4' columns='40'>
<jsp:getProperty name='beanUser' property='message'/>
</TEXTAREA>
</TD>
</tr>

<tr>
<td align='left' width='20%'> </td>
</tr>

</TBODY>

</table>

</form>
		
</body>

</html>


    

Control

Minimal Function

Implement as Java Servlet or Framework Component

Map User Data to DataBean & Verify

Determine User Action (e.g., getParameter("userAction"); )

Implement as Case Statement or sequence of if - else if - else Statements

Perform Function for Each User Action by Preparing DataBean for Model and Processing Results from Model, most Likely a Bean

Update Session State (e.g., Using HTTPSession & get/set Attribute)

Pass Data to Appropriate View

Example:


package jbs.eb2cbasicjsp.control;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jbs.eb2cbasicjsp.databean.BeanUser;
import jbs.eb2cbasicjsp.model.IModelUser;
import jbs.eb2cbasicjsp.model.ModelUser;
import jbs.eb2cbasicjsp.model.ModelUserStub;
import jbs.eb2cbasicjsp.util.Constant;
import jbs.eb2cbasicjsp.util.Util;

/**
 * @author jbs
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class ControlUser extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
			
		//  path following welcome
		doPost( request, response );

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {

		//  get session state
		HttpSession session = request.getSession();	

		// DataBean version of input 
		BeanUser dataBean = mapParamsToDataBean( request );  
		BeanUser dataBeanNew;

		// get action requested
		String userAction = ( (String)(request.getParameter("userAction")) ).trim();  //  edited to generalize

		// instantiate model
		IModelUser model = new ModelUser();
		
		if ( (userAction.equalsIgnoreCase("register")) )  {
		
			// call model			
			dataBeanNew = model.add( dataBean );
	
			if ( ! dataBeanNew.isOk() )  {
					
				dataBean.setMessage( "Error in Register." );
				
				request.setAttribute( "beanUser", dataBean );
				forward( request, response, Constant.VIEW_REGISTER );
				
				return;
									
			}  else  {
				
				// maintain user state
				session.setAttribute( "userId", dataBeanNew.getUserId() );

				// generate home view
				forward( request, response, Constant.VIEW_HOME );
				
				return;
			
			}
		.
		.
		.

									
		}  else if ( (userAction.equalsIgnoreCase("update")) ) {				
			
			//  get userId
			String userId = (String) session.getAttribute( "userId" );
			dataBean.setId( userId );
					
			dataBeanNew = model.update( dataBean );
					
			if ( ! dataBeanNew.isOk() ) {
						
				dataBean.setMessage( "Error in updateUser" );
				request.setAttribute( "beanUser", dataBean );
				forward( request, response, Constant.VIEW_USERUPDATE );
					
				return;
										
			}  else  {
			
				// pass data to view 
				dataBeanNew.setMessage( "UpdateUser ok" );
				request.setAttribute( "beanUser", dataBeanNew );
			
				// generate view
				forward( request, response, Constant.VIEW_USERUPDATE );
				
				return;
					
			}
							
		}  else if ( (userAction.equalsIgnoreCase("Logout")) ) {

			// delete session		
			session.invalidate();

			// generate view
			forward( request, response, Constant.VIEW_LOGOUT );

			return;

		
		}  else  {

			forward( request, response, Constant.VIEW_ERROR );
			
			return;

		}

	}
	
	
// ********************  Utility Methods  


   public BeanUser mapParamsToDataBean ( HttpServletRequest request )  {
						
		BeanUser bean = new BeanUser();
				
		bean.setNameFirst   ( request.getParameter( "nameFirst" ) );
		
		.
		
		.
		
		.

	   return bean;
						
   }

	private boolean verifyLoginAndPassword ( BeanUser bean )  {
		
	}
	
	private boolean verifyPasswordsMatch( BeanUser bean )  {
		
	}


// ******************  Navigation Methods  ******************


	private void forward(HttpServletRequest req, HttpServletResponse resp, int next )
	throws ServletException, IOException
	{
	    				 
	   String url;

	   switch ( next )  {
		
				
		   //  register
		   case Constant.VIEW_REGISTER:  
			   url = "/view/eb2cbasic/register.jsp";
			   break;
			   
			.
			
			.
			
			.
				

		   //  default
		   default:
			   url = "/view/eb2cbasic/error.jsp";
			   break;
			
	   }

		RequestDispatcher disp = getServletContext().getRequestDispatcher( url );
		disp.forward(req, resp);
		
	}

	 
}


Model

Implement as Java Class (POJO).

API is Important

Use DataBeans as Arguments and Return Types

Support Connections to DBMS, if Needed

Construct DBMS Statements, if Needed

Verify Results of Processing

Prepare Results as DataBeans or Appropriate Form