Struts应用登录表单提交后返回空白页问题求助
问题原因与修复方案
你的空白页问题由以下几个错误共同导致:
1.
LoginAction的execute方法签名错误,未正确重写Struts 1要求的父类方法
Struts 1中Action的业务逻辑入口是固定签名的execute方法,你自定义的无参、返回String的execute方法不会被框架调用,框架无法获取跳转信息,因此返回空白页。
正确签名需包含ActionMapping、ActionForm、HttpServletRequest、HttpServletResponse四个参数,返回值为ActionForward类型,最终通过mapping.findForward(返回标识)获取跳转对象。2. 所有setter方法赋值逻辑写反
当前setter是把类属性值赋给传入参数,完全颠倒了赋值方向,导致页面提交的邮箱、密码根本没有写入类属性,查询时email和pass永远为null,匹配不到任何数据。3. 表单属性与form-bean配置不匹配
你在struts-config.xml中配置了LoginActionForm作为表单封装类,但把email、pass等表单属性写在了LoginAction类中,Struts 1默认会把表单参数注入到配置的form-bean实例中,不会注入Action的属性。你可以选择把属性移到LoginActionForm中,或者删除form-bean配置直接把参数注入Action属性。
修正后代码示例
修正后的LoginAction.java(选择删除form-bean配置的方案)
package com.myapp.struts; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class LoginAction extends org.apache.struts.action.Action { private static final String SUCCESS = "success"; private static final String FAILURE = "failure"; private String email,pass,name; @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String ret = FAILURE; Connection conn = null; try { String URL = "jdbc:mysql://localhost:3306/studentdb"; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(URL, "root", "root"); String sql = "select name from logincred where email = ? and pass = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, email); ps.setString(2, pass); ResultSet rs = ps.executeQuery(); if (rs.next()) { name = rs.getString(1); ret = SUCCESS; // 可将用户名存入session供后续页面使用 request.getSession().setAttribute("username", name); } } catch (Exception e) { e.printStackTrace(); // 开发阶段可打印异常方便排查 ret = FAILURE; } finally { if (conn != null) { try { conn.close(); } catch (Exception e) { } } } return mapping.findForward(ret); } public String getEmail() { return email; } public String getName() { return name; } public void setEmail(String login) { this.email = login; } public void setName(String user){ this.name = user; } public String getPass() { return pass; } public void setPass(String password) { this.pass = password; } }
修正后的struts-config.xml对应配置(删除无用的form-bean关联)
<form-beans> <!-- 如果不需要form-bean可删除下面这行 --> <!-- <form-bean name="LoginActionForm" type="com.myapp.struts.LoginActionForm"/> --> </form-beans> ...... <action-mappings> <!-- 移除name属性,不需要关联form-bean --> <action input="/login.jsp" path="/login" scope="request" type="com.myapp.struts.LoginAction"> <forward name="success" path="/success.jsp"/> <forward name="failure" path="/failure.jsp"/> </action> <action path="/Login" forward="/login.jsp"/> </action-mappings>
内容的提问来源于stack exchange,提问作者Coffin
相关产品推荐
相关产品推荐

