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.

Control

Multiple Strategies

Minimize Function

Desirable Function

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

Views

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

Called from Control.

In Servlet Context, Provide any Necessary HTTP Header Parameters.

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

Example, Using Java Class:

    public class ViewError {

	public static void display( HttpServletResponse resp, String message ) throws IOException {
		
		resp.setContentType("text/html");

		PrintWriter out = resp.getWriter();
		
		out.println("<html>");
		out.println("<head>");
		out.println("<META http-equiv='Content-Style-Type' content='text/css'>");
		out.println("<LINK href='/jbs/theme/Master.css' rel='stylesheet' type='text/css'>");
		out.println("<title>abbasic error</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>");
		out.println( message );
		out.println("</h1>");
		
		out.println("<a href='/jbs/servlet/jbs.abbasic.control.ABBasic'><b>Return to Welcome</b></a>");
		
		out.println("</body>");
		out.println("</html>");

	}
}
    

Control

Minimal Function

Implement as Java Servlet

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

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

Map User Data to DataBean & Verify

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

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

Pass Data to Appropriate View

Example:

public class ControlAdmin extends HttpServlet {

	/**
	* @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	*/
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
			
		ViewWelcome.display( resp, "Please register or login." );
		
	}

	/**
	* @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	*/
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
			
	    
	    // get session state 
	    HttpSession session = req.getSession( true );

 	    // determine user action 
	    String userAction = req.getParameter("userAction");
	     
	    if ( userAction.equalsIgnoreCase( "Register New User" ) )  {  // brings up form register
	    	 
	        ViewRegister.display( resp, new BeanUser() );
	        
	    } else if( userAction.equalsIgnoreCase("Register") )  {  // processes form register
	    	
	        boolean resultOK = false;

		// map user form data to bean
	        BeanUser beanUser = mapFormToBeanUser( req );
	        
	        // verify user form data, using bean
		if ( ! (beanUser.verifyUser()) )  {  // fails
	        	
	        	beanUser.setMessage("Error registering: fields incomeplete or non-matching.");
			ViewRegister.display( resp, beanUser );
				
	        }  else  {  // ok

			// call model method, pass bean 
	        	BeanUser newBean = ModelAdmin.addUser( beanUser );
	        
	        	// tests results from model
			if (newBean == null )  {  // error
	        	
				beanUser.setMessage("Error registering.");
				ViewRegister.display( resp, beanUser );

	        	}  else  {  // ok
	        	
	        		// update session state
				session.setAttribute( "beanUser", newBean );

	        		// pass data to next view
				ViewCreateLogin.display( resp, new BeanLogin() );
	        
	        	}
	        	
	        }

	    }  else ViewError.display( resp, "AB1 system error:  No user action recognized." );

	}
}

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