Struts 的Action问题

丶KKdo 发布于 2016/08/09 14:55
阅读 238
收藏 0
编写了一个简单的登录页面,在action进行校验,然后在页面中有一个


<div><font color="red"><s:actionerror /></font></div>

用来struts提示错误信息使用,下面是action中的方法:

String code = (String) ServletActionContext.getRequest().getSession().getAttribute("checkcode");
		if(code.equals(checkcode)) {
			List<User> list = userService.login(loginname, password);
			if(list == null || list.size() == 0) {
				this.addActionError("用户名或密码错误!");
				return LOGIN;
			}
			ServletActionContext.getRequest().getSession().setAttribute("user", list.get(0));
			List<Menu> menuList =  (List<Menu>) ServletActionContext.getRequest().getSession().getAttribute("menuList");
			if(menuList == null) {
				menuList = menuService.getNeed(0);
				ServletActionContext.getRequest().getSession().setAttribute("menuList", menuList);
			}
		}else {
			this.addActionError("验证码错误!");
			return LOGIN;
		}
		return "loginSuccess";



struts中的配置:

<action name="user_*" class="userAction" method="{1}">
			<result name="login">/jsp/login.jsp</result>
			<result name="loginSuccess">/jsp/index.jsp</result>
			<result name="input">/jsp/login.jsp</result>
		</action>
		
		<action name="index" class="indexAction">
			<result>/jsp/login.jsp</result>
		</action>



然后,当我访问index.action,跳转到login.jsp,第一次点击表单提交的时候,是可以成功的运行,如果信息都正确,正确跳转到相应页面, 如果有错误,错误信息也正确显示,但是显示了错误信息之后,页面运行了user_login.action,因为错误所以依然返回到login.jsp,再次填写表单,就会一直报错,一直显示刚刚的错误信息,地址栏是user_login.action,请问这个应该怎么解决?






加载中
0
丶KKdo
丶KKdo
Action上面要用@Scope("prototype"),使用单例模式会出现错误.
0
yangjianqi
yangjianqi

<result name="login" type="redirect">/jsp/login.jsp</result>

这里的跳转类型改成重定向的方式跳转

丶KKdo
丶KKdo
不行,我感觉是不是缓存的原因 <result name="login" type="redirect">/jsp/login.jsp</result> <!-- 重定向到下面的index.action --> <result name="login" type="redirect">index</result> 这两种配置都不可以,后台打了断点,方法就不会再进去了. 相当于只进入一次.
0
佘先生也要毕业了
佘先生也要毕业了
userAction的整个类贴出来看看
丶KKdo
丶KKdo
终于解决了 因为spring给Action的bean是单例模式,改成prototype就可以.
佘先生也要毕业了
佘先生也要毕业了
回复 @丶KKdo : 提交一次错误之后, 用浏览器看看 此时的aciton是指向哪的, 如果正常指向 不应该进不到login里啊
丶KKdo
丶KKdo
不可以,不会再进入user_login.action了
佘先生也要毕业了
佘先生也要毕业了
回复 @丶KKdo : 信息错误之后再填写提交 可以执行到login方法里么
丶KKdo
丶KKdo
是的呀,第一次提交能进入这个方法执行,成功了也能成功跳转,失败了也能显示错误信息,但是再填信息就不会变了.
下一页
0
丶KKdo
丶KKdo
package com.auth.action;

import java.util.List;

import javax.annotation.Resource;

import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Component;

import com.auth.entity.Menu;
import com.auth.entity.User;
import com.auth.service.MenuService;
import com.auth.service.UserService;
import com.opensymphony.xwork2.ActionSupport;

@Component
public class UserAction extends ActionSupport {
	public String loginname;
	public String password;
	private String checkcode;

	public String getCheckcode() {
		return checkcode;
	}

	public void setCheckcode(String checkcode) {
		this.checkcode = checkcode;
	}

	public String getLoginname() {
		return loginname;
	}

	public void setLoginname(String loginname) {
		this.loginname = loginname;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Resource
	private UserService userService;
	
	@Resource
	private MenuService menuService;

	public String login() {
		String code = (String) ServletActionContext.getRequest().getSession().getAttribute("checkcode");
		if((code.toUpperCase()).equals((checkcode.toUpperCase()))) {
			List<User> list = userService.login(loginname, password);
			if(list == null || list.size() == 0) {
				this.addActionError("用户名或密码错误!");
				return LOGIN;
			}
			ServletActionContext.getRequest().getSession().setAttribute("user", list.get(0));
			List<Menu> menuList =  (List<Menu>) ServletActionContext.getRequest().getSession().getAttribute("menuList");
			if(menuList == null) {
				menuList = menuService.getNeed(0);
				ServletActionContext.getRequest().getSession().setAttribute("menuList", menuList);
			}
		}else {
			this.addActionError("验证码错误!");
			return LOGIN;
		}
		return "loginSuccess";
	}
	
}

打了断点了,第一次启动服务的时候可以进入方法,然后如果登录失败重新登录,就不会再进入这个方法了.



返回顶部
顶部