how2j.cn

-->
下载区
文件名 文件大小
cart.rar 873k

解压rar如果失败,请用5.21版本或者更高版本的winrar

点击下载 winrar5.21

工具版本兼容问题
要进行购买,还需要用户处于登陆状态,因为后续生成的订单,需要挂在某个用户的名下。


步骤 1 : SQL   
步骤 2 : User   
步骤 3 : UserDAO   
步骤 4 : login.jsp   
步骤 5 : UserLoginServlet   
步骤 6 : 配置web.xml   
步骤 7 : listProduct.jsp   
步骤 8 : 测试   

Product模块类似的,不提供完整的用户CRUD(增 删 改 查) 也是通过SQL准备User数据。
create table user( id int, name varchar(50), password varchar(50) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create table user(
id int,
name varchar(50),
password varchar(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into user values(1,'tom','123');


insert into user values(1,'tom','123');
User 类
package bean; public class User { private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
根据name和password查询表user,如果有数据就表示账号密码正确
package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import bean.User; public class UserDAO { public static void main(String[] args) { System.out.println(new UserDAO().getUser("tom", "123").getId()); } public User getUser(String name, String password) { User result = null; try { Class.forName("com.mysql.jdbc.Driver"); Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8", "root", "admin"); String sql = "select * from user where name = ? and password = ?"; PreparedStatement ps = c.prepareStatement(sql); ps.setString(1, name); ps.setString(2, password); ResultSet rs = ps.executeQuery(); if (rs.next()){ result = new User(); result.setId(rs.getInt(1)); result.setPassword(password); result.setName(name); } ps.close(); c.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } }
登陆页面
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> <!DOCTYPE html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <form action="login" method="post"> 账号: <input type="text" name="name"> <br> 密码: <input type="password" name="password"> <br> <input type="submit" value="登录"> </form>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="java.util.*"%>

<!DOCTYPE html>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<form action="login" method="post">
	账号: <input type="text" name="name"> <br> 
	密码: <input type="password" name="password"> <br> 
	<input type="submit" value="登录">
</form>
登陆Servlet, 通过name和password获取user对象

如果对象不为空,就表示账号密码正确,跳转到产品显示界面 /listProduct
如果对象为空,就跳转到登陆界面,重新登陆
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import bean.User; import dao.UserDAO; public class UserLoginServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String password = request.getParameter("password"); User user = new UserDAO().getUser(name, password); if (null != user) { request.getSession().setAttribute("user", user); response.sendRedirect("/listProduct"); } else response.sendRedirect("/login.jsp"); } }
在web.xml中为路径/login加上相关配置
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>ProductListServlet</servlet-name> <servlet-class>servlet.ProductListServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ProductListServlet</servlet-name> <url-pattern>/listProduct</url-pattern> </servlet-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>servlet.UserLoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> </web-app>
修改listProduct.jsp,如果用户登陆了,就显示用户的名字
<c:if test="${!empty user}">
<div align="center">
当前用户: ${user.name}
</div>
</c:if>
listProduct.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <c:if test="${!empty user}"> <div align="center"> 当前用户: ${user.name} </div> </c:if> <table align='center' border='1' cellspacing='0'> <tr> <td>id</td> <td>名称</td> <td>价格</td> <td>购买</td> </tr> <c:forEach items="${products}" var="product" varStatus="st"> <tr> <td>${product.id}</td> <td>${product.name}</td> <td>${product.price}</td> <td> <form action="addOrderItem" method="post"> 数量<input type="text" value="1" name="num"> <input type="hidden" name="pid" value="${product.id}"> <input type="submit" value="购买"> </form> </tr> </c:forEach> </table>
访问登陆页面,输入账号密码: tom: 123

http://127.0.0.1/login.jsp
测试


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2020-06-06 用来调试的语句为什么没有打印出来?
kira_

System.out.println(new UserDAO().getUser("tom", "123").getId()); 为什么没有在控制台输出id




4 个答案

newbeeee
答案时间:2020-11-07
servlet类不运行主方法

每天都要学Java啊
答案时间:2020-09-09
在 servlet 中 new UserDAO() 不会调用主方法。普通类随着类的加载执行的是构造方法、静态块、静态属性等 System.out.println(new UserDAO().getUser("tom", "123").getId()); 写在主方法里,是为了能快速检查这个类是否连接成功了。直接 run 这个类,就能很快看到效果。

kira_
答案时间:2020-06-23
@gugubird class首先运行的不就是main方法吗?

gugubird
答案时间:2020-06-18
主方法又没运行,怎么会打印呢



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-05-07 这个位置为什么前一个跳转不加.jsp后缀,后一个需要加上.jsp
来补课




这个位置为什么前一个跳转不加.jsp后缀,后一个需要加上.jsp,我测试发现前一个加上.jsp后table无数据,后一个去掉.jsp后login界面无法显示
加载中

							

							


2 个答案

kira_
答案时间:2020-06-06
我的简单理解: 虽然都是Servlet,但是处理的对象不一样。 第一个ProductListServlet没有从网页上获取数据,所以直接访问/listProduct是可以的。 而UserLoginServlet要从login.jsp上即登录界面获取数据去处理它,获取不到数据页面就会崩溃,所以如果改成/login就会发生错误,因为request.getParameter(name)没有获取到输入数据。

shenping
答案时间:2020-05-19
重定向到 /login.jsp 是让浏览器去访问这个页面,不经过后台处理。(这个页面提交数据到/login 这个路径在xml里面映射了,所以数据会被 UserLoginServlet处理 重定向到/listProduct 这个路径在xml里面映射了,所以数据会被 ProductListServlet处理,这个servlet会查询数据,并传给listProduct.jsp渲染出页面



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2020-04-22 重定向路径带不带"/"
2020-04-08 配置web.xml的作用是什么?看不懂这块
2019-10-11 为什么要把user设置到session属性当中去?


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 18 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-购物车-用户模块 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图