我是 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/