
第一步:先把环境搭对——别等写代码了才发现Tomcat没配好
做JSP登录界面,第一步不是写HTML,是把环境搭对——不然等你写了20行代码,才发现Tomcat启动报错,那才崩溃。我当年踩过最蠢的坑是:JDK装了17,Tomcat用了8,结果启动时提示“Unsupported major.minor version”,查了半天才知道JDK17要对应Tomcat10以上。给你个我亲测有效的兼容组合:
选好版本后,还有3个细节要注意:
:比如MySQL8的驱动jar包,别放到项目的WEB-INF/lib里——Tomcat需要单独加载驱动,不然会提示“ClassNotFoundException”。我当年就是放错位置,查了3小时才解决,这坑你别踩。
:在Tomcat的server.xml里,给你的项目加个Context标签,比如——这样你访问时输
http://localhost:8080/loginDemo
就能进项目,不用记冗长的路径。
:写个简单的index.jsp,内容就放
Hello JSP!
,启动Tomcat后访问,如果能看到这句话,说明环境没问题——别等写登录逻辑了才测试。
第二步:从表单到后端——每一步都讲透,别再猜“为什么参数获取不到”
环境搭好,接下来做登录界面的核心:HTML表单+JSP后端逻辑。我先给你个简化版的HTML表单(用Bootstrap,不用写复杂CSS):
登录界面
用户登录
<!-
显示错误信息 >
这段代码里有2个新手必看的细节:
用post方法:别用get——get会把密码暴露在URL里,不安全; 错误信息显示:用 request.getAttribute("errorMsg")
获取后端传的错误提示,再用Bootstrap的alert组件显示——用户输错密码时,能看到友好提示,不是一串英文异常。接下来讲JSP后端(login.jsp)的逻辑,我把代码拆成3部分,每部分都加了注释:
获取表单参数 // 获取表单里的用户名和密码(name要和表单的name一致)
String username = request.getParameter("username");
String password = request.getParameter("password");
坑提醒:如果表单的name是“username”,你后端写
request.getParameter("user")
,肯定获取不到值——我当年就犯过这错,盯着代码看了1小时才发现参数名写错。连接数据库验证账号 // 数据库连接信息(改成你自己的)
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String dbUser = "root";
String dbPwd = "123456";
// 加载JDBC驱动(MySQL8以上要加cj)
Class.forName("com.mysql.cj.jdbc.Driver");
// 建立连接
Connection conn = DriverManager.getConnection(url, dbUser, dbPwd);
// 预处理查询(防止SQL注入)
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?");
pstmt.setString(1, username); // 第一个?填用户名
pstmt.setString(2, password); // 第二个?填密码
// 执行查询
ResultSet rs = pstmt.executeQuery();
权威参考:MySQL官方文档里提到,
com.mysql.cj.jdbc.Driver
是MySQL8及以上的标准驱动,com.mysql.jdbc.Driver
已经 deprecated(过时)——别用旧的,不然会报警告。处理登录结果 if (rs.next()) {
// 登录成功:保存session状态(这样其他页面能判断用户是否登录)
session.setAttribute("username", username);
// 跳转到成功页
response.sendRedirect("success.jsp");
} else {
// 登录失败:传错误信息回登录页
request.setAttribute("errorMsg", "账号或密码错误");
// 转发回登录页(别用重定向,不然errorMsg会丢失)
request.getRequestDispatcher("login.html").forward(request, response);
}
经验分享:我当年用
response.sendRedirect()
传错误信息,结果发现登录页看不到提示——后来才知道,重定向是“客户端跳转”,request
对象的属性会丢失,得用forward
(服务器端跳转)才能把错误信息带过去。最后写成功页(success.jsp):
登录成功
欢迎您,!
安全提醒:别让未登录的用户访问成功页——在success.jsp开头加段代码:
if (session.getAttribute("username") == null) {
// 未登录,跳回登录页
response.sendRedirect("login.html");
}
第三步:踩坑 ——我当年错了5次的地方,你一次都别犯
最后我把自己当年踩过的坑整理成“避坑清单”,你看完能少走很多弯路:
密码别明文存储:教程里用了明文,但实际项目要加密(比如MD5或SHA-256)——我后来把密码改成 MD5(password)
,数据库存密文,这样即使数据库泄露,密码也不会被破解。别忘记关闭数据库连接:ResultSet、PreparedStatement、Connection要在finally里关闭,比如: finally {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
}
我当年没关连接,结果MySQL提示“Too many connections”,重启了服务器才好。
用Chrome的开发者工具查错:如果登录没反应,按F12打开“网络”面板,看请求的状态码——404是路径错,500是代码错,200是成功但逻辑错。 你按这些步骤做,肯定能跑通——如果遇到问题,比如“Tomcat启动报错”、“数据库连不上”,可以在评论区留消息,我帮你看看。最后送你完整源码,复制到项目里,改改数据库配置就能用(关注公众号回复“JSP登录”获取)。你试试,做完了来告诉我效果!
本文常见问题(FAQ)
JDK和Tomcat版本不兼容怎么办?
可以参考亲测有效的兼容组合:JDK8对应Tomcat8或9,JDK11对应Tomcat9或10,JDK17对应Tomcat10或11。比如我当年JDK装了17却用Tomcat8,启动时就提示“Unsupported major.minor version”,换成对应版本就解决了。
JDBC驱动放错位置会有什么问题?
如果把MySQL驱动jar包放到项目的WEB-INF/lib里,Tomcat会提示“ClassNotFoundException”,因为Tomcat需要单独加载驱动。正确的位置是Tomcat的lib目录,我当年就是放错位置查了3小时才解决,这个坑别踩。
表单参数获取不到是什么原因?
首先要检查表单里的name属性和后端request.getParameter()的参数名是否一致,比如表单name是“username”,后端写“user”肯定获取不到。另外 用post方法提交表单,不仅安全,也能避免参数暴露在URL里的问题。
登录成功后怎么保存用户状态?
可以用session保存登录状态,比如登录成功时用session.setAttribute("username", username)把用户名存进session,这样其他页面(比如成功页)能通过session.getAttribute("username")判断用户是否登录。如果未登录,还能跳回登录页。
未关闭数据库连接会有什么影响?
如果没关闭ResultSet、PreparedStatement或Connection,MySQL可能会提示“Too many connections”,导致无法连接数据库。我当年没关连接就遇到过这个问题,后来在finally代码块里关闭所有连接才解决,比如用if (rs != null) rs.close()这样的写法。
原文链接:https://www.mayiym.com/51700.html,转载请注明出处。