【问题标题】:Cannot get attribute from session in Struts 2无法从 Struts 2 中的会话获取属性
【发布时间】:2014-11-13 15:12:50
【问题描述】:

我是 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 中会话中的属性?

【问题讨论】:

  • 在标签中使用 'value' 属性而不是 key
  • 如果他使用value,那么他也需要指定name。键=标签+值+名称

标签: java jsp session struts2


【解决方案1】:

发生这种情况是因为您正在从 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 干净吗?

例如,如果您有三个主要配置文件,您可以为您的标头创建三个 JSP sn-ps,并且 &lt;s:if type="... 仅包含正确的一个(使用 &lt;jsp:include&gt;,或者更好的是 &lt;s:include&gt;,而不是 @987654328 @)。

考虑在所有 JSP 中包含 main-head.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>

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

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

【讨论】:

  • 您好,index.jsp 的某些部分根据type 开启/关闭(0 = 访客,1 = 管理员,2 = 用户)。不同的用户类型在同一个 jsp 上看到不同的东西,这就是为什么我需要在 jsp 中获取type。让我发布整个index.jsp 来展示我想要实现的目标。如果您能在看到整个代码后详细说明 Action 类的方法,将不胜感激。谢谢。
  • 我有一个后续问题,但它与 Struts2 if-else-if 有关。但是,我认为它可能需要它自己的线程,因为它可能会偏离这个主题。感谢您的回复。
猜你喜欢
  • 2023-03-09
  • 2014-06-16
  • 2012-06-21
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多