Java 使用EL表达式,但页面可以';我不能正确地给出答案

Java 使用EL表达式,但页面可以';我不能正确地给出答案,java,jsp,struts2,el,Java,Jsp,Struts2,El,这是Struts程序。我必须做一个登录页面。如果我在登录页面中输入名称itcast和密码123,则页面将转到success.jsp(我在此页面中失败),否则它将显示错误.jsp loginaction.java: package cn.itcast.action; import com.opensymphopensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class Log

这是Struts程序。我必须做一个登录页面。如果我在登录页面中输入名称
itcast
和密码
123
,则页面将转到
success.jsp
(我在此页面中失败),否则它将显示
错误.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;
        }
    }
}

<%@ 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>
 
<%@ 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>
<%@ 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>

login.jsp

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;
        }
    }
}

<%@ 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>
 
<%@ 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>
<%@ 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>

success.jsp

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;
        }
    }
}

<%@ 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>
 
<%@ 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>
<%@ 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>


成功页面

${success}

登录信息 用户名:${username}
密码:${password}

您误解了
ActionContext
的概念。您应该区分操作上下文和
ValueStack
。请参阅答案以澄清问题

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

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

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

由于重定向到JSP页面,将调用新操作并创建新的
ActionContext
对象。它不保留以前上下文中的值

您需要的是保存一些值,比如一个会话,您可以通过实现
SessionAware
或直接使用API来正常注入该会话。请参阅答案以了解哪些上下文对象可用于Struts2应用程序

要使用Struts会话映射,您应该在操作中实现
SessionAware
。因此,将向其注入会话,然后您可以使用会话映射来放置这些值,这些值可以通过OGNL访问

SessionAware
实现示例:

private Map<String, Object> session;

@Override
public void setSession(Map<String, Object> session) {
 this.session = session;
} 
私有映射会话;
@凌驾
公共无效设置会话(映射会话){
this.session=会话;
} 


您误解了
ActionContext
的概念。您应该区分操作上下文和
ValueStack
。请参阅答案以澄清问题

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

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

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

由于重定向到JSP页面,将调用新操作并创建新的
ActionContext
对象。它不保留以前上下文中的值

您需要的是保存一些值,比如一个会话,您可以通过实现
SessionAware
或直接使用API来正常注入该会话。请参阅答案以了解哪些上下文对象可用于Struts2应用程序

要使用Struts会话映射,您应该在操作中实现
SessionAware
。因此,将向其注入会话,然后您可以使用会话映射来放置这些值,这些值可以通过OGNL访问

SessionAware
实现示例:

private Map<String, Object> session;

@Override
public void setSession(Map<String, Object> session) {
 this.session = session;
} 
私有映射会话;
@凌驾
公共无效设置会话(映射会话){
this.session=会话;
} 


为什么不调试
执行
,看看发生了什么?你好!StackOverflow的效果最好,如果您解释您尝试了什么,以及代码如何没有按预期工作。谢谢你的代码,但还不清楚你真正的问题是什么。你能更具体地说明你希望代码如何工作吗?你正在重定向,这意味着有一个新的请求,这意味着有一个新的操作,这意味着你不再有
用户名
密码
。你为什么不调试
执行
,看看发生了什么?你好!StackOverflow的效果最好,如果您解释您尝试了什么,以及代码如何没有按预期工作。谢谢你的代码,但还不清楚你真正的问题是什么。你能更具体地说明你希望代码如何工作吗?你正在重定向,这意味着有一个新的请求,这意味着有一个新的操作,这意味着你不再有
用户名
密码