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>
<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>
</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>
<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>
</web-app>
Create Entity Classes
Create new package named entities. In this package, create new java classes as below:
Account Entity
In entities package, create new java class named Account.java as below:
package entities;
import java.util.Date;
import com.opensymphony.xwork2.conversion.annotations.TypeConversion;
public class Account {
private String username;
private Date birthday;
private Role role;
public Role getRole() {
return role;
}
@TypeConversion(converter = "conversions.RoleConvert")
public void setRole(Role role) {
this.role = role;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
@TypeConversion(converter = "conversions.DateConvert")
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
Role Entity
In entities package, create new java class named Role.java as below:
package entities;
public class Role {
private String id;
private String name;
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 Role(String id, String name) {
this.id = id;
this.name = name;
}
public Role() {
}
}
Create Model Classes
Create new package named models. In this package, create new models as below:
Role Model
In models package, create new java class named RoleModel.java as below:
package models;
import entities.Role;
import java.util.ArrayList;
import java.util.List;
public class RoleModel {
public List<Role> findAll() {
List<Role> roles = new ArrayList<Role>();
roles.add(new Role("r1", "Role 1"));
roles.add(new Role("r2", "Role 2"));
roles.add(new Role("r3", "Role 3"));
roles.add(new Role("r4", "Role 4"));
return roles;
}
public Role find(String id) {
for (Role role : this.findAll()) {
if (role.getId().equalsIgnoreCase(id)) {
return role;
}
}
return null;
}
}
Create Conversion Classes
Create new package named conversions. In this package, create new conversions as below:
Date Conversion
In conversions package, create new java class named DateConvert.java as below:
package conversions;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class DateConvert extends StrutsTypeConverter {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy");
@Override
public Object convertFromString(Map map, String[] strings, Class cls) {
try {
if (strings == null || strings.length == 0 || strings[0].trim().length() == 0) {
return null;
}
String input = strings[0];
return simpleDateFormat.parse(input);
} catch (Exception e) {
return null;
}
}
@Override
public String convertToString(Map map, Object object) {
if (object != null) {
Date birthday = (Date) object;
return simpleDateFormat.format(birthday);
}
return null;
}
}
Role Conversion
In conversions package, create new java class named RoleConvert.java as below:
package conversions;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import entities.Role;
import models.RoleModel;
public class RoleConvert extends StrutsTypeConverter {
@Override
public Object convertFromString(Map map, String[] strings, Class cls) {
try {
if (strings == null || strings.length == 0 || strings[0].trim().length() == 0) {
return null;
}
RoleModel roleModel = new RoleModel();
String id = strings[0];
return roleModel.find(id);
} catch (Exception e) {
return null;
}
}
@Override
public String convertToString(Map map, Object object) {
if (object != null) {
Role role = (Role) object;
return role.getId();
}
return null;
}
}
Create Account Action
Create new package named 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 AccountAction.java as below:
package controllers.action;
import java.text.SimpleDateFormat;
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 com.opensymphony.xwork2.ActionSupport;
import entities.Account;
import entities.Role;
import models.RoleModel;
@Namespace("/account")
public class AccountAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private Account account;
private List<Role> roles;
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
@Action(value = "index", results = {
@Result(name = SUCCESS, location = "/WEB-INF/views/account/index.jsp")
})
public String index() {
RoleModel roleModel = new RoleModel();
this.roles = roleModel.findAll();
this.account = new Account();
return SUCCESS;
}
@Action(value = "save", results = {
@Result(name = SUCCESS, location = "/WEB-INF/views/account/success.jsp")
})
public String save() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy");
System.out.println("Account Information");
System.out.println("username: " + this.account.getUsername());
System.out.println("Birthday: " + simpleDateFormat.format(this.account.getBirthday()));
System.out.println("Role Id: " + this.account.getRole().getId());
System.out.println("Role Name: " + this.account.getRole().getName());
return SUCCESS;
}
}
Create Views
Create new folder named views in src\main\webapp\WEB-INF folder. In views folder, create new folder named account. In account folder create new views as below:
Index View
In account 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="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Learn Struts 2 with Real Apps</title>
</head>
<body>
<h3>Register</h3>
<s:form method="post" namespace="/account" action="save">
<s:textfield label="Username" name="account.username"></s:textfield>
<s:textfield label="Birthday" name="account.birthday" placeholder="Format: mm/dd/yyyy"></s:textfield>
<s:select label="Roles" list="roles" name="account.role" listKey="id" listValue="name"></s:select>
<s:submit value="Save" align="left"></s:submit>
</s:form>
</body>
</html>
Success View
In account folder create new JSP file named success.jsp as below:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Learn Struts 2 with Real Apps</title>
</head>
<body>
<h3>Account Information</h3>
<table border="1">
<tr>
<td>Username</td>
<td>${account.username }</td>
</tr>
<tr>
<td>Birthday</td>
<td>
<fmt:formatDate var="birthday" value="${account.birthday }" pattern="MM/dd/yyyy" />
${birthday }
</td>
</tr>
<tr>
<td>Role Id</td>
<td>${account.role.id }</td>
</tr>
<tr>
<td>Role Name</td>
<td>${account.role.name }</td>
</tr>
</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="account/index.html"></jsp:forward>
Structure of Project
Run Application
Select project, right click and select Run on Server menu
Access index method in account action with following url:
http://localhost:8080/LearnStrutsFrameworkWithRealApps/account/index.html