udit mittal
udit mittal

Reputation: 537

Not able to view ActionMessages in my JSP and problems with validation in Struts 2

I am having various problems with my code:

  1. I am not able to view my ActionMessages and ActionErrors set by LoginAction
  2. Once I log in, if I again go to URL: /login, it does not redirect me to success page.

EDIT:

  1. I am able to redirect successfully now if the session alreay exists. I had to make 2 changes that i figured out:
  1. But I am still not able to view my ActonErrors and ActionMessages.

  2. Is it necessary to use <s:form>. Because it disturbs my CSS and I am not able to find solutions to correct that. Can I assign ID attribute in <s:form> ?

Following is my JSP code:

...
        <s:if test="hasActionErrors()">
            <div id="errorMessage"><s:actionerror /></div>
        </s:if>
        <s:if test="hasActionMessages()">
            <div id="errorMessage"> <s:actionmessage /></div>
        </s:if>
        <form action="login" method="POST" id="login-form">
            <fieldset>
                <p>
                    <label for="loginUserName">username</label>
                    <input type="text" id="loginUserName" maxlength="10" placeholder="Eg. EMP0000000" 
                    title="User ID is of format EMP0000000" pattern="(EMP)([0-9]{7})" required
                     name="loginUserName" class="round full-width-input" autofocus />
                </p>

                <p>
                    <label for="loginPassword">password</label>
                    <input type="password" name="loginPassword" maxlength="20" id="loginPassword" required 
                    class="round full-width-input" />
                </p>
                
                <p>I've <a href="#">forgotten my password</a>.</p>
                
                <input type="submit" class="button round blue image-right ic-right-arrow" value="LOG IN" />

            </fieldset>

        </form>
...

Here is my 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.enable.DynamicMethodInvocation" value="false" />
        <constant name="struts.devMode" value="false" />

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

            <interceptors>
                <interceptor name="login" class="com.sreebhog.interceptors.LoginInterceptor" />
        
                <interceptor-stack name="loginStack">
                    <interceptor-ref name="login" ></interceptor-ref>
                    <interceptor-ref name="defaultStack" ></interceptor-ref>
                </interceptor-stack>
            </interceptors>
                <default-interceptor-ref name="loginStack"></default-interceptor-ref>
            <global-results>
                <result name="loginRedirect">/login </result>
            </global-results>
        
            <action name="login" class="com.sreebhog.actions.LoginAction">
                <result name="input">/JSP/sreebhog_login.jsp</result>
                <result name="success">/JSP/index.jsp</result>
            </action>
            <action name="logout" class="com.sreebhog.actions.LogoutAction">
                <result name="logout">/JSP/sreebhog_login.jsp</result>
            </action>
        </package>


</struts>

Here is my LoginAction:

package com.sreebhog.actions;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;

import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;
import com.sreebhog.dao.EmployeeDAO;
import com.sreebhog.interfaces.LoginRequired;
import com.sreebhog.model.dto.Employee;
import com.sreebhog.utility.Cryptography;

public class LoginAction extends ActionSupport implements SessionAware,LoginRequired {
    
    private String loginUserName;
    private String loginPassword;
    
    SessionMap<String,Object> sessionMap;
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    public void setSession(Map map) {
        sessionMap=(SessionMap) map;
        sessionMap.put("username", loginUserName);
    }
        
    public String execute()
    {
        String userName = null;
          if (sessionMap.containsKey("username"))
          { 
              userName = (String) sessionMap.get("username");
              if (userName != null )
              {
                  if (!userName.equals(""))
                  {
                      return SUCCESS;
                  }
              }
          }
          
        EmployeeDAO employeeDao = new EmployeeDAO();
        Employee employee = employeeDao.find(this.getLoginUserName());
        if (employee == null || employee.getUserName().equals(""))
        {
            System.out.println("Here1");
            addActionError("Username or password is invalid");
            return INPUT;
        } else
            try {
                if (employee.getPassword().equals(Cryptography.getHash("SHA-1", this.getLoginPassword(), employee.getSalt())))
                {
                    System.out.println("Here2");
                    addActionError("Username or password is invalid");
                    return INPUT;
                }
                else {
                    System.out.println("Here3");
                    sessionMap.put("username",(String)loginUserName);
                    sessionMap.put("role",(String)employee.getPermissions().getRole());
                    return SUCCESS;
                }
            } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        return INPUT;
    }
    
    public void validate()
    {
        
        if (loginUserName == null || loginUserName.equals("") || loginPassword == null || loginPassword.equals(""))
        {
            addActionError("Please fill in username and password");
        }
    }

    public String logout()
    {
        sessionMap.invalidate();
        return INPUT;
    }

    public String getLoginUserName() {
        return loginUserName;
    }

    public void setLoginUserName(String loginUserName) {
        this.loginUserName = loginUserName;
    }

    public String getLoginPassword() {
        return loginPassword;
    }

    public void setLoginPassword(String loginpassword) {
        this.loginPassword = loginpassword;
    }

}

Here is my LoginInterceptor:

package com.sreebhog.interceptors;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.sreebhog.actions.LoginAction;
import com.sreebhog.interfaces.LoginRequired;

public class LoginInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(final ActionInvocation invocation) throws Exception {
        Map<String, Object> session = ActionContext.getContext().getSession();
        String userName = (String) session.get("username");

        if (userName != null && !userName.equals("")) {
            return invocation.invoke();
        }

        Object action = invocation.getAction();

        if (!(action instanceof LoginRequired)) {
            return invocation.invoke();
        }

        if (!(action instanceof LoginAction)) {
            return "loginRedirect";
        }

        return invocation.invoke();
    }
}

Upvotes: 2

Views: 4050

Answers (3)

udit mittal
udit mittal

Reputation: 537

Problem solved. I can't believe i did that. Forgot to place tag-lib in my jsp page. Thanks everyone for help.

Upvotes: 1

Roman C
Roman C

Reputation: 1

  1. you were not able to view action messages because you didn't set it via addActionMessage. The action errors you should see. Also check that !loginUserName.equals("null").

  2. Once you logged in and requested /login you check the session object username in the interceptor and it should not be empty then login action invoked. But the parameters are empty, they are only available when you submit the form. Validation should fail and return to the input. Also don't put the username to the map when the session is injected, do it before return success.

Upvotes: 0

sumit sharma
sumit sharma

Reputation: 1057

put the error message tag and message tag in form. loke as follow

<s:form>
            <div id="errorMessage"><s:actionerror /></div>
            <div id="errorMessage"> <s:actionmessage /></div>

.
.
.
</s:form>

Upvotes: 0

Related Questions