DisplayTag in Struts2 for pagination

8k views Asked by At

I want to apply pagination to my struts2 web application. When the user logs in, I am redirecting them to the home page, on which I want to display all the users in pagination using the display tag.

I've done research and finally integrated this in my struts2, but when I run the code after login it displays the message Nothing found to display.

When I've done the same thing in struts1.3 by taking example from this site it is working. I have copied the following JAR files to my lib folder:

commons-logging.jar
commons-lang.jar
commons-collections.jar
commons-beanutils.jar
displaytag-1.2.jar

I have also copied displaytag.tld and struts-2.17.dtd to my web-inf folder.

Below is my code:

my profile.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib uri="http://displaytag.sf.net" prefix="display" %>
<%@taglib uri="/struts-tags"  prefix="s" %>
<html>
   <head>
   </head>
<body>
    <div id="wrapper">
        <div id="steps">
            <fieldset class="step">
                <legend>Profile
                    </legend>
                <display:table id="data" name="list" requestURI="/display.action" pagesize="1" >
                    <display:column sortable="true">
                        <p>
                            <label for="username">User Name</label>
                            <input id="username" name="username" value="<s:property value="firstName" />" disabled="disabled"/>
                        </p>
                        <p>
                            <label for="email">Father Name</label>
                            <input id="email" name="email" value="<s:property value="lastName"/>" disabled="disabled" />
                        </p>
                        <p>
                            <label for="password">Age</label>
                            <input  name="password" value="<s:property value="dob"/>" disabled="disabled"/>
                        </p>
                        <p>
                            <label for="address">Address</label>
                            <input name="address"  value="<s:property value="emailID"/>" disabled="disabled"/>
                        </p>
                </fieldset>
                    </div>
                </display:column>
            </display:table>
        </div>
    </div>
</body>
</html>

Struts.xml

<action name="display" class="com.java.action.SearchAction">
        <result name="success">/profile.jsp</result>
        <result name="errror">/error.jsp</result>
</action>

SearchAction.java

private ArrayList<UserBean> list=new ArrayList<UserBean>();
//setter getter 
public String execute()
{
    UserBean rt=new UserBean();
    SearchDB user=new SearchDB();
    this.setList(user.search(gender,age_min,age_max,religion,caste,photo_display));
    return SUCCESS;
}

UserBean.java

public class UserBean {

private String emailID;
private String userName;
private String gender;
private String dob;
private String firstName;
private String lastName;
private int Id;
//setter and getter
}

SearchDB.java

//code to get records. their is no problem here because it is taking records out from db fine.

I am not sure, but my guess is requestURI and name attribute in displaytag because in the example linked above, they are using name="sessionScope.UserForm.userList". Would someone please tell me where I did wrong?

2

There are 2 answers

0
LMeyer On

You probably already solved it but anyway...Try OGNL like so :

<input id="username" name="username" value="%{data.firstName}" disabled="disabled"/>

It uses the getter of your user property directly. By the way, I'm not sure of your disabled tag. You should probably use readonly instead.

0
Jothi On

You have set the total number of records for the display tag like,

<display:table id="data" name="lstEntities"
                        sort="external" uid="row" htmlId="rowid" class="tborder"
                        style="width:100%"  excludedParams="*"
                        pagesize="${pageCriteria.recordsPerPage}" partialList="true"
                        size="${pageCriteria.totalRecords}" export="false"
                        requestURI="XXX.action">





   public class PaginationCriteria implements Cloneable, CommonConstants,
            Serializable {

        /**
         * Holds the Unie value of Class.
         */
        private static final long serialVersionUID = 8047568459658871831L;

        /**
         * Stores cache Mode.
         */
        private boolean cached;

        /**
         * Stores current page number in the user screen.
         */
        private int currentPage;

        /**
         * Holds the Name of the attribute in Entity to be unique.
         */
        private String distinctRootEntityName;

        /**
         * Stores the information about no of entities to be fetched.
         */
        private boolean fetchAll;

        /**
         * Stores the information about no. of records to be fetched.
         */
        private int recordsPerPage;

        /**
         * Stores the secondary sort column of the entity.
         */
        private String secondarySortBy;

        /**
         * Stores the Sort column of the entity.
         */
        private String sortBy;

        /**
         * Stores the sort order of the entity.
         */
        private boolean sortDescending;

        /**
         * Stores total no. of records.
         */
        private int totalRecords;

//Getters and setters of this properties   

}

From the action class set the records per page and first record of the page and everything. in the query execution set the total number of execution. Have this domain object in Action class.

In action clas use the below method to set up pagination information,

/**
     * Fills the Sort column, order, page number to be retrieved.
     * 
     * @param tableId -
     *        Display tag table Id to retrieve the Sort column, order, page
     *        number
     * @param defaultOrderCoulmn -
     *        If no parameter passed for sorting default order column will be
     *        applied.
     */
    protected void fillPaginationInfo(final String tableId,
            final String defaultOrderCoulmn, final String secondarySortColumn) {
        BaseAction.LOGGER.debug(BaseAction.LOG_PREFIX
                + "calling fillPaginationInfo param: tableId :" + tableId
                + "\ndefaultOrderCoulmn:" + defaultOrderCoulmn);
        this.getPageCriteria().setCurrentPage(
                this.getPageNumber(this.getHttpRequest(), tableId));
        String orderBy = this.getSortColumn(this.getHttpRequest(), tableId);
        this.getPageCriteria().setSortBy(
                orderBy == null || orderBy.equals("null") ? defaultOrderCoulmn
                        : orderBy);
        this.getPageCriteria().setSortDescending(
                this.getSortOrderDesc(this.getHttpRequest(), tableId));
        if (secondarySortColumn != null)
            this.getPageCriteria().setSecondarySortBy(secondarySortColumn);
        BaseAction.LOGGER.debug(BaseAction.LOG_PREFIX
                + "done fillPaginationInfo");
    }

Hope it would helps. let me know if u need any other info.