从struts动作类返回结果的jQuery弹出框

时间:2014-11-26 08:05:56

标签: javascript jquery struts2

我有一个映射到struts.xml的jsp页面,在动作类中,它从DB检查Id和密码是否正确。如果它们是正确的,它将映射到corret页面。我想如果它没有映射,那么jQuery popup应该在那里说,不正确的ID或密码!

HTML CODE

    <form action="alreadylogin" method="post">
                Enter your Email Id&nbsp;<input type="email" name="loginemail"  placeholder="Enter Your Email Id" required  ><br><br>

                Enter your Password&nbsp;<input type="password" name="loginpass" placeholder="Enter your Password" required ><br><br>

                <input type="reset" value="Reset">&nbsp;&nbsp;
                <input type="submit" value="Submit">

动作类:此处的动作类显示从STRUTS.XML

映射的动作
    public String execute()
    {  
        String check=null;

        try {
            ResultSet r = st.executeQuery("select userpass,firstname from register where usermail='"+ loginemail +"'");

            while (r.next()) {
                String psw=r.getString(1);
                String name=r.getString(2);

                jname=name;

                if(psw.equals(loginpass))
                {
                    session.put("S3CRET", "S3CRET");
                    session.put("USERNAME", jname);
                    check="success";
                }
                        else
                {
                    check="input";
                }
            }
        }
        finally
        {
            return check;
        }

如何在这里应用jQuery弹出窗口?

2 个答案:

答案 0 :(得分:1)

您已经提交到了某个页面;使用jQuery弹出窗口不再有任何意义 因为无论如何你都要转发或重定向回来 - 只需要显示 INPUT结果页面中的相应消息。

如果您确实认为需要额外的工作,那么Jorge的答案是合适的。如果要避免页面刷新,请使用JSON插件并仅返回JSON响应。这增加了一定程度的复杂性,它似乎并不适合你。


以下是一堆无关的评论。

ResultSet r = 
  st.executeQuery("select userpass, firstname from register where usermail='" + loginemail + "'");

这是SQL注入的邀请。不要这样做;使用准备好的声明。

String name = r.getString(2);
jname = name;

if (psw.equals(loginpass)) {
    session.put("S3CRET", "S3CRET");
    session.put("USERNAME", jname);

此处没有理由使用jname。你已经有name;把它放在会话中,例如,

String name = r.getString(2);
if (psw.equals(loginpass)) {
    session.put("USERNAME", name);

没有理由将密码放入会话中。

我认为在这个简短的方法中只有一个return语句是不值得的。 只要尽可能快地返回适当的结果,并允许更快的推理 方法。

public String execute() { 
    String name; 
    ResultSet r = st.executeQuery("select userpass,firstname from register where usermail='" + loginemail + "'");
    while (r.next()) {
        if (!psw.equals(loginpass)) {
            return INPUT;
        }

        name = r.getString(2);
    }

    session.put("USERNAME", name);
    return SUCCESS;
}

execute方法不应该发生这种情况。方法应该都在同一水平上运作 抽象,只做一件事,完全做到。 execute方法应该做的更多 检查有效登录并返回相应的结果,更接近:

public String execute() {
    return loginService.login(email, password) ? SUCCESS : INPUT;
}

login应存在于注入操作的服务中,或至少中的单独方法中 行动课。我不能推荐后者;有关详细信息,请搜索与&#34;反转相关的任何内容 控制&#34;,&#34;依赖注入&#34;,&#34;编写可测试的Java代码&#34;等等。

答案 1 :(得分:0)

您是否考虑过使用登录拦截器?

无论如何,在我看来,使用addFieldError(fieldName, errorMsg)函数进行框架验证总是更容易。确保您的操作类扩展了ActionSupport,并在执行check="input";之前尝试此操作:

..
 else
 {
  addFieldError("loginpass", "Wrong email/password"); //add this new line
  check="input"; //this was the line you wrote
 }
..

这将呈现错误的电子邮件/密码&#34;密码输入正上方的消息。

如果您仍想显示JQuery弹出窗口,我想也许您可以在操作中设置一个新的boolean来表示登录是否正常。然后,在返回INPUT后再次加载页面时,请检查var以及登录是否出错启动弹出窗口。

我还是struts2的新手,但我希望这可能会有所帮助。

修改

struts.xml操作映射

<action name="alreadylogin"
        class="full.path.to.action.class">
        <result name="success"> index.jsp</result> <!--Page where you redirect if Login is OK -->
        <result name="input">login.jsp</result>
</action>

login.jsp:这表示您登录的当前页面

<tr><td id="error"><s:fielderror/></td></tr>
<s:form action="alreadylogin" theme="simple">
            Enter your Email Id&nbsp;<s:textfield type="email" name="loginemail"  placeholder="Enter your Email Id" required><br><br>

            Enter your Password&nbsp;<s:textfield type="password" name="loginpass" placeholder="Enter your Password" required><br><br>

            <input type="reset" value="Reset">&nbsp;&nbsp; <!-- I would reset things using JQuery, I don't know how you're reseting this form so I leave it the way you posted it-->
            <s:submit value="%{'Submit'}">
</s:form>

ACTION CLASS 让它尽可能扩展ActionSupport

public class yourActionClass extends ActionSupport{
...

public String execute()
{  
    //String check=null; //you won't need this anymore

    try {
        ResultSet r = st.executeQuery("select userpass,firstname from register where usermail='"+ loginemail +"'");

        while (r.next()) {
            String psw=r.getString(1);
            String name=r.getString(2);

            jname=name;

            if(psw.equals(loginpass))
            {
                session.put("S3CRET", "S3CRET");
                session.put("USERNAME", jname);
                return SUCCESS; //this is why you extend actionsupport
            }
                    else
            {
                addFieldError("loginpass", "Wrong email/password");
                return INPUT;
            }
        }
    }catch (Exception e){/*Do something if exception is thrown */}
   /* finally
    {
        return check; //this is not needed either as we implement ActionSupport
    }*/ 

/*Here you can implement the validate() method if you need validation. If needed, we'll talk about it*/
...
}

如果在登录期间出现任何错误,这将重新加载login.jsp,如果登录正常,将重定向到index.jsp。我尽可能多地离开动作代码=)。