为什么动作错误消息没有传递到下一页?

时间:2011-12-08 10:12:21

标签: java struts2

我正在开发一个登录函数,它根据存储在DB中的数据对用户进行身份验证,当我尝试在下一个要显示的JSP上显示登录错误消息时,即使登录信息不匹配,也不显示该消息

struts.xml中

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
  <constant name="struts.enable.DynamicMethodInvocation" value="false" />
  <constant name="struts.devMode" value="false" />
  <constant name="struts.custom.i18n.resources" value="ApplicationResources" />

  <package name="default" extends="struts-default" namespace="/">
    <action name="login" class="package1.LoginAction">
      <result name="success">MainPage.jsp</result>
      <result name="error">Login.jsp</result>
    </action>
  </package>
</struts>

ApplicationResources.properties

  label.username=User Name
  label.password=Password
  label.login=Login
  label.domain=Select Domain
  error.login=Invalid Username/Password. Please try again.

的Login.jsp

<table border="0" align="center">
  <tr><s:actionerror /></tr>
</table>

<s:form action="login.action" method="post">
  <table border="0" align="center">
    <tr><s:textfield name="uid" key="label.username" size="20" /></tr>
    <tr><s:password name="psw" key="label.password" size="20" /></tr>
    <tr><s:select name="domain"
                  key="label.domain"
                  headerKey="1"
                  headerValue="-- Please Select --"
                  list="#{'01':'Tutor','02':'Student'}" /></tr>
    <tr><s:submit method="execute" key="label.login" align="center" /></tr>
  </table>
</s:form>

LoginAction.java

    try {
        Class.forName("com.informix.jdbc.IfxDriver");
        conURL = "jdbc:informix-sqli://*********/fxg:INFORMIXSERVER=" +
                "sgdbuat11;user=*****;password=******";

        conn = DriverManager.getConnection(conURL);
        stmt = conn.createStatement();
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    stmt = conn.createStatement();
    String qstr = "SELECT * FROM tutor";
    rset = stmt.executeQuery(qstr);
    int count = 0;
    String msg = "";
    while (rset.next()) {
        String username = rset.getString("uid");
        if (this.uid.equals(username)) {
            count++;
            String password = rset.getString("psw1");
            if (this.psw.equals(password)) {
                msg = "success";
            } else {
                msg = "wrongpsw";
            }
        }
    }
    if (count == 0) {
        return "error";
    } else if (msg == "wrongpsw") {
        return "error";
    } else {
        return "success";
    }

2 个答案:

答案 0 :(得分:1)

我没有看到你使用密钥error.login所以你如何期望struts显示它?您需要自己输入错误消息,例如在你的行动中致电addActionError("your message here")

答案 1 :(得分:0)

我基本上无法看到你添加addActionError的位置,如果你想设置任何这样的动作级别错误,只需要设置它们就可以调用addActionError()或ActionMessage,而不是你的jsp页面ypu需要使用<s:actionerror/><s:actionmessage/>

显示它们

yuo需要在你的动作类中设置类似的内容

 if (count==0)
      {
             addActionError("Invalid Username/Password. Please try again");
             return "error" ;             
       }
     else if (msg=="wrongpsw"){
         addActionError("Invalid Username/Password. Please try again");    
        return "error";

     }
     else{
         return "success";
     }

另外,总是更好地检查jsp上的堆栈中是否存在任何错误

<s:if test="hasActionErrors()">
<table border="0" align="center">
            <tr><s:actionerror/></tr></table>
</s:if>

希望这会有所帮助