我有一个映射到struts.xml的jsp页面,在动作类中,它从DB检查Id和密码是否正确。如果它们是正确的,它将映射到corret页面。我想如果它没有映射,那么jQuery popup应该在那里说,不正确的ID或密码!
HTML CODE
<form action="alreadylogin" method="post">
Enter your Email Id <input type="email" name="loginemail" placeholder="Enter Your Email Id" required ><br><br>
Enter your Password <input type="password" name="loginpass" placeholder="Enter your Password" required ><br><br>
<input type="reset" value="Reset">
<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弹出窗口?
答案 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 <s:textfield type="email" name="loginemail" placeholder="Enter your Email Id" required><br><br>
Enter your Password <s:textfield type="password" name="loginpass" placeholder="Enter your Password" required><br><br>
<input type="reset" value="Reset"> <!-- 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。我尽可能多地离开动作代码=)。