java - 无法从 Struts 2 中的 session 获取属性

标签 java jsp session struts2

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

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
}

struts.xml:

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

index.jsp:

<%@ 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() 方法对于 session 返回未定义。如何获取在 Struts2 中放入 session 的属性?

最佳答案

发生这种情况是因为您正在从 Scriptlet 读取 HttpSession,而不是包装的 Struts2 SessionMap。您可以阅读more info here .

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

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

<s:set var="type" value="0" />
<s:if test='#session.containsKey("currentUserType")'>
    <s:set var="type" value='#session["currentUserType"]' />
</s:if>

或者单行

<s:set var="type" 
     value='%{#session["currentUserType"]!=null?#session["currentUserType"]:0}'

或者更好,在 Action 类中:

public Integer getType(){
    return session.containsKey("currentUserType") 
                   ? session.get("currentUserType") 
                   : 0;
}
<小时/>

编辑

我知道你想要实现什么目标。我只是告诉你有几种更好的选择。您觉得这个 JSP 干净吗?

例如,如果您有三个主要配置文件,则可以为 header 创建三个 JSP 片段,并使用 <s:if type="...仅包含正确的一个(使用 <jsp:include> ,或更好的 <s:include> ,而不是使用 <%@ include %> )。

考虑将 main-head.jsp 包含在所有 JSP 中;

在 main-head.jsp 中:

<s:if test="type==0">
    <s:include page="guest-head.jsp"/>
</s:if>
<s:elseif test="type==1">
    <s:include page="admin-head.jsp"/>
</s:elseif>
<s:elseif test="type==2">
    <s:include page="user-head.jsp"/>
</s:elseif>

仍然丑陋(这是一个开始),但好多了。

答案的第一部分仍然完全有效,但也请记住这个新部分,以改进页面的设计。

关于java - 无法从 Struts 2 中的 session 获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912114/

相关文章:

java - 我如何控制 Spring 从队列接收的速率?

java - SharedPreferences.Editor apply() 失败

java - 这是相同还是不同的 pageContext 范围和 JSP 页面中的一些隐式对象?

java - 如何从另一个页面获取属性

php - 在 Laravel 5 中使用数据库 session 存储时更改 last_activity 列的类型

c# - 异常返回 : unable to evaluate expression because the code is optimized or a native frame is on top of the call stack

php 和 session 重定向错误

java - 在 Java 中存储枚举的顺序

java - 方法引用 - "Reference to a static method"和 "Reference to an instance method of an arbitrary object of a particular type"之间的差异

java - jsp 文件中无法建立 jdbc 连接