使用EL表达式但页面无法正确显示答案

问题描述 投票:0回答:1

这是Struts程序。我必须制作一个登录页面。如果我在登录页面输入名称

itcast
和密码
123
,则页面会变成
success.jsp
(我在此页面失败),否则它会显示
error.jsp

loginaction.java
:

package cn.itcast.action;
import com.opensymphopensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
    private String username; 
    private String password; 
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    //@Override
    public String execute() throws Exception {
    
        ActionContext context = ActionContext.getContext();
        if ("itcast".equals(username) && "123".equals(password)) {
            
            context.put("username", username);//${username}<br>
            context.put("password", password); //${password} 
            context.put("success", "success");
            return SUCCESS;
        } else {
            
            context.put("error", "error_zdh");
            return ERROR;
        }
    }
}

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>
    
    <!-- <constant name="struts.enable.DynamicMethodInvocation" value="false" 
        /> -->
    
    <!-- <constant name="struts.devMode" value="true" /> -->
    <package name="default" extends="struts-default">
        <action name="login" class="cn.itcast.action.LoginAction">
            <result name="success" type="redirect">/success.jsp</result>
            <result name="error" type="dispatcher">/error.jsp</result>
        </action>
        
    </package>
</struts>

login.jsp
:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login page</title>
</head>
<body>
    <div align="center">login page
        <form action="login" method="post">
            username:<input type="text" name="username" /><br> 
            password:<input
                type="password" name="password" /><br> <input type="submit"
                value="login" />
        </form>
    </div>
</body>
</html>
 

error.jsp
:

<%@ page language="java" import="java.util.*"    pageEncoding="utf-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>failed page</title>
</head>
<body>
    <p>
        ${error }<br>
    </p>
</body>
</html>

success.jsp
:

<%@ page language="java" import="java.util.*"  pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>success page</title>
</head>
<body>
    <p>
        ${success }<br>
    </p>
    <h2>login information</h2>
    username:${username }<br>
     password:${password }<br>
</body>
</html>

java jsp struts2 el
1个回答
0
投票

您误解了

ActionContext
的概念。您应该区分动作上下文和
ValueStack
。请参阅this答案来澄清问题。

每个地方都有其专用的存储空间,您可以将对象放置在其中以供以后使用/检索在某些调用上下文中运行。无论运行框架的上下文是什么,它都是相关联的。上下文是内部范围对象之间进行通信的方式,您可以使用 Java 或其他表达式语言 (EL)(如 OGNL)进行访问。

在 OGNL 中,动作上下文是 OGNL 上下文,值堆栈是根。

框架将 OGNL 上下文设置为我们的

ActionContext
,并将值堆栈设置为 OGNL 根对象。 (值堆栈是多个对象的集合,但对于 OGNL 来说,它似乎是单个对象。)与值堆栈一起,框架将其他对象放置在
ActionContext
中,包括代表应用程序、会话的
Map
和请求上下文。这些对象与值堆栈(我们的 OGNL 根)一起共存于
ActionContext
中。

由于您重定向到 JSP 页面,因此将调用新操作并创建新的

ActionContext
对象。它不会保留以前上下文中的值。

您需要的是保存像会话一样的值,您可以通过实现

SessionAware
正常注入或直接使用 API 获取它。请参阅 this 答案以了解哪些上下文对象可以在 Struts2 应用程序中使用。

要使用 Struts 会话映射,您应该在操作中实现

SessionAware
。因此,servlet 配置拦截器会将会话注入其中,然后您可以使用会话映射来放置值,这些值可通过 OGNL 访问。

SessionAware
实现示例:

private Map<String, Object> session;

@Override
public void setSession(Map<String, Object> session) {
 this.session = session;
} 

请参阅访问应用程序、会话、请求对象

© www.soinside.com 2019 - 2024. All rights reserved.