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

ibps3vxo  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(342)

这是struts程序。我要做一个登录页面。如果我输入名字 itcast 和密码 123 在登录页面,然后页面转到 success.jsp (我在这个页面失败)否则它显示 error.jsp .
登录.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>

登录.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>

错误.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>

成功.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>
zrfyljdw

zrfyljdw1#

你误解了 ActionContext 概念。你应该区分动作和背景 ValueStack . 看这个答案来澄清问题。
每个地方都有其专用的存储空间,您可以在其中放置对象以供以后在某个调用上下文中使用/检索。运行框架的任何上下文都是关联的。上下文是在它内部的作用域对象之间进行通信的方式,您可以使用java或ognl等其他表达式语言(el)访问它。
在ognl中,操作上下文是ognl上下文,值堆栈是根。
框架将ognl上下文设置为actioncontext,将值堆栈设置为ognl根对象(值堆栈是由多个对象组成的集合,但对ognl来说,它似乎是一个单独的对象。)与值堆栈一起,框架将其他对象放置在actioncontext中,包括表示应用程序、会话和请求上下文的Map。这些对象与值堆栈(我们的ognl根)共存于actioncontext中。
因为您重定向到jsp页面,新的操作被调用,新的 ActionContext 对象已创建。它不保留以前上下文中的值。
您需要的是保存一些值,就像一个会话,您可以通过实现 SessionAware 或者直接使用api获取。请参阅此答案以了解哪些上下文对象可用于struts2应用程序。
要使用struts会话Map,您应该在操作中实现sessionaware。因此,servlet配置拦截器将向其注入会话,然后您可以使用会话Map来放置这些值,这些值将通过ognl访问。
sessionaware实现示例:
私有Map<string,object>会话;
@重写public void setsession(map<string,object>session){this.session=session;}
请参见访问应用程序、会话、请求对象

相关问题