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

时间:2014-11-13 15:12:50

标签: 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中会话中的属性?

1 个答案:

答案 0 :(得分: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代码段,而<s:if type="...只包含正确的一个(<jsp:include>或更好<s:include>,不是<%@ include %>)。

考虑在所有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>

仍然很难看(这是一个开始),但更好。

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