这是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>
1条答案
按热度按时间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;}
请参见访问应用程序、会话、请求对象