Create Maven Project
On the Eclipse, create a Maven project
Click Next button and select Workspace location for project
Click Next button and select maven-archetype-webapp
Click Next button and enter Project Information:
- GroupId: LearnStrutsFrameworkWithRealApps
- Artifact Id: LearnStrutsFrameworkWithRealApps
- Package: com.demo
Click Finish button to finish create Maven project
Add Tomcat Server
Select current project, Right click and select Properties menu. In Properties dialog, select Targeted Runtime in left side after select Tomcat server from server list in right side
Click Ok button to finish
Add JRE System Library
Select current project, Right click and select Build Path\Configure Build Path menu Select JRE System Library in Libraries tab:
Click Edit button and select JRE System Library you need use as below:
Click Finish button to finish
Configure pom.xml
Open pom.xml file and add configurations for Struts 2 as below:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>LearnStrutsFrameworkWithRealApps</groupId>
<artifactId>LearnStrutsFrameworkWithRealApps</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>LearnStrutsFrameworkWithRealApps Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Struts 2 Framework -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.20</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.5.20</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.20</version>
</dependency>
<!-- Spring Framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>LearnStrutsFrameworkWithRealApps</finalName>
</build>
</project>
Configure web.xml
Open web.xml file in src\main\webapp\WEB-INF folder and add configurations for Struts 2 as below:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Learn Struts 2 Framework with Real Apps</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.demo.config.AppConfig</param-value>
</context-param>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>html</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
Entities Class
Create new package named com.demo.entities. In this package, create new java class named Product.java as below:
package com.demo.entities;
public class Product {
private String id;
private String name;
private double price;
private int quantity;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public Product(String id, String name, double price, int quantity) {
this.id = id;
this.name = name;
this.price = price;
this.quantity = quantity;
}
public Product() {
}
}
Create ProductRepository Interface
Create new package named com.demo.repositories. In this package, create new java interface named ProductRepository.java as below:
package com.demo.repositories;
import java.util.List;
import com.demo.entities.Product;
public interface ProductRepository {
public List<Product> findAll();
public Product find();
}
Create ProductRepositoryImpl Class
In com.demo.repositories package, create new java class named ProductRepositoryImpl.java as below:
package com.demo.repositories;
import java.util.ArrayList;
import java.util.List;
import com.demo.entities.Product;
public class ProductRepositoryImpl implements ProductRepository {
public List<Product> findAll() {
List<Product> products = new ArrayList<Product>();
products.add(new Product("p01", "name 1", 4.5, 2));
products.add(new Product("p02", "name 2", 11, 8));
products.add(new Product("p03", "name 3", 7, 4));
return products;
}
public Product find() {
return new Product("p01", "name 1", 4.5, 2);
}
}
Create ProductService Interface
Create new package named com.demo.services. In this package, create new java interface named ProductService.java as below:
package com.demo.services;
import java.util.List;
import com.demo.entities.Product;
public interface ProductService {
public List<Product> findAll();
public Product find();
}
Create ProductServiceImpl Class
In com.demo.services package, create new java class named ProductServiceImpl.java as below:
package com.demo.services;
import java.util.List;
import com.demo.entities.Product;
import com.demo.repositories.ProductRepository;
public class ProductServiceImpl implements ProductService {
private ProductRepository productRepository;
public ProductServiceImpl(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public List<Product> findAll() {
return this.productRepository.findAll();
}
public Product find() {
return this.productRepository.find();
}
}
Spring Configuration
Create new package named com.demo.config. In this package, create new java class named AppConfig.java as below:
package com.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.demo.repositories.ProductRepository;
import com.demo.repositories.ProductRepositoryImpl;
import com.demo.services.ProductService;
import com.demo.services.ProductServiceImpl;
@Configuration
@ComponentScan("com.demo")
@EnableTransactionManagement
public class AppConfig {
@Bean(name = "productRepository")
public ProductRepository productRepository() {
return new ProductRepositoryImpl();
}
@Bean(name = "productService")
public ProductService productService() {
return new ProductServiceImpl(productRepository());
}
}
Create Product Action
Create new package named com.demo.controllers.action in src/main/java folder. The action class in Struts 2 must be put in a package named action. In this package, create new java class named ProductAction.java as below:
package com.demo.controllers.action;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import com.demo.entities.Product;
import com.demo.services.ProductService;
import com.opensymphony.xwork2.ActionSupport;
@Namespace("/product")
public class ProductAction extends ActionSupport {
private static final long serialVersionUID = 1L;
@Autowired
private ProductService productService;
private Product product;
private List<Product> products;
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
@Action(value = "index", results = {
@Result(name = SUCCESS, location = "/WEB-INF/views/product/index.jsp")
})
public String index() {
this.product = this.productService.find();
this.products = this.productService.findAll();
return SUCCESS;
}
}
Create View
Create new folder named views in src\main\webapp\WEB-INF folder. In views folder, create new folder named product. In product folder, create new JSP file named index.jsp as below:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Spring and Struts 2 Integration</title>
</head>
<body>
<h3>Product Info</h3>
<table border="1">
<tr>
<td>Id</td>
<td>${product.id }</td>
</tr>
<tr>
<td>Name</td>
<td>${product.name }</td>
</tr>
<tr>
<td>Price</td>
<td>${product.price }</td>
</tr>
<tr>
<td>Quantity</td>
<td>${product.quantity }</td>
</tr>
<tr>
<td>Total</td>
<td>${product.price * product.quantity }</td>
</tr>
</table>
<h3>Product List</h3>
<table border="1">
<tr>
<th>Id</th>
<th>Name</th>
<th>Price</th>
<th>Quantity</th>
<th>Sub Total</th>
</tr>
<c:forEach var="product" items="${products }">
<tr>
<td>${product.id }</td>
<td>${product.name }</td>
<td>${product.price }</td>
<td>${product.quantity }</td>
<td>${product.price * product.quantity }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
Create Redirect Page
Create new jsp file named index.jsp in src\main\webapp folder as below:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<jsp:forward page="product/index.html"></jsp:forward>
Structure of Project
Run Application
Select project, right click and select Run on Server menu
Access index method in product action with following url:
http://localhost:8080/LearnStrutsFrameworkWithRealApps/product/index.html