无法在我的 JSP 中查看 ActionMessages 以及 Struts 2 中的验证问题

问题描述 投票:0回答:3

我的代码遇到各种问题:

  1. 我无法查看由
    ActionMessages
     设置的 
    ActionErrors
    LoginAction
  2. 登录后,如果我再次访问 URL:
    /login
    ,它不会将我重定向到成功页面。

编辑:

  1. 如果会话已经存在,我现在可以成功重定向。我必须做出 2 个我想出的改变:
  • 首先,在我的动作类中,我在
    void setSession(Map map)
    中设置会话变量,这是错误的(它应该只是一个setter函数)。
  • 其次,我检查了我的
    validate()
    方法中是否存在会话变量,这解决了问题。
  1. 但是我仍然无法查看我的

    ActonErrors
    ActionMessages

  2. 有必要用吗

    <s:form>
    。因为它扰乱了我的 CSS 并且我无法找到解决方案来纠正它。我可以在
    <s:form>
    中分配ID属性吗?

以下是我的JSP代码:

...
        <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>
...

这是我的

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>

这是我的

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;
    }

}

这是我的

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();
    }
}
java hibernate validation jsp struts2
3个回答
1
投票

问题解决了。我不敢相信我竟然这么做了。忘记将 tag-lib 放在我的 jsp 页面中。谢谢大家的帮助。


0
投票

将错误消息标签和消息标签放入表单中。 如下

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

.
.
.
</s:form>

0
投票
  1. 您无法查看操作消息,因为您没有通过

    addActionMessage
    进行设置。您应该看到的操作错误。另请检查
    !loginUserName.equals("null")

  2. 一旦您登录并请求

    /login
    ,您将检查拦截器中的会话对象
    username
    ,它不应该为空,然后调用
    login
    操作。但参数是空的,只有在提交表单时才可用。验证应该失败并返回到
    input
    。另外,在注入会话时不要将
    username
    放入映射中,请在返回
    success
    之前执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.