我是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中会话中的属性?
答案 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>
仍然很难看(这是一个开始),但更好。
答案的第一部分仍然完全有效,但请记住这一新部分,以改进页面的设计。