Custom URL in Struts2 for each User

In this tutorial we will see how to assign custom URL for each user logged in Struts2. For example like ‘www.gmail.com/rajesh’  for user rajesh and ‘www.gmail.com/kumar’  for user kumar.

I assume that you already have a basic knowledge over struts 2 framework setup and simple Struts2 application. If you are not familiar please refer Struts2 Introduction and HelloWorld application.

To create custom URL for each user first we have to set the below constants in the struts.xml.

<constant name="struts.action.extension" value=",,action" />
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
<constant name="struts.enable.SlashesInActionNames" value="true" />
<constant name="struts.patternMatcher" value="regex" />

The first constant struts.action.extension  is to disable the default .action extension from the URL pattern. The next two constants struts.mapper.alwaysSelectFullNamespace  and struts.enable.SlashesInActionNames for transfering the parameter from the URL. The last one struts.patternMatcher is to use regular expression in the action names (For example <action name=”Lost*do”>).

Next is we have to map the request to an action. To do this create an action like below in struts.xml.

<action name="{username}" class="com.rajesh.struts2.CustomURL" method="customUrl">
    <result name="success">welcome.jsp</result>
</action>

In the above code we mapped the string whichever comes next to the application context to the field username. For example if the request is http://localhost:8080/CustomURL/rajesh  the framework will assign the value ‘rajesh’ to username field and then will proceed like normal struts2 flow. But one important thing is it will not accept slash in that. For example if the request is http://localhost:8080/CustomURL/test/rajesh the framework will not call the above action. Because the request is for inside a package test. See the finalized code of struts.xml below.

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.action.extension" value=",,action" />
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.patternMatcher" value="regex" />

    <package name="default" namespace="/" extends="struts-default">

        <action name="">
            <result name="success">home.jsp</result>
        </action>

        <action name="{username}" class="com.rajesh.struts2.CustomURL" method="customUrl">
            <result name="success">welcome.jsp</result>
        </action>

    </package>
</struts>

In the above code we added one more action with empty name “”. It is for the index page. So when we type simply the url http://localhost:8080/CustomURL the home.jsp will be displayed. See our home.jsp below.See our welcome.jsp below.

welcome.jsp

<html>

<head>
    <title>Struts 2 Custom URL</title>
    <script src="jquery-1.11.1.min.js"></script>
    <script>
        function myFunction() {
            window.location.href = $("#username").val();
        }
    </script>
</head>

<body>
    <h1>Struts 2 Custom URL</h1>
    <h3>Enter User Name</h3>
    <input type="text" id="username" />
    <input type="submit" value="Login" onclick="myFunction()" />
</body>

</html>

See our action class CustomURL.java below

CustomURL.java

package com.rajesh.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class CustomURL extends ActionSupport {

    private static final long serialVersionUID = -4337790298641431230L;

    private String username;

    public String getUsername() {
        System.out.println("Inside Getter");
        return username;
    }

    public void setUsername(String username) {
        System.out.println("Inside Setter " + username);
        this.username = username;
    }

    public String customUrl() {
        return SUCCESS;
    }
}

That’s all. Simply place all the above codes in respective files and run.

custom_url_demo_1
custom_url_demo_2
For the above example I have created a complete .war file with source code. Download and just place under Apache web apps folder and run.

If you face any issues while execution please post in comments or send email to rajeshmepco@gmail.com

Posted in Struts2 | Tagged | 1 Comment

Apache HTTP Server – An Introduction

Apache is the world’s most popular Web server/HTTP server. We will see the overview of apache HTTP server here.

How to start / stop / restart apache ?

./httpd -f configfilepath -k (start|stop|restart)

How to run syntax test for configuration file ?

./httpd -f configfilepath -t

Configuration

Modules

  • Apache is a modular server, only the most basic functionality is included in the core server.
  • Extended features can be loaded into Apache using LoadModule directive ( Only if the server is compiled to use dynamically loaded modules).

Directives

  • Apache directives are a set of rules which define how your server should run.
  • We can change them by editing the httpd.conf and related files to meet your requirements.

Scope of Directives

Posted in Apache | Tagged , | Leave a comment

Dynamic Drop Down List with Struts2 UI tag without AJAX, jQuery

In this tutorial session we will create simple application to load the drop down list options dynamically from the server side. Also we will use only struts 2 UI tag, not ajax or jquery.

In our previous example we used ajax call to load the drop down options from server side via jquery. Here not.

We assume that we already have a very basic knowledge over struts2 setup. If not please refer our Hello World application. To achieve our goal first create a simple jsp file as below.

home.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
    <html>

    <head>
        <script src="js/jquery-1.11.1.min.js"></script>
        <script>
            $(function () {

                //We commented this code because we are directly loading the drop down options via struts UI tag
                /*$('#state').html('');
		$.getJSON("readStates", function(res) {
			for ( var i = 0; i < res.states.length; i++) {
				$('#state').append(
						'<option value='+res.states[i]+'>' + res.states[i]
								+ '</option>');
			}
		});*/

                $("#state").change(
                    function () {
                        $('#district').html('');
                        var state = {
                            "state": $("#state").val()
                        };
                        $.ajax({
                            url: "readDistricts",
                            data: JSON.stringify(state),
                            dataType: 'json',
                            contentType: 'application/json',
                            type: 'POST',
                            async: true,
                            success: function (res) {
                                console.log(res.districts.length);
                                for (var i = 0; i < res.districts.length; i++) {
                                    console.log(" " + res.districts[i]);
                                    $('#district').append(
                                        '<option value=' + res.districts[i] + '>' + res.districts[i] + '</option>');
                                }
                            }
                        });
                    });
            });
        </script>
    </head>

    <body>
        <h3>Struts 2 Dynamic Drop down List</h3>
        <s:select label="What's your State" headerKey="-1" headerValue="Select State" list="states" name="state" value="defaultState" />
District :<select id="district"></select>
    </body>

    </html>

Then in web.xml divert all requests to struts2 framework as usual. See the web.xml below.

Also please note that we never mentioned the welcome file list in our web.xml. (i.e) Home page. We will handle that in our struts.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>DynamicData</display-name>

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

See our struts.xml below.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="default" namespace="/" extends="json-default">
        <interceptors>
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="json">
                    <param name="enableSMD">true</param>
                </interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="defaultStack" />

        <action name="readDistricts" class="com.rajesh.struts2.ReadData" method="dbDistricts">
            <result type="json"></result>
        </action>

        <action name="" class="com.rajesh.struts2.ReadData" method="dbStates">
            <result name="success">home.jsp</result>
        </action>

    </package>
</struts>

What is the change we made in our struts.xml. We mapped a empty action to a class and if the result is success then we are rendering the page home.jsp to the browser. Why instead of mentioning the home page in web.xml we mentioned in struts.xml? There is a reason behind that. We will discuss it later.

Now see the corresponding action class ReadData.java below.

ReadData.java

package com.rajesh.struts2;

import java.util.ArrayList;

import com.opensymphony.xwork2.ActionSupport;

public class ReadData extends ActionSupport {

    private static final long serialVersionUID = -8819352697303500472L;
    private String state;
    private ArrayList < String > districts;
    private ArrayList < String > states;

    public ReadData() {
        System.out.println("Inside Constructor ");
        states = new ArrayList < String > ();
        states.add("tamilnadu");
        states.add("kerala");
        states.add("karnataka");
        states.add("delhi");
    }

    public String getDefaultState() {
        System.out.println("Inside default State Getter");
        return "Select State";
    }

    public ArrayList < String > getDistricts() {
        return districts;
    }

    public ArrayList < String > getStates() {
        return states;
    }

    public void setState(String state) {
        System.out.println("Inside Setter " + state);
        this.state = state;
    }

    public String dbDistricts() {
        System.out.println("Getting Districts for " + state);
        // Do the database code or business logic here.
        districts = new ArrayList < String > ();
        if (state.equalsIgnoreCase("tamilnadu")) {
            districts.add("chennai");
            districts.add("madurai");
            districts.add("trichy");
            districts.add("Covai");
            districts.add("Pudukkottai");
        } else if (state.equalsIgnoreCase("kerala")) {
            districts.add("allappey");
            districts.add("trivandrum");
            districts.add("kozhikkode");
        } else if (state.equalsIgnoreCase("karnataka")) {
            districts.add("bangalore");
            districts.add("Bommanahalli");
            districts.add("Mysore");
        } else if (state.equalsIgnoreCase("-1")) {} else {
            districts.add("District 1");
            districts.add("District 2");
            districts.add("District 3");
            districts.add("District 4");
            districts.add("District 5");
        }
        return SUCCESS;
    }

    public String dbStates() {
        // Do the database code or business logic here.
        System.out.println("Inside dbStates method");
        return SUCCESS;
    }
}

That’s all the setup. But we need to know why we rendered the home page via struts.xml? Also the empty action pointed to the method dbStates() is not doing anything. It simply returns a “success”  string. Then why?

The answer is here. In our home page home.jsp we used struts2 tag for the drop down list. See the code

<s:select label="What's your State" headerKey="-1" 
headerValue="Select State" list="states" name="state" value="defaultState" />

So if we render the page directly from web.xml it don’t have any values for the drop down list options. We need to run some code before rendering the page. Right? That’s why we diverted the empty action to ReadData.java . See the constructor of the ReadData.java .

public ReadData() {
    System.out.println("Inside Constructor ");
    states = new ArrayList < String > ();
    states.add("tamilnadu");
    states.add("kerala");
    states.add("karnataka");
    states.add("delhi");
}

So when we point to this class it will automatically creates an arraylist and fills it with the required value. So after this constructor executed the control will go to the dbStates() method. There we simply returns a “success” string. So the control will come back to struts.xml. There we mentioned <result name=”success”>home.jsp</result> . So it will render the page home.jsp to the browser.

But the difference is while render the page home.jsp. When it comes to the Struts UI tag

<s:select label="What's your State" headerKey="-1" 
headerValue="Select State" list="states" name="state" value="defaultState" />

it will look for method getStat() in the action class. Because we mentioned the name as state. So as per struts 2 design pattern it will try to run a method by name getStat() .

As we have that method in our action class it will get executed. Then with the return value as arraylist it will be filled inside the drop down list by the framework and rendered to the browser .

Simply run the code as below http://localhost:8080/DynamicData/ and see the result in action.
struts2UI_dropdown

For the above example I have created a complete .war file with source code. Download and just place under Apache web apps folder and run.

If you face any issues while execution please post in comments or send me email to rajeshmepco@gmail.com

Posted in Struts2 | Tagged , , , , | 3 Comments

Dynamic Drop Down List with Struts 2 and AJAX

In this tutorial session we will create simple application to load the drop down list options dynamically from the server side. Also we will load one drop down list based on the selection of another drop down list.

We use AJAX, JQuery, Struts2 and json methodologies to achieve this. Also we assume the basic setup for struts2 is already ready. (i.e) All necessary jar files placed in right place. If you want more info please refer the Struts 2 Hello World application.

Create a simple html file with the below content.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
    <script src="js/jquery-1.11.1.min.js"></script>
    <script>
        $(function () {
            $('#state').html('');
            $.getJSON("readStates", function (res) {
                for (var i = 0; i < res.states.length; i++) {
                    $('#state').append(
                        '<option value=' + res.states[i] + '>' + res.states[i] + '</option>');
                }
            });

            $("#state").change(
                function () {
                    $('#district').html('');
                    var state = {
                        "state": $("#state").val()
                    };
                    $.ajax({
                        url: "readDistricts",
                        data: JSON.stringify(state),
                        dataType: 'json',
                        contentType: 'application/json',
                        type: 'POST',
                        async: true,
                        success: function (res) {
                            console.log(res.districts.length);
                            for (var i = 0; i < res.districts.length; i++) {
                                console.log(" " + res.districts[i]);
                                $('#district').append(
                                    '<option value=' + res.districts[i] + '>' + res.districts[i] + '</option>');
                            }
                        }
                    });
                });
        });
    </script>
</head>

<body>
    <h3>Struts 2 Dynamic Drop down List</h3>
    State :
    <select id="state"></select>District :
    <select id="district"></select>
</body>

</html>

Create struts.xml file with the below content and place it under class folder root path.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="default" namespace="/" extends="json-default">
        <interceptors>
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="json">
                    <param name="enableSMD">true</param>
                </interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="defaultStack" />

        <action name="readDistricts" class="com.rajesh.struts2.ReadData" method="dbDistricts">
            <result type="json"></result>
        </action>

        <action name="readStates" class="com.rajesh.struts2.ReadData" method="dbStates">
            <result type="json"></result>
        </action>

    </package>
</struts>

As we are sending and receiving the data as json object we need to enable the json option in the struts.xml file. So implement a custom interceptor and json result type as above. (To do this struts2-json-plugin.jar is required)

See our web.xml file below.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>HelloStruts</display-name>

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<welcome-file-list>
		<welcome-file>/index.html</welcome-file>
	</welcome-file-list>
</web-app>

Also create the java class ReadData which contains the business logic with the below code and place under com.rajesh.struts2 package in the class folder.

package com.rajesh.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class ReadData extends ActionSupport {

    private static final long serialVersionUID = -8819352697303500472L;

    private String state, district;
    private String states[], districts[];

    public String[] getDistricts() {
        return districts;
    }

    public void setDistricts(String[] districts) {
        this.districts = districts;
    }

    public String[] getStates() {
        return states;
    }

    public void setStates(String[] states) {
        this.states = states;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        System.out.println("Inside Setter " + state);
        this.state = state;
    }

    public String getDistrict() {
        return district;
    }

    public void setDistrict(String district) {
        this.district = district;
    }

    public String dbDistricts() {
        System.out.println("Getting Districts for " + state);
        //Do the database code or business logic here.
        districts = new String[5];
        if (state.equalsIgnoreCase("tamilnadu")) {
            districts[0] = "chennai";
            districts[1] = "madurai";
            districts[2] = "trichy";
            districts[3] = "Covai";
            districts[4] = "Pudukkottai";
        } else if (state.equalsIgnoreCase("kerala")) {
            districts[0] = "allappey";
            districts[1] = "trivandrum";
            districts[2] = "kozhikkode";
            districts[3] = "District 4";
            districts[4] = "District 5";
        } else if (state.equalsIgnoreCase("karnataka")) {
            districts[0] = "bangalore";
            districts[1] = "Bommanahalli";
            districts[2] = "Mysore";
            districts[3] = "District 4";
            districts[4] = "District 5";
        } else {
            districts[0] = "District 1";
            districts[1] = "District 2";
            districts[2] = "District 3";
            districts[3] = "District 4";
            districts[4] = "District 5";
        }
        return SUCCESS;
    }

    public String dbStates() {
        //Do the database code or business logic here.
        states = new String[5];
        states[0] = "tamilnadu";
        states[1] = "kerala";
        states[2] = "karnataka";
        states[3] = "delhi";
        states[4] = "kashmir";
        return SUCCESS;
    }
}

See the complete structure of the folder below.

dynamic_dd_structure

That’s all. Simply run the program as below and see the result in action.

http://localhost:8080/DynamicData/

dynamic_dd

For the above example I have created a complete .war file with source code. Download and just place under Apache web apps folder and run.

If you face any issues while execution please post in comments or send me email to rajeshmepco@gmail.com

Posted in Struts2 | Tagged , , , | 5 Comments

Struts2 Tutorial Part 2 – HelloWorld application

In this tutorial session we will create simple helloStruts application. To create a simple struts2 application follow the steps below.

I assume we already have a basic knowledge over jsp/servlet workflow.

As per jsp/servlet whenever we create new jsp/servlet application, the control will look for web.xml inside the application context WebContent/WEB-INF folder. Application Context is nothing but the application name referred by the servlet container (ex. Apache tomcat). See the sample web.xml below.

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>helloStruts</display-name>
    <welcome-file-list>
        <welcome-file>/index.html</welcome-file>
    </welcome-file-list>
</web-app>

So the first step we need to do is to divert all requests from web.xml to our struts2 config file. The config file for struts 2  is struts.xml which is fixed. (i.e) We cannot rename the file.

How can we divert the request?

We knew that in web.xml we can add filters to url patterns to do pre/post processing. Here we will use that approach to divert the requests. (i.e) We add a filter to all the url patterns and divert to struts 2 config file.  For that add the below code in web.xml.

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

What we done in the above code is, we added a filter struts2 to all the patterns (*). So that filter will call the class org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.

No more changes required in the web.xml file. See the consolidated web.xml file below.

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>HelloStruts</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>/index.html</welcome-file>
    </welcome-file-list>
</web-app>

Next step is we have to create the configuration file struts.xml for all the requests. As discussed the name of the config file is struts.xml which should be in the class folder root path. See the struts.xml below.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="home">
            <result>/welcome.jsp</result>
        </action>
    </package>
</struts>

Then create a file with above code and save it with name struts.xml and place it under class folder root path. (i.e) WebContent/WEB-INF folder.

Next step we need to do is adding the necessary jar files to the library. Download the struts2 library files and place it under lib folder inside WEB-INF folder. All the jar files are not required for basic application. For most application below listed jars are enough. Later if we require we can add the necessary jars to the library.

struts2-jars

Next step is to create a necessary jsp, html files. Create the below two files namely index.html and welcome.jsp with the below content and place it under WebContent folder.

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <META HTTP-EQUIV="Refresh" CONTENT="0;URL=home">
</head>
<body>
    <h3>One moment please.</h3>
</body>
</html>

 welcome.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>

    <head>
        <style>
            h1 {
                color: blue;
            }
        </style>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Welcome to Struts2</title>
    </head>

    <body>
        <h1>Welcome to Struts2</h1>
    </body>

    </html>

That’s all. See the final structure of the folders below.

struts2-structure

Run the project in eclipse by Run as -> Run on server in eclipse or place the folder structure above in the web-apps folder in tomcat. Then type the below code in the browser (if tomcat is running under port 8080).

http://localhost:8080/helloStruts

You will get the below screen.
struts2-home

For the above method I have created a complete .war file with source code. Download and just place under Apache web apps folder and run.

If you have any issues while execution please post in comments or send mail to rajeshmepco@gmail.com.

Posted in Struts2 | Tagged | Leave a comment

Send HTML Form data to struts2 action by Model Driven method

HTML form data can be transferred to Struts2 Action in three ways.

1. Normal Method with simple getters() and setters()
2. Object Backed Method
3. Model Driven Method

We will see the third method now.

Model Driven Method

Another way of transfering the form data directly inside the object is Model Driven approach. This approach is the best among all the three because for this approach no need to specify the field names deeply. We can define the fields as usual.

Create a simple jsp file index.jsp with struts2 form tags as below. Note that we never named the fields deeply like what we did earlier for object backed approach.

<%@ taglib prefix="s" uri="/struts-tags" %>
    <html>

    <head>
        <title>Struts Data Transfer - Normal Transfer Method</title>
    </head>

    <body>
        <h3>Struts Data Transfer - Normal Transfer Method</h3>
        <s:form action="register">
            <s:textfield name="fname" label="First name" />
            <s:textfield name="lname" label="Last name" />
            <s:textfield name="email" label="Email" />
            <s:textfield name="age" label="Age" />
            <s:submit />
        </s:form>
    </body>

    </html>

So As per the jsp page when the form is getting submitted it will look for an action with name register. See out struts.xml below.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.custom.i18n.resources" value="ApplicationResources" />

    <package name="default" extends="struts-default" namespace="/">
        <action name="register" class="com.rajesh.dataTransfer.Register" method="register">
            <result name="success">success.jsp</result>
        </action>
    </package>
</struts>

In our Struts.xml we pointed the register action to register() method in the Register class. So when the form is getting submitted the control will go the register() method.  Now see the Register action class below.

package com.rajesh.dataTransfer;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("rawtypes")
public class Register extends ActionSupport implements ModelDriven {
    private static final long serialVersionUID = -367986889632883043L;
    private User user = new User();

    public User getModel() {
        return user;
    }

    public String register() {
        System.out.println("Inside Action Method");
        System.out.println(user.getFname());
        System.out.println(user.getLname());
        System.out.println(user.getAge());
        System.out.println(user.getEmail());
        return SUCCESS;
    }
}

In our register action class we made two changes from Object backed method. One is the class implements ModelDriven interface and it’s method getModel(). So while the control look for setter methods it will run the getModel() method. Then it will take care of the data movement from form to object. Finally it will simply return the user object.

How this is achieved is by the framework interface ModelDriven. One important thing here is we have to create the User Object explicitly outside the method. And as usual the User class should have all the setters() and getters() for the required variables. See our User class below.

package com.rajesh.dataTransfer;

public class User {
    private String fname;
    private String lname;
    private int age;
    private String email;

    public String getFname() {
        return fname;
    }

    public void setFname(String fname) {
        this.fname = fname;
    }

    public String getLname() {
        return lname;
    }

    public void setLname(String lname) {
        this.lname = lname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

So the Struts2 framework will execute the getModel() method before executing the actual action method, in our case register(). So while executing the getModel() method it will look for all the submitted data and if it matches with the method return type then  it will call the corresponding setter methods and return as object. Thus all the variables will be assigned to the user object and then returned.

In our action method we just displayed the values in the console, then returning success message as result name. So as we mentioned the result page is success.jsp for string “SUCCESS” struts2 will load the page success.jsp to the user. See our success.jsp below.

<%@ taglib prefix="s" uri="/struts-tags" %>
    <html>

    <head>
        <title>Struts Data Transfer - Normal Transfer Method</title>
    </head>

    <body>
        <h3>Struts Data Transfer - Normal Transfer Method</h3>
        <h4>User Data saved successfully</h4>
        First Name:<s:property value="fname" />
        <br>Last Name:<s:property value="lname" />
        <br>Email:<s:property value="email" />
        <br>Age:<s:property value="age" />
        <br>
    </body>

    </html>

What will happen for those tags like <s:property value =”fname”/> . Struts2 will look for getter() methods in the corresponding action class. As we discussed earlier due to ModelDriven interface implementation both the getter and setter process will be take care by the framework.

So it will run the getModel method and runs the getter methods inside the User object then it will return the object with all values. Then all the fields will be filled then returned to the user as a rendered page.

For the above method I have created a complete .war file with source code. Download and just place under Apache web apps folder and run.

If you have any issues while execution please post in comments or send mail to rajeshmepco@gmail.com.

Posted in Struts2 | Tagged , | Leave a comment