Java 无法从Struts 2中的会话获取属性

Java 无法从Struts 2中的会话获取属性,java,jsp,session,struts2,Java,Jsp,Session,Struts2,我是Struts2新手,正在尝试检索在action类中设置的属性 LoginAction.java: public class LoginAction extends ActionSupport implements SessionAware { private static final long serialVersionUID = 1L; private Map<String, Object> session; // field variables

我是Struts2新手,正在尝试检索在action类中设置的属性

LoginAction.java

public class LoginAction extends ActionSupport implements SessionAware {
    private static final long serialVersionUID = 1L;

    private Map<String, Object> session;

    // field variables

    @Override
    public String execute() {
        UserManager um = new UserManager();
        String registeredPassword = um.getCurrentUserDetail("user_password", getUserId());

        if(getUserPassword().equals(registeredPassword)) {
            String currentUserId = um.getCurrentUserDetail("user_id", userId);
            int currentUserType = um.getCurrentUserType(userId);

            session.put("currentUserId", (String) currentUserId);
            session.put("currentUserType", (Integer) currentUserType);

            System.out.println("You have successfully logged in!");
            return SUCCESS;
        }

        System.out.println("Your login has failed!");
        return ERROR;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    // getters and setters
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="default" extends="struts-default">
        <action name="login" class="com.mypackage.model.LoginAction">
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
    </package>
</struts>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ page import="com.mypackage.model.LoginAction" %>

<head>    
<%
    int type = 0;

    if(session.containsKey("currentUserType")) {
        type = (Integer) session.get("currentUserType");
    }
%>
</head>
index.jsp

public class LoginAction extends ActionSupport implements SessionAware {
    private static final long serialVersionUID = 1L;

    private Map<String, Object> session;

    // field variables

    @Override
    public String execute() {
        UserManager um = new UserManager();
        String registeredPassword = um.getCurrentUserDetail("user_password", getUserId());

        if(getUserPassword().equals(registeredPassword)) {
            String currentUserId = um.getCurrentUserDetail("user_id", userId);
            int currentUserType = um.getCurrentUserType(userId);

            session.put("currentUserId", (String) currentUserId);
            session.put("currentUserType", (Integer) currentUserType);

            System.out.println("You have successfully logged in!");
            return SUCCESS;
        }

        System.out.println("Your login has failed!");
        return ERROR;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    // getters and setters
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="default" extends="struts-default">
        <action name="login" class="com.mypackage.model.LoginAction">
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
    </package>
</struts>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ page import="com.mypackage.model.LoginAction" %>

<head>    
<%
    int type = 0;

    if(session.containsKey("currentUserType")) {
        type = (Integer) session.get("currentUserType");
    }
%>
</head>


但是,方法
containsKey()
get()
对于
会话
返回undefined。如何获取Struts2会话中的属性?

这是因为从Scriptlet您正在读取HttpSession,而不是包装Struts2 SessionMap。你可以阅读

但请帮自己一个忙,避免永远完全使用scriptlet。永远

假设您真的需要为变量赋值(这可能也可以避免,但让我们先进行一小步),请按照Struts的方式进行:


还是一艘班轮


您好,
index.jsp的某些部分根据
类型打开/关闭(0=guest,1=admin,2=user)。不同的用户类型在同一个jsp上看到不同的东西,这就是为什么我需要在jsp中获得
类型。让我发布整个
index.jsp
,展示我试图实现的目标。如果您能在看到整个代码后详细介绍Action类方法,将不胜感激。谢谢。我有一个后续问题,但是是关于Struts2 if else if的。然而,我认为它可能需要它自己的线程,因为它可能会偏离这个主题。感谢您的回复。在标记中使用“value”属性而不是
key
。如果他使用value,那么他也需要指定名称。键=标签+值+名称