这是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>
您误解了
ActionContext
的概念。您应该区分动作上下文和ValueStack
。请参阅this答案来澄清问题。
每个地方都有其专用的存储空间,您可以将对象放置在其中以供以后使用/检索在某些调用上下文中运行。无论运行框架的上下文是什么,它都是相关联的。上下文是内部范围对象之间进行通信的方式,您可以使用 Java 或其他表达式语言 (EL)(如 OGNL)进行访问。
在 OGNL 中,动作上下文是 OGNL 上下文,值堆栈是根。
框架将 OGNL 上下文设置为我们的
,并将值堆栈设置为 OGNL 根对象。 (值堆栈是多个对象的集合,但对于 OGNL 来说,它似乎是单个对象。)与值堆栈一起,框架将其他对象放置在ActionContext
中,包括代表应用程序、会话的ActionContext
和请求上下文。这些对象与值堆栈(我们的 OGNL 根)一起共存于Map
中。ActionContext
由于您重定向到 JSP 页面,因此将调用新操作并创建新的
ActionContext
对象。它不会保留以前上下文中的值。
您需要的是保存像会话一样的值,您可以通过实现
SessionAware
正常注入或直接使用 API 获取它。请参阅 this 答案以了解哪些上下文对象可以在 Struts2 应用程序中使用。
要使用 Struts 会话映射,您应该在操作中实现
。因此,servlet 配置拦截器会将会话注入其中,然后您可以使用会话映射来放置值,这些值可通过 OGNL 访问。SessionAware
实现示例:SessionAware
private Map<String, Object> session; @Override public void setSession(Map<String, Object> session) { this.session = session; }