Struts 2 Bookstore
Struts 2 Bookstore
About Application: Application is a book store shopping cart and has following features,
1. First choose category from dropdown, then choose book name by selecting checkboxes,
then click Add to Cart. It will show all book list which you are interested to purchase. Now click
Purchase button, then select mode i.e. Cash or Card and then it will finally show total amount
which you have to pay.
2. Registration page (using struts2 action form i.e. textbox, radio button, checkbox), Also using
dojo calendar as we are using struts 2 dojo plugin jar.
3. Login and Logout
4. Session
5. Database operation
6. Locale setting, uncomment code //Locale.setDefault(Locale.CHINA); at login.jsp to see
Chinese Locale demo,
ApplicationResources.properties (default property file)
ApplicationResources_zh_CN.properties (Chinese property file)
7. dao i.e. data access object
8. interceptor filter uses for validation(at login page just click login button to see required field
validation check.)
9. Action classes
10. POJO classes i.e. Book, Category and User classes.
Requirement:
Please install following softwares to run below example,
JDK 1.6
MySQL 5.0 and above database
Eclipse
Tomcat 6.0 server configured in Eclipse.
Download below jars from Struts website,
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
freemarker-2.3.16.jar
javassist-3.7.ga.jar
ognl-3.0.jar
struts2-core-2.2.1.jar
struts2-dojo-plugin-2.1.2.jar
xwork-core-2.2.1.jar
Step 1: Create MySQL database struts2_training and execute below SQL in query browser to
create tables and minimal data,
/*
MySQL - 5.1.34-community : Database - struts2_training
try {
//Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName("com.mysql.jdbc.Driver");
//con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","scott","tiger");
con=DriverManager.getConnection("jdbc:mysql://localhost/struts2_training", "root", "root");
}
*/
USE `struts2_training`;
Step 2: Create a empty Dynamic web project and give ts name Struts2Application
package com.example.struts2.shopcart.dao;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import com.example.struts2.shopcart.model.domain.Book;
import com.example.struts2.shopcart.model.domain.Category;
import com.example.struts2.shopcart.model.domain.User;
//con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","scott","tiger");
con=DriverManager.getConnection("jdbc:mysql://localhost/struts2_training", "root", "");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public boolean addUser(User user){
boolean added=false;
try {
st=con.prepareStatement("insert into aj_user values(?,?,?,?,?,?,?,?)");
st.clearParameters();
st.setString(1,user.getFirstName());
st.setString(2,user.getLastName());
st.setString(3,user.getUserName());
st.setString(4,user.getPassword());
st.setString(5,Arrays.toString(user.getHobbies()));
st.setString(6,user.getGender());
st.setDate(7,new Date(user.getBirthDate().getTime()));
st.setString(8,user.getEmailId());
int count=st.executeUpdate();
if(count==1){
added=true;
System.out.println("+++++++++++++ Record Added+++++++");
}
} catch (SQLException e) {
e.printStackTrace();
}
return added;
}
public void close(){
if(con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package com.example.struts2.shopcart.interceptors;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import javax.xml.crypto.dsig.spec.ExcC14NParameterSpec;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.TextParseUtil;
}
@Override
public void init() {
System.out.println("+++++++++++ init++++++++++++++");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String result="";
String className=invocation.getAction().getClass().getName();
String method=invocation.getProxy().getMethod();
System.out.println("Pre Process for "+className+" "+method);
session=ActionContext.getContext().getSession();
String trackerId=(String)session.get("trackerId");
if(excludeMethods.contains(method)){
result=invocation.invoke();
}else if(includeMethods.contains(method)){
if(trackerId==null){
result="nosession";
}else{
result=invocation.invoke();
System.out.println("Post Process for "+className+" "+method);
}
}
return result;
}
}
package com.example.struts2.shopcart.model.actions;
import com.example.struts2.shopcart.model.domain.Book;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport {
private String message;
private Book book;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public String add(){
message="Inside Add method Book Details : [ "+book.getBookId()+" "+
book.getBookName()+" ].";
System.out.println(message);
return "success";
}
public String update(){
message="Inside Update method Book Details : [ "+book.getBookId()+" "+
book.getBookName()+" ].";
System.out.println(message);
return "success";
}
public String delete(){
message="Inside Delete method Book Details : [ "+book.getBookId()+" "+
book.getBookName()+" ].";
System.out.println(message);
return "success";
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
package com.example.struts2.shopcart.model.actions;
import java.util.ArrayList;
import java.util.Map;
import com.example.struts2.shopcart.dao.ShopCartDAO;
import com.example.struts2.shopcart.model.domain.Category;
import com.example.struts2.shopcart.model.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class LoginAction extends ActionSupport {
private String userName;
private String password;
private User user;
private ArrayList<Category>categoryList;
private ShopCartDAO dao;
private Map<String, Object>session;
public ArrayList<Category> getCategoryList() {
return categoryList;
}
public void setCategoryList(ArrayList<Category> categoryList) {
this.categoryList = categoryList;
}
public ShopCartDAO getDao() {
return dao;
}
public void setDao(ShopCartDAO dao) {
this.dao = dao;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
String result="failed";
session=ActionContext.getContext().getSession();
System.out.println(userName+" : "+password);
dao=new ShopCartDAO();
user=new User();
user.setUserName(getUserName());
user.setPassword(getPassword());
setUser(user);
if(dao.isValid(user)){
setCategoryList(dao.getCategories());
session.put("user",user);
session.put("categoryList", getCategoryList());
session.put("trackerId", "1111");
result="success";
}else{
addActionError("Invalid Username or Password");
return ERROR;
}
dao.close();
/*
ValueStack stack=ActionContext.getContext().getValueStack();
System.out.println(stack);
System.out.println(stack.size());
*/
return result;
}
@Override
public void validate() {
if(getUserName().length()==0){
addFieldError("userName","USERNAME is Required");
}
if(getPassword().length()==0){
addFieldError("password", "PASSWORD is Required");
}else if(getPassword().length()<5){
addFieldError("password","PASSWORD must be MINIMUM 5 characters");
}
}
}
package com.example.struts2.shopcart.model.actions;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class PaymentAction extends ActionSupport {
private String mode;
private Map<String, Object>session;
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
@Override
public String execute() throws Exception {
System.out.println(mode);
session=ActionContext.getContext().getSession();
session.put("mode",mode);
return mode;
}
}
package com.example.struts2.shopcart.model.actions;
import com.opensymphony.xwork2.ActionSupport;
package com.example.struts2.shopcart.model.actions;
import com.example.struts2.shopcart.dao.ShopCartDAO;
import com.example.struts2.shopcart.model.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import org.apache.struts2.interceptor.SessionAware;
import com.example.struts2.shopcart.dao.ShopCartDAO;
import com.example.struts2.shopcart.model.domain.Book;
import com.example.struts2.shopcart.model.domain.User;
import com.opensymphony.xwork2.ActionSupport;
public class ShowBooksAction extends ActionSupport implements SessionAware{
private static final long serialVersionUID = 1L;
private Map<String, Object>session;
private int category;
private ShopCartDAO dao;
private ArrayList<Book>bookList;
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}
public int getCategory() {
return category;
}
public void setCategory(int category) {
this.category = category;
}
public ArrayList<Book> getBookList() {
return bookList;
}
public void setBookList(ArrayList<Book> bookList) {
this.bookList = bookList;
}
@Override
public String execute() throws Exception {
dao=new ShopCartDAO();
User user=(User)session.get("user");
System.out.println("---------"+user.getUserName());
session.put("amount", new Double(1234.5));
setBookList(dao.getBooks(category));
dao.close();
return "success";
}
}
package com.example.struts2.shopcart.model.actions;
import java.util.ArrayList;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.example.struts2.shopcart.model.domain.Book;
import com.opensymphony.xwork2.ActionSupport;
public class StoreBooksAction extends ActionSupport implements SessionAware{
private static final long serialVersionUID = 1L;
private Map<String, Object>session;
private ArrayList<Book> currSelected;
private ArrayList<Book>allBooks;
private String[] selectedBooks;
public String[] getSelectedBooks() {
return selectedBooks;
}
public void setSelectedBooks(String[] selectedBooks) {
this.selectedBooks = selectedBooks;
}
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}
@Override
public String execute() throws Exception {
currSelected=(ArrayList<Book>)session.get("currSelected");
allBooks=(ArrayList<Book>)session.get("allBooks");
Double bill=(Double)session.get("bill");
if(currSelected==null){
currSelected=new ArrayList<Book>();
}
if(bill==null){
bill=0.0;
}
for(String id : selectedBooks){
for(Book b : allBooks){
if(b.getBookId()==Integer.parseInt(id)){
currSelected.add(b);
bill+=b.getBookPrice();
break;
}
}
}
session.put("currSelected", currSelected);
session.put("bill",bill);
for(Book bk : currSelected){
System.out.println(bk.getBookName());
}
System.out.println("BILL :: "+bill);
return "success";
}
}
label.userName=USERNAME
label.password=PASSWORD
Step 13: Create a new xml file RegisterAction-validation.xml in src\com\example\struts2\
shopcart\model\actions and paste below code in this class.
<validators>
<field name="firstName">
<field-validator type="requiredstring">
<message key="First name is required"/>
</field-validator>
</field>
<field name="lastName">
<field-validator type="requiredstring">
<message key="Last name is required"/>
</field-validator>
</field>
<field name="userName">
<field-validator type="required">
<message key="Please provide Your BirthDate"/>
</field-validator>
<field-validator type="requiredstring">
<message key="Username is required"/>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message key="Password is required"/>
</field-validator>
<field-validator type="expression">
<param name="expression">userName!=password</param>
<message key="USERNAME and PASSWORD cannot be same"/>
</field-validator>
</field>
<field name="emailId">
<field-validator type="requiredstring">
<message key="Email-Id is required"/>
</field-validator>
<field-validator type="email">
<message key="enter a valid Email-Id "/>
</field-validator>
</field>
<field name="gender">
<field-validator type="requiredstring">
<message key="Please select the gender"/>
</field-validator>
</field>
<field name="hobbies">
<field-validator type="expression">
<param name="expression">hobbies.length !=0 </param>
<message key="Please select the hobby"/>
</field-validator>
</field>
<field name="birthDate">
<field-validator type="required">
<message key="Please Provide a BirthDate"/>
</field-validator>
<field-validator type="date">
<!-- The format here is mm-dd-yy -->
<param name="min">1/1/70</param>
<param name="max">12/31/05</param>
<message key="Please enter a valid date"/>
</field-validator>
</field>
<!--
<field name="postalcode">
<field-validator type="requiredstring">
<message key="requiredstring"/>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^\d*$]]></param>
<message key="requiredinteger"/>
</field-validator>
</field>
-->
</validators>
package com.example.struts2.shopcart.model.domain;
public class Book {
private int bookId;
private String bookName;
private int categoryId;
private double bookPrice;
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public int getCategoryId() {
return categoryId;
}
public void setCategoryId(int categoryId) {
this.categoryId = categoryId;
}
public double getBookPrice() {
return bookPrice;
}
public void setBookPrice(double bookPrice) {
this.bookPrice = bookPrice;
}
public Book(int bookId, String bookName, int categoryId, double bookPrice) {
super();
this.bookId = bookId;
this.bookName = bookName;
this.categoryId = categoryId;
this.bookPrice = bookPrice;
}
public Book() {}
}
package com.example.struts2.shopcart.model.domain;
public class Category {
private int categoryId;
private String categoryName;
public Category() {}
public Category(int categoryId,String categoryName){
this.categoryId=categoryId;
this.categoryName=categoryName;
}
public int getCategoryId() {
return categoryId;
}
public void setCategoryId(int categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
}
Step 16: Create a new Java class User in package
com.example.struts2.shopcart.model.domain and paste below code in this class.
package com.example.struts2.shopcart.model.domain;
import java.util.Date;
public class User {
private String firstName;
private String lastName;
private String userName;
private String password;
private String[] hobbies;
private String gender;
private Date birthDate;
private String emailId;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public String getEmailId() {
return emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
Step 17: Create i18n property file ApplicationResources.properties in src folder and paste
below code,
label.userName=UserName
label.password=Password
label.login.submit=Login
label.userName=\u7528\u6237\u540D
label.password=\u5BC6\u7801
label.login.submit=\u63D0\u4EA4
Step 19: Create struts-2.1.7.dtd in src folder and paste below code,
Step 20: Create struts.xml in src folder and paste below code,
<interceptor-ref name="SessionStack"/>
<interceptor-ref name="execAndWait">
<param name="delaySleepInterval">100</param>
</interceptor-ref>
<result name="wait">/jsps/wait.jsp</result>
<result name="success" >/jsps/showbooks.jsp</result>
<result name="input">/jsps/category.jsp</result>
</action>
<action name="selectedbooks"
class="com.example.struts2.shopcart.model.actions.StoreBooksAction">
<interceptor-ref name="SessionStack"/>
<result name="success" >/jsps/showselected.jsp</result>
<result name="input">/jsps/showbooks.jsp</result>
</action>
<action name="makepayment"
class="com.example.struts2.shopcart.model.actions.PaymentAction">
<interceptor-ref name="SessionStack"/>
<result name="Cash" >/jsps/billdetails.jsp</result>
<result name="Card" >/jsps/billdetails.jsp</result>
<result name="input">/jsps/payment.jsp</result>
</action>
<action name="thankyou"
class="com.example.struts2.shopcart.model.actions.PaymentMade" method="execute">
<interceptor-ref name="SessionStack"/>
<result>/jsps/thankyou.jsp</result>
<result name="input">/jsps/billdetails.jsp</result>
</action>
<action name="*Book" method="{1}"
class="com.example.struts2.shopcart.model.actions.BookAction">
<interceptor-ref name="SessionStack"/>
<result>/jsps/success.jsp</result>
</action>
</package>
</struts>
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
freemarker-2.3.16.jar
javassist-3.7.ga.jar
ognl-3.0.jar
struts2-core-2.2.1.jar
struts2-dojo-plugin-2.1.2.jar
xwork-core-2.2.1.jar
Step 24: Create billdetails.jsp in jsps folder and paste below code in this file,
Step 25: Create bookutil.jsp in jsps folder and paste below code in this file,
Step 26: Create category.jsp in jsps folder and paste below code in this file,
Step 27: Create failed.jsp in jsps folder and paste below code in this file,
Step 28: Create index.jsp in jsps folder and paste below code in this file,
Step 29: Create invalidsession.jsp in jsps folder and paste below code in this file,
Step 30: Create login.jsp in jsps folder and paste below code in this file,
<%@page import="java.util.Locale"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login Page</title>
</head>
<body>
<center>
<%
//Locale.setDefault(Locale.CHINA);
String locale=Locale.getDefault().toString();
out.println(" Current Locale :: "+locale);
%>
<s:actionerror/>
<s:form action="login">
<%--
<s:i18n name="com.example.struts2.shopcart.model.actions.LoginApplicationResources">
--%>
<s:textfield name="userName" key="label.userName"/>
<s:password name="password" key="label.password"/>
<%--
</s:i18n>
--%>
<%--This action attrib must be set as name in struts.xml for corresponding action --%>
<s:submit name="login" key="label.login.submit" action="log"/>
</s:form>
</center>
</body>
</html>
Step 31: Create logout.jsp in jsps folder and paste below code in this file,
<body>
<h2>Logged Out Successfully</h2>
<%
session.invalidate();
%>
</body>
</html>
Step 32: Create payment.jsp in jsps folder and paste below code in this file,
Step 33: Create register.jsp in jsps folder and paste below code in this file,
<sd:head parseContent="true"/>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Register Page</title>
</head>
<body>
<center>
<s:actionerror/>
<s:form action="register">
<s:textfield name="firstName" label="First Name "/>
<s:textfield name="lastName" label="Last Name "/>
<s:textfield name="userName" label="User Name" />
<s:password name="password" label="Password" />
<s:radio name="gender" label="Gender" list="{'Male','Female'}" />
<s:checkboxlist list="{'Sports','Travel','Reading'}" name="hobbies" label="Hobbies" />
<s:fielderror fieldName="hobbies"/>
<%--Shows datepicker from 1970 to 2005 --%>
<sd:datetimepicker name="birthDate" label="BirthDate : " displayFormat="dd/MM/yy"/>
<s:textfield name="emailId" label="Email-Id"/>
<s:submit value="Register"/>
</s:form>
</center>
</body>
</html>
Step 34: Create showbooks.jsp in jsps folder and paste below code in this file,
Step 35: Create showselected.jsp in jsps folder and paste below code in this file,
Step 36: Create success.jsp in jsps folder and paste below code in this file,
Step 37: Create thankyou.jsp in jsps folder and paste below code in this file,
<center>
<h2>Thank You for BILL Do visit again</h2>
<h2><s:text name=" Recieved The Amount of Rs. "/><s:text name="#session.bill"/> </h2>
</center>
</body>
</html>
Step 38: Create wait.jsp in jsps folder and paste below code in this file,