【问题标题】:Using EL expression but the page can't show the answer correctly使用 EL 表达式但页面无法正确显示答案
【发布时间】:2021-03-25 16:04:48
【问题描述】:

这是 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>

【问题讨论】:

  • 你为什么不调试execute看看发生了什么?
  • 您好!如果您解释您尝试过的内容以及代码如何无法按预期工作,则 StackOverflow 效果最佳。感谢您提供您的代码,但尚不清楚您的实际问题是什么。您能否更具体地说明您希望代码如何工作?
  • 您正在重定向,这意味着有一个新请求,这意味着有一个新操作,这意味着您在任何地方都不再有 usernamepassword

标签: java jsp struts2 el


【解决方案1】:

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

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

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

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

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

您需要保存的值类似​​于会话,您可以通过实现SessionAware 正常注入或使​​用 API 直接获取它。请参阅this 回答以了解哪些上下文对象可以在 Struts2 应用程序中使用。

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

SessionAware实现示例:

private Map<String, Object> session;

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

Accessing application, session, request objects

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多