Struts Interview Questions

What is Struts?
Struts is a web page development framework and an open source software that helps developers build web applications quickly and easily. Struts combines Java Servlets, Java Server Pages, custom tags, and message resources into a unified framework. It is a cooperative, synergistic platform, suitable for development teams, independent developers, and everyone between.


How is the MVC design pattern used in Struts framework?

In the MVC design pattern, application flow is mediated by a central Controller. The Controller delegates requests to an appropriate handler. The handlers are tied to a Model, and each handler acts as an adapter between the request and the Model. The Model represents, or encapsulates, an application’s business logic or state. Control is usually then forwarded back through the Controller to the appropriate View. The forwarding can be determined by consulting a set of mappings, usually loaded from a database or configuration file. This provides a loose coupling between the View and Model, which can make an application significantly easier to create and maintain.
Controller–Servlet controller which supplied by Struts itself; View — what you can see on the screen, a JSP page and presentation components; Model — System state and a business logic JavaBeans.
Who makes the Struts?
Struts is hosted by the Apache Software Foundation(ASF) as part of its Jakarta project, like Tomcat, Ant and Velocity.

Why it called Struts?
Because the designers want to remind us of the invisible underpinnings that hold up our houses, buildings, bridges, and ourselves when we are on stilts. This excellent description of Struts reflect the role the Struts plays in developing web applications.
Do we need to pay the Struts if being used in commercial purpose?
No. Struts is available for commercial use at no charge under the Apache Software License. You can also integrate the Struts components into your own framework just as if they were written in house without any red tape, fees, or other hassles.

What are the core classes of Struts?
Action, ActionForm, ActionServlet, ActionMapping, ActionForward are basic classes of Structs.
What is the design role played by Struts?
The role played by Structs is controller in Model/View/Controller(MVC) style. The View is played by JSP and Model is played by JDBC or generic data source classes. The Struts controller is a set of programmable components that allow developers to define exactly how the application interacts with the user.

How Struts control data flow?
Struts implements the MVC/Layers pattern through the use of ActionForwards and ActionMappings to keep control-flow decisions out of presentation layer.
What configuration files are used in Struts?

ApplicationResources.properties
struts-config.xml
These two files are used to bridge the gap between the Controller and the Model.
What helpers in the form of JSP pages are provided in Struts framework?
–struts-html.tld
–struts-bean.tld
–struts-logic.tld

Is Struts efficient?
The Struts is not only thread-safe but thread-dependent(instantiates each Action once and allows other requests to be threaded through the original object.
ActionForm beans minimize subclass code and shorten subclass hierarchies
The Struts tag libraries provide general-purpose functionality
The Struts components are reusable by the application
The Struts localization strategies reduce the need for redundant JSPs
The Struts is designed with an open architecture–subclass available
The Struts is lightweight (5 core packages, 5 tag libraries)
The Struts is open source and well documented (code to be examined easily)
The Struts is model neutral

How you will enable front-end validation based on the xml in validation.xml?
The tag to allow front-end validation based on the xml in validation.xml. For example the code: generates the client side java script for the form logonForm as defined in the validation.xml file. The when added in the jsp file generates the client site validation script.

What is ActionServlet?
The class org.apache.struts.action.ActionServlet is the called the ActionServlet. In the the Jakarta Struts Framework this class plays the role of controller. All the requests to the server goes through the controller. Controller is responsible for handling all the requests.

How you will make available any Message Resources Definitions file to the Struts Framework Environment?
Message Resources Definitions file are simple .properties files and these files contains the messages that can be used in the struts project. Message Resources Definitions files can be added to the struts-config.xml file through tag. Example:

What is Action Class?
The Action Class is part of the Model and is a wrapper around the business logic. The purpose of Action Class is to translate the HttpServletRequest to the business logic. To use the Action, we need to Subclass and overwrite the execute() method. In the Action Class all the database/business processing are done. It is advisable to perform all the database related stuffs in the Action Class. The ActionServlet (commad) passes the parameterized class to Action Form using the execute() method. The return type of the execute method is ActionForward which is used by the Struts Framework to forward the request to the file as per the value of the returned ActionForward object.

Write code of any Action Class?
Here is the code of Action Class that returns the ActionForward object.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class TestAction extends Action
{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception
{
return mapping.findForward(\”testAction\”);
}
}

What is ActionForm?
An ActionForm is a JavaBean that extends org.apache.struts.action.ActionForm. ActionForm maintains the session state for web application and the ActionForm object is automatically populated on the server side with data entered from a form on the client side.

What is Struts Validator Framework?
Struts Framework provides the functionality to validate the form data. It can be use to validate the data on the users browser as well as on the server side. Struts Framework emits the java scripts and it can be used validate the form data on the client browser. Server side validation of form can be accomplished by sub classing your From Bean with DynaValidatorForm class. The Validator framework was developed by David Winterfeldt as third-party add-on to Struts. Now the Validator framework is a part of Jakarta Commons project and it can be used with or without Struts. The Validator framework comes integrated with the Struts Framework and can be used without doing any extra settings.

Give the Details of XML files used in Validator Framework?
The Validator Framework uses two XML configuration files validator-rules.xml and validation.xml. The validator-rules.xml defines the standard validation routines, these are reusable and used in validation.xml. to define the form specific validations. The validation.xml defines the validations applied to a form bean. How you will display validation fail errors on jsp page? – The following tag displays all the errors:

Why do we need Struts?
Java technologies give developers a serious boost when creating and maintaining applications to meet the demands of today’s public Web sites and enterprise intranets. Struts combines Java Servlets, Java ServerPages, custom tags, and message resources into a unified framework. The end result is a cooperative, synergistic platform, suitable for development teams, independent developers, and everyone in between.

How does Struts work?
Java Servlets are designed to handle requests made by Web browsers. Java ServerPages are designed to create dynamic Web pages that can turn billboard sites into live applications. Struts uses a special Servlet as a switchboard to route requests from Web browsers to the appropriate ServerPage. This makes Web applications much easier to design, create, and maintain.
Is Struts compatible with other Java technologies?
Yes. Struts is committed to supporting industry standards. Struts acts as an integrator of Java technologies so that they can be used in the “real world”.

Who wrote Struts?

There are several active committers to the Struts project, working cooperatively from around the globe. Dozens of individual developers and committers contributed to the Struts 1.x codebase. All interested Java developers are invited to contribute to the project. Struts is a Apache Software Foundation project, with the mission to “provide secure, enterprise-grade server solutions based on the Java Platform that are developed in an open and cooperative fashion”.
Struts was created by Craig R. McClanahan and donated to The Apache Software Foundation in May 2000. Craig was the primary developer of both Struts 1.x and Tomcat 4. Tomcat 4 was the basis for the official reference implementation for a servlet 2.3 and JSP 1.2 container.
Craig’s current focus is as architect of the Sun Java Studio Creator (formerly Project Rave). Craig also serves as the Specification Lead for JavaServer Faces (JSR-127), and is the Web Layer Architect for the Java2 Enterprise Edition (J2EE) platform as a whole

What is the term action mapping?
Struts provides a number of tag libraries that helps to create view components easily.
These tag libraries are:
a) Bean Tags: Bean Tags are used to access the beans and their properties.
b) HTML Tags: HTML Tags provides tags for creating the view components like forms, buttons, etc..
c) Logic Tags: Logic Tags provides presentation logics that eliminate the need for script lets.
d) Nested Tags: Nested Tags helps to work with the nested context

Can I setup Apache Struts to use multiple configuration files?
Yes Struts can use multiple configuration files. Here is the configuration example:

banking
org.apache.struts.action.ActionServlet

config /WEB-INF/struts-config.xml,
/WEB-INF/struts-authentication.xml,
/WEB-INF/struts-help.xml

1

What are the difference between and ?
: This tag is used to output locale-specific text (from the properties files) from a MessageResources bundle.

: This tag is used to output property values from a bean. is a commonly used tag which enables the programmers to easily present the data

What is LookupDispatchAction?
An abstract Action that dispatches to the subclass mapped execute method. This is useful in cases where an HTML form has multiple submit buttons with the same name. The button name is specified by the parameter property of the corresponding ActionMapping. (Ref. http://struts.apache.org/1.2.7/api/org/apache/struts/actions/LookupDispatchAction.html

How you will handle exceptions in Struts?
In Struts you can handle the exceptions in two ways:
a) Declarative Exception Handling: You can either define global exception handling tags in your struts-config.xml or define the exception handling tags within .. tag.
Example:

b) Programmatic Exception Handling: Here you can use try{}catch{} block to handle the exception.

Why ActionServlet is Singleton in struts framework?
org.apache.struts.action.ActionServlet in the web.xml configuration file must defined as
ActionServlet provided by the struts Framework is a built-in servlet. ActionServlet nothing but a controller.
It has the following inbuilt design patterns.
1 singleton designpatteren.
2.FrontController
3.ApplicationController
4.MVC
5.Data Transfer object/value object
6.Inversion of control/Dependency injection
ActionServlet take the multiple request but it creates single instance for that requests by using singleton design pattern.
Few servers likes weblogic violates single instance multiple threads principle of servlet programming.That means these servers that will create more than once object for a class in special situation. see here
To avoid this type of situations & to follow servlet specifications, struts framework software developers have made built-in servlet called ActionServlet.
Note:
1. According to MVC principles, there should be only one servlet acting as controller and this servlet should have only one object.
2. Both the approaches have advantages & disadvantages

Pin it

List and ArrayList Example:

List and ArrayList Example: Hi friends this is my first post on core java. I think you know the basics of Collections. I am not explaining basics here. When i am learning java I saw so  many sites are giving examples only on Collections to add integer or string or float. Little bit sites only giving example on adding objects and retrieving  then from Collections. this is my first example using java.util.List and java.util.Arraylist. i am not explaining anything about this example.I think you can understand by seeing this example.

 

 

the usage of this example is understanding List and ArrayList and contains method. we are adding employee to a list and avoiding duplicates while adding to list by overriding equals method. and retrieving all employees and displaying them from List. have any questions contact me or post a comment below.

Employee.java;

package com.jagadeesh.domain;

public interface Employee {

public Integer getId();

public void setId(Integer id);

public String getFirstName();

public void setFirstName(String firstName);

public String getLastName();

public void setLastName(String lastName);

public void setEmail(String email);

public String getEmail();

public int getPriority();

public void setPriority(int priority);

public String getDesignation();

public void setDesignation(String designation);

public String toDisplayString();

}

EmployeeImpl.java

package com.jagadeesh.domain.impl;

import java.io.Serializable;

import com.jagadeesh.domain.Employee;

import com.jagadeesh.utils.EmployeeIO;

public class EmployeeImpl extends EmployeeIO

implements Employee {

private static final long serialVersionUID = 5058287999709032283L;

private Integer id;

private String firstName;

private String lastName;

private String email;

private int priority;

private String designation;

@Override

public Integer getId() {

return id;

}

@Override

public void setId(Integer id) {

this.id = id;

}

@Override

public String getFirstName() {

return firstName;

}

@Override

public void setFirstName(String firstName) {

this.firstName = firstName;

}

@Override

public String getLastName() {

return lastName;

}

@Override

public void setLastName(String lastName) {

this.lastName = lastName;

}

@Override

public String getEmail() {

return email;

}

@Override

public void setEmail(String email) {

this.email = email;

}

@Override

public int getPriority() {

return priority;

}

@Override

public void setPriority(int priority) {

this.priority = priority;

}

@Override

public String getDesignation() {

return designation;

}

@Override

public void setDesignation(String designation) {

if ("CEO".equalsIgnoreCase(designation)) {

setPriority(1);

} else if ("MD".equalsIgnoreCase(designation)) {

setPriority(2);

} else if ("HR".equalsIgnoreCase(designation)) {

setPriority(3);

} else {

setPriority(4);

}

this.designation = designation;

}

@Override

public String toString() {

StringBuffer buffer = new StringBuffer();

buffer.append("EmployeeImpl [id=");

buffer.append(id);

buffer.append(", firstName=");

buffer.append(firstName);

buffer.append(", lastName=");

buffer.append(lastName);

buffer.append(", email=");

buffer.append(email);

buffer.append(", priority=");

buffer.append(priority);

buffer.append(", designation=");

buffer.append(designation);

buffer.append("]");

return buffer.toString();

}

@Override

public boolean equals(Object object) {

if (object == null)

return false;

if (object == this)

return true;

if (this.getClass() != object.getClass())

return false;

Employee employee = (Employee) object;

if (this.id == employee.getId()

this.firstName.equalsIgnoreCase(employee.getFirstName())

this.lastName.equalsIgnoreCase(employee.getLastName())

this.email.equalsIgnoreCase(employee.getEmail())

this.designation.equalsIgnoreCase(employee.getDesignation()))

return true;

return false;

}

@Override

public String toDisplayString() {

StringBuffer buffer = new StringBuffer();

buffer.append(this.getId());

buffer.append("\t");

buffer.append(this.getFirstName());

buffer.append("\t");

buffer.append(this.getLastName());

buffer.append("\t");

buffer.append(this.getEmail());

buffer.append("\t");

buffer.append(this.getDesignation());

return buffer.toString();

}

}

</pre>

<b>EmployeeService.java</b>

<pre class="brush:java">package com.jagadeesh.service;

import java.util.List;

import com.jagadeesh.domain.Employee;

public interface EmployeeService {

List<Employee> getAll();

void addEmployee(Employee employee);

}

</pre>

<b>EmployeeServiceImpl.java</b>

<pre class="brush:java">package com.jagadeesh.service.impl;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import com.jagadeesh.domain.Employee;

import com.jagadeesh.service.EmployeeService;

public class EmployeeServiceImpl implements EmployeeService {

private List<Employee> employees = new ArrayList<Employee>();

@Override

public List<Employee> getAll() {

List<Employee> employees = new ArrayList<Employee>(this.employees);

return Collections.unmodifiableList(employees);

}

@Override

public void addEmployee(Employee employee) {

if (employees.contains(employee)) {

System.out.println("Employee already exists");

} else {

this.employees.add(employee);

}

}

}

EmployeeIO.java

package com.jagadeesh.utils;

import java.util.List;

import com.jagadeesh.domain.Employee;

import com.jagadeesh.domain.impl.EmployeeImpl;

public class EmployeeIO {

public static Employee read() {

Employee employee = new EmployeeImpl();

employee.setId(KeyBoard.readInt("Enter Id :"));

employee.setFirstName(KeyBoard.read("Enter First Name :"));

employee.setLastName(KeyBoard.read("Enter Last Name :"));

employee.setEmail(KeyBoard.read("Enter Email :"));

employee.setDesignation(KeyBoard.read("Enter Designation :"));

return employee;

}

public static void out(List<Employee> employees) {

StringBuilder builder = new StringBuilder();

builder.append("Id\t\tFirst Name\t\tLast Name\t\tEmail\ttDesignation\n");

for (int i = 0; i < employees.size(); i++) {

builder.append(employees.get(i).toDisplayString());

builder.append("\n");

}

System.out.println(builder);

}

}

KeyBoard.java

package com.jagadeesh.utils;

import java.util.Scanner;

public class KeyBoard {

public static int readInt(String message) {

System.out.print(message);

Scanner scanner = new Scanner(System.in);

try {

int number = Integer.parseInt(scanner.next());

return number;

}

catch(NumberFormatException e) {

System.out.println("Invalid Number");

return readInt(message);

}

}

public static String read(String message) {

System.out.print(message);

Scanner scanner = new Scanner(System.in);

return scanner.nextLine();

}

}

EmployeeMain.java

package com.jagadeesh.main;

import com.jagadeesh.domain.Employee;

import com.jagadeesh.service.EmployeeService;

import com.jagadeesh.service.impl.EmployeeServiceImpl;

import com.jagadeesh.utils.EmployeeIO;

import com.jagadeesh.utils.KeyBoard;

public class EmployeeMain {

public static void main(String[] args) throws Exception {

int option = 1;

EmployeeService empService = new EmployeeServiceImpl();

do {

Employee employee = EmployeeIO.read();

empService.addEmployee(employee);

option = KeyBoard.readInt(

"Do you want add another employee(1/0) :");

} while(option == 1);

System.out.println("Reading from List");

EmployeeIO.out(empService.getAll());

}

}

Out put of the program

Enter Id :1

Enter First Name :jagadeesh

Enter Last Name :kumar

Enter Email :[email protected]

Enter Designation :developer

Do you want add another employee(1/0) :1

Enter Id :2

Enter First Name :jagadeesh

Enter Last Name :kumar

Enter Email :[email protected]

Enter Designation :developer

Do you want add another employee(1/0) :1

Enter Id :1

Enter First Name :jagadeesh

Enter Last Name :kumar

Enter Email :[email protected]

Enter Designation :developer

Employee already exists

Do you want add another employee(1/0) :testing invalid option

Invalid Number

Do you want add another employee(1/0) :1

Enter Id :3

Enter First Name :jagadeesh

Enter Last Name :kumar

Enter Email :[email protected]

Enter Designation :developer

Do you want add another employee(1/0) :0

Reading from List

Id First Name Last Name Email  Designation

1 jagadeesh kumar [email protected] developer
2 jagadeesh kumar [email protected] developer
3 jagadeesh kumar [email protected] developer

Pin it

Shallow copy and deep copy in prototype patterns?

There are two types of cloning for prototype patterns. One is the shallow cloning which you have just read in the first question. In shallow copy only that object is cloned, any objects containing in that object is not cloned. For instance consider the figure ‘Deep cloning in action’ we have a customer class and we have an address class aggregated inside the customer class. ‘MemberWiseClone’ will only clone the customer class ‘ClsCustomer’ but not the ‘ClsAddress’ class. So we added the ‘MemberWiseClone’ function in the address class also. Now when we call the ‘getClone’ function we call the parent cloning function and also the child cloning function, which leads to cloning of the complete object. When the parent objects are cloned with their containing objects it’s called as deep cloning and when only the parent is clones its termed as shallow cloning.