0% found this document useful (0 votes)
45 views20 pages

05 - MVC With Struts

The document discusses the Model-View-Controller (MVC) design pattern and how the Struts framework implements MVC to separate the model, view, and controller aspects of web applications. It explains how Struts uses configuration files, action forms, action beans, and JavaServer Pages (JSPs) to control the workflow and presentation of web applications based on the MVC pattern. Developing with Struts involves configuring workflow in XML files, creating action and model beans, and developing JSPs to encapsulate the different MVC components.

Uploaded by

punyaku2021
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
45 views20 pages

05 - MVC With Struts

The document discusses the Model-View-Controller (MVC) design pattern and how the Struts framework implements MVC to separate the model, view, and controller aspects of web applications. It explains how Struts uses configuration files, action forms, action beans, and JavaServer Pages (JSPs) to control the workflow and presentation of web applications based on the MVC pattern. Developing with Struts involves configuring workflow in XML files, creating action and model beans, and developing JSPs to encapsulate the different MVC components.

Uploaded by

punyaku2021
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

CSE 135

The MVC Design Pattern &


The Struts Framework

Previous Attempts:
Model 1 Design Pattern
for every JSP page p
for every type of request r to p
insert in p code to implement the action requested by r

students.jsp
If request to insert student
perform SQL INSERT
If request to delete student Messy
perform SQL UPDATE JSP!

If request to update student


perform SQL DELETE

HTML part of the JSP


http://.../students.jsp?action=insert&...
INSERT STUDENT
http://.../students.jsp?action=update&...
UPDATE STUDENT
http://.../students.jsp?action=delete&...
DELETE STUDENT
2

1
The MVC Design Pattern:
Separating Model, View & Controller

• Development “Best
Practice”
• Known well before
web items
– Smalltalk pioneered
• Model: Access to
Underlying Databases
and Info Sources
• Controller: Control
Flow of Web App
• View: Look-and-Feel

The MVC Design Pattern

• MVC originated as Model 2 in web developers


community

• Model 1: Application logic is attached to JSPs


– Similar to previous attempts of students.jsp

• Model 2: Data access and control flow decisions


in Java Beans

2
Data Entry Example – MVC Attempt

students.jsp View

HTML part of the JSP


INSERT STUDENT
UPDATE STUDENT
DELETE STUDENT

Controller/Actions
Delete Update Insert
Student Student Student

Model Java classes export methods


Model
that encapsulate SQL access

DB
5

The Process and the Frictions

Business Process Owner (Client)

COMMUNICATION
Analysis/
Specification business process • Informal, imprecise
Phase and specification specification by customer
of Web application • Accompanied by hard-to-
built demos and diagrams
Chief Architect/
Technical Project Leader

COMMUNICATION
Development • Code developed may be
Phase technical specification
inconsistent with spec
and development
• Significant effort in
communicating spec formally
Developer

Problem is even worse in evolution phase when


application logic is hidden in thousands of lines of code
6

3
Struts

• Black-Box Framework Implementing MVC


– Framework: reusable “partial” application
• Struts ActionServlet provides high level control
of workflow (Part of Controller)
• You provide Beans and files to customize
framework according to your application needs
1. JSPs provide HTML presentation (View)
2. ActionForm Beans “collect” form data (Part of Controller)
3. Action Beans provide details of flow (Part of Controller)
4. struts-config.xml declares Beans and JSPs

How To Develop Struts Applications

From 10 Miles High:


• Pass high-level control to ActionServlet
– By appropriate URL mapping in web.xml
• Design “workflow” in diagrams and then code it
in struts-config.xml
• Develop ActionForm Beans
• Develop Action Beans
• Develop Model Beans (not part of Struts)
• Develop HTML and JSP pages

4
Struts Single Request Processing

View Request/Session
Scope
Ac1onForward Ac1onForward get
(Page or Ac1on) (Page or Ac1on) Data

set
HTTP Response HTTP Response

7 6
HTTP 5
Request 2 Ac1on ModelBean
Ini1a1ng
Page Ac1onServlet
Form
4 3
Validation Ac1onForm
Error 1
Controller
DB

Model
struts‐config.xml

Struts Single Request Processing (cont’d)

•1 When web app is loaded, ActionServlet parses


struts-config.xml and associates URL paths
with Action and ActionForm Beans
– Location of struts-config.xml is given in web.xml
• The user issues an HTTP request from an
2

initiating page P to the ActionServlet

10

5
Struts Single Request Processing (cont’d)

•3 The ActionServlet instantiates the ActionForm


Bean associated with the HTTP request URL in
struts-config.xml, and sets its properties
using the HTTP request parameters (user-
submitted data)
•4 The ActionForm Bean validates its property
values and if validation fails, ActionServlet
responds with the initiating page P displaying
appropriate error messages for the user to
correct his/her form data

11

Struts Single Request Processing (cont’d)

•5 If validation succeeds, the ActionServlet


instantiates the Action Bean associated with the
HTTP request URL in struts-config.xml, and
calls its execute method passing as parameters
the ActionForm Bean, the HTTP request and the
HTTP response objects

12

6
Struts Single Request Processing (cont’d)

•6 Within its execute method, the Action Bean


instantiates/calls Model Beans, which open a
connection to the database, execute SQL
operations, and return sets of tuples
The Action Bean places the sets of tuples in the
session so that JSP pages (View components)
can access them

13

Struts Single Request Processing (cont’d)

•7 The Action Bean returns to the ActionServlet


one of the ActionForwards with which the HTTP
request URL is associated in struts-config.xml
An ActionForward is a possible outcome of the
Action Bean and represents either an JSP/HTML
page or another Action that will be the response
to the user’s request
Upon receiving the ActionForward, the
ActionServlet responds to the user’s request
with the corresponding JSP/HTML page or Action

14

7
Install Struts

• We will use Struts 1.3 for Phase 2 of the project


– Struts 2 will be covered later on and will not be used
for the project
• Download struts-1.3.10-all.zip
• Struts is only a package containing:
\doc, \src, \lib, \apps
• Within \apps is a set of *.war files
– struts-blank-1.3.10.war
– struts-examples-1.3.10.war
– struts-cookbook-1.3.10.war

15

Struts Examples

• To play with Struts examples:


– Copy struts-cookbook-1.3.10.war under \webapps
– Access http://localhost:8080/struts-cookbook-1.3.10/
• To play with more Struts examples:
– Copy struts-examples-1.3.10.war under \webapps
– This automatically deploys a new web app directory
– Access http://localhost:8080/struts-examples-1.3.10/
• To start your own Struts application:
– Copy struts-blank-1.3.10.war under \webapps
– Rename \struts-blank-1.3.10 to \your_app_name

16

8
Pass Control to ActionServlet

web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

17

Data Entry Example - 7th Attempt


menu.jsp Web Appliation
Workflow
Students
(hyperlink)

success students.jsp
showStudents.do
Insert
(buIon) Delete
StudentForm Update (buIon)
!validate InsertUpdate (buIon)

StudentForm
success !validate InsertUpdate
StudentForm
insertStudent.do
Delete
success
updateStudent.do
success
deleteStudent.do

18

9
Data Entry Example - 7th Attempt
menu.jsp Web Appliation
set
Request Scope
get Workflow
Students
(hyperlink)
StudentsRowSet

success students.jsp
showStudents.do
Insert
(buIon) Delete
StudentForm Update (buIon)
!validate InsertUpdate (buIon)

StudentForm
success !validate InsertUpdate
StudentForm
insertStudent.do
Delete
success
updateStudent.do
StudentModel.insertStudent()
(INSERT INTO Students…) success
deleteStudent.do
StudentModel.updateStudent()
(UPDATE Students…)
StudentModel.getAllStudents()
(SELECT * FROM Students) DB StudentModel.deleteStudent()
(DELETE FROM Students…)
19

showStudents.do Request Processing


View Request Scope
students.jsp get
StudentsRowSet

5 success set

3 4
menu.jsp …/showStudents.do Ac1onServlet ShowStudentsAc1on StudentModel
2

Controller
1
DB

struts‐config.xml Model

20

10
showStudents.do Configuration

struts-config.xml
<struts-config>
...
<action-mappings>
<action
path="/showStudents"
type="dataentry.actions.ShowStudentsAction">
<forward
name="success”
path="/pages/students.jsp"/>
</action>
...
</action-mappings>
...
</struts-config>
21

showStudents.do Action Bean

ShowStudentsAction.java
package dataentry.actions;

import javax.sql.RowSet;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import dataentry.model.StudentModel;
...

public class ShowStudentsAction extends Action {


...

22

11
showStudents.do Action Bean

ShowStudentsAction.java (cont’d)
...
public ActionForward execute(
ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws DBException {

// retrieve all students


RowSet crsStudents = StudentModel.getAllStudents();
// store the RowSet in the request scope
request.setAttribute("crsStudents", crsStudents);

return mapping.findForward("success");
}
}
23

showStudents.do Model Bean

StudentsModel.java
package dataentry.model;
...
public class StudentModel {
private static String selectStr = ...;
private static String insertStr = ...;
private static String updateStr = ...;
private static String deleteStr = ...;

public static CachedRowSet getAllStudents() {...}


public static void insertStudent(StudentBean student) {...}
public static void updateStudent(StudentBean student) {...}
public static void deleteStudent(StudentBean student) {...}
}

24

12
showStudents.do ActionForward

students.jsp
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
...
<%-- -------- Iteration Code -------- --%>
<% RowSet crsStudents = (RowSet) request.getAttribute("crsStudents");
while (crsStudents.next()) { %>
<tr>
...
<td>
<html:text property=”middle" size="15"
value="<%=crsStudents.getString(\”middleName\")%>" />
</td>
...
</tr>
<% } %>
...

25

insertStudent.do Request Processing


View
showStudents.do
(Step 2 on Slide 8)

7 success

2 5
6
…/insertStudent.do InsertStudentAc1on StudentModel
students.jsp Ac1onServlet
Form Valida1on
Error 4 StudentFormInsertUpdate

1 3
Controller DB

struts‐config.xml Model

26

13
insertStudent.do Configuration

struts-config.xml
...
<form-bean name="studentFormInsertUpdate”
type="dataentry.forms.StudentFormInsertUpdate"/>
...
<action
path="/insertStudent”
type="dataentry.actions.InsertStudentAction"
validate="true”
scope="request"
Not what you
think it is!
input="/showStudents.do”
name="studentFormInsertUpdate">
<forward name="success" path="/showStudents.do”
redirect="true"/>
</action>
27

insertStudent.do ActionForm Bean

StudentFormInsertUpdate.java

package dataentry.forms;
...
public class StudentFormInsertUpdate extends ActionForm {

private String id = null;


private String first = null;
private String middle = null;
private String last = null;

public String getId() { return id; }


public void setId(String id) { this.id = id; }
...

28

14
insertStudent.do ActionForm Bean

StudentFormInsertUpdate.java (cont’d)

...
/**
* Reset all properties to their default values.
*/
public void reset(ActionMapping mapping,
HttpServletRequest request) {
setId(null);
setFirst(null);
setMiddle(null);
setLast(null);
}
...

29

insertStudent.do ActionForm Bean

StudentFormInsertUpdate.java (cont’d)
...
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {

ActionErrors errors = new ActionErrors();

if ((id == null) || (id.length() < 1))


errors.add("idMsgTag1",
new ActionMessage("errors.required", ”ID"));
...

return errors;
}
}
30

15
insertStudent.do Action Bean

InsertStudentAction.java
public class InsertStudentAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws DBException {

// cast the form


StudentFormInsertUpdate iForm =
(StudentFormInsertUpdate) form;
// insert the student
StudentModel.insertStudent(iForm);

return mapping.findForward("success");
}
}
31

insertStudent.do ActionForward

students.jsp
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
...
The corresponding
<!-- in case form validation fails --> Ac1onForm bean
<html:errors /> will also be used to
... populate HTML form
<tr>
<html:form action="/insertStudent">
<td><html:text property="id" size="10" /></td>
<td><html:text property="first" size="15" /></td>
<td><html:text property="middle" size="15" /></td>
<td><html:text property="last" size="15" /></td>
<td><html:submit value="Insert" /></td>
<td><html:reset /></td>
</html:form>
</tr>
...

32

16
struts-config.xml Structure

<struts-config>
<!-- ========================= Form Bean Definitions -->
<form-beans>...</form-beans>

<!-- ================== Global Exception Definitions -->


<global-exceptions>...</global-exceptions>

<!-- ==================== Global Forward Definitions -->


<global-forwards>...</global-forwards>

<!-- ==================== Action Mapping Definitions -->


<action-mappings>...</action-mappings>

<!-- ================= Message Resources Definitions -->


<message-resources parameter="MessageResources" />
</struts-config>
33

Global Exceptions

struts-config.xml

<!-- ==================== Global Exception Definitions -->


<global-exceptions>
<exception key="error.db"
type="dataentry.db.DBException"
path="/pages/dbException.jsp"/>
</global-exceptions>

34

17
Global Exceptions

DBException.java

package dataentry.db;

public class DBException extends Exception {

public DBException() {
super();
}

public DBException(String message) {


super(message);
}
}

35

Global Exceptions

StudentModel.java

public static void insertStudent(


StudentFormInsertUpdate student) throws DBException {

try {
...
} catch (SQLException ex) {
throw new DBException(ex);
} catch (NamingException ex) {
throw new DBException(ex);
}
}

36

18
Global Exceptions

InsertStudentAction.java

public class InsertStudentAction extends Action {


public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws DBException {

...
StudentModel.insertStudent(...);
...
}
}

37

Global Exceptions

dbException.jsp

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>

<html>
<body>
<h2>Database Exception</h2>
...
<h3>Here is the message generated by the thrown database
exception:</h3>

<p><html:errors /></p>

</body>
</html>

38

19
Global Forwards

struts-config.xml

<!-- ====================== Global Forward Definitions -->


<global-forwards>
<forward name="showStudents" path="/showStudents.do"/>
</global-forwards>

menu.jsp

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>


<b>Data Entry Menu</b>
<ul>
<li><html:link forward="showStudents">Students</html:link></li>
...
</ul>

39

Message Resources

MessageResources.properties

# -- app --
app.title=Struts Data Entry Application
...

students.jsp

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>


<html>
<head>
<title><bean:message key="app.title" /></title>
</head>
...
</html>

40

20

You might also like