任务1:提交订单
提交订单需要操作数据库的3张表:
- .向订单表中插入一条订单信息
- .向订单明细表中插入多条记录,每一条记录就是提交订单前的购物项
3).每个订单明细关联了一款商品,修改商品表中该商品的库存数量
需要将以上3个操作放在一个事务中执行,要么都成功(提交事务),要么都失败(回滚事务)
第1步:在购物车页面点击“下一步”,进入到订单确认页面
<a
href="${pageContext.request.contextPath}/qiantai/order/orderQueren.jsp"><img
border="0"
src="${pageContext.request.contextPath}/images/Car_icon_03.gif" /></a>
订单确认页面orderQueren.jsp上回显用户信息,电话和收货地址可以修改
<form
action="${pageContext.request.contextPath}/order.action?method=addOrder"
name="f" method="post">
<table width="99%" border="0" cellpadding="2" cellspacing="1"
bgcolor="#FFFFFF" align="center" style="margin-top:8px">
<tr align='center' bgcolor="#FFFFFF" height="22">
<td>收货人帐号:</td>
<td><input type="text" readonly="readonly"
value="${user.user_name }" /></td>
</tr>
<tr align='center' bgcolor="#FFFFFF" height="22">
<td>收货人姓名:</td>
<td><input type="text" readonly="readonly"
value="${user.user_realname }" /></td>
</tr>
<tr align='center' bgcolor="#FFFFFF" height="22">
<td>收货人联系电话:</td>
<td><input type="text" value="${user.user_tel }" /></td>
</tr>
<tr align='center' bgcolor="#FFFFFF" height="22">
<td>收货地址:</td>
<td><input type="text" name="odderSonghuodizhi"
value="${user.user_address }" /></td>
</tr>
<tr align='center' bgcolor="#FFFFFF" height="22">
<td>付款方式(暂时只支持货到付款):</td>
<td><select name="odderFukuangfangshi" style="width:155px;">
<option value="货到付款">货到付款</option>
</select> <!-- 隐藏域,存储订单的总金额,就是购物车的总金额 --> <input type="hidden"
name="totalPrice" value="${cart.totalPrice }" /> <!-- 隐藏域,存储当前用户的id -->
<input type="hidden" name="userid" value="${user.user_id }" />
</td>
</tr>
</table>
<table>
<tr height="7">
<td></td>
</tr>
<tr>
<td width="120"></td>
<td><a href="#" onclick="back1()"><img border="0"
src="${pageContext.request.contextPath}/images/Car_icon_back.gif" /></a></td>
<!-- 点击提交订单,将表单提交到后台Servlet -->
<td><img border="0"
src="${pageContext.request.contextPath}/images/Car_icon_06.gif"
onclick="javascript:document.f.submit();" /></td>
</tr>
</table>
</form>
第2步:创建OrderDao,添加一个插入订单的方法
@Override
public int insert(Order order, List<Orderitem> items) {
// TODO Auto-generated method stub
String sql = "insert into t_order values(?, now(),0,?,?,?,?)";
// 连接对象
Connection conn = JdbcUtil.getConnection();
// 预编译SQL的操作对象
PreparedStatement stmt = null;
try {
// 设置事务手动提交
conn.setAutoCommit(false);
// 第一:操作订单表,插入一条订单记录
stmt = conn.prepareStatement(sql);
// 给?赋值
// 1.订单编号,值是UUID生成的随机不重复的字符串
stmt.setString(1, order.getOrder_id());
// 2.金额
stmt.setInt(2, order.getOrder_jine());
// 3.收货地址
stmt.setString(3, order.getOrder_address());
// 4.付款方式
stmt.setString(4, order.getOrder_pay());
// 5.用户id
stmt.setInt(5, order.getUser().getUser_id());
// 执行sql命令
stmt.executeUpdate();
// 关闭操作对象,会同时清空预编译时的参数值
stmt.close();
// 第二:操作订单明细表
sql = "insert into t_orderitem(order_id,goods_id,goods_num) values(?,?,?)";
// 产生新的操作对象
stmt = conn.prepareStatement(sql);
// 使用一个SQL,要给SQL中占位符赋值多次并执行的操作称为批处理
for (Orderitem orderitem : items) {
// 给占位符赋值,
stmt.setString(1, orderitem.getOrder().getOrder_id());
stmt.setInt(2, orderitem.getGoods().getGoods_id());
stmt.setInt(3, orderitem.getGoods_num());
// 再将一组参数值添加到批处理命令中
stmt.addBatch();
}
// 执行批处理命令
stmt.executeBatch();
stmt.close();
// 第三:修改每个订单明细关联的商品的库存数量
sql = "update t_goods set stock_num=stock_num-? where goods_id=?";
// 产生新的操作对象
stmt = conn.prepareStatement(sql);
// 使用一个SQL,要给SQL中占位符赋值多次并执行的操作称为批处理
for (Orderitem orderitem : items) {
Goods goods = orderitem.getGoods();
stmt.setInt(1, orderitem.getGoods_num());
stmt.setInt(2, goods.getGoods_id());
// 再将一组参数值添加到批处理命令中
stmt.addBatch();
}
// 执行批处理命令
stmt.executeBatch();
// 提交事务
conn.commit();
return 1;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return 0;
} finally {
// 关闭资源
JdbcUtil.closeAll(null, stmt, conn);
}
}
第3步:创建OrderService,加入添加订单的方法
public class OrderServiceImpl implements OrderService {
private OrderDao orderDao = new OrderDaoImpl();
@Override
public void addOrder(Order order, List<Orderitem> items) {
// TODO Auto-generated method stub
// 调用OrderDao中的添加订单方法
orderDao.insert(order, items);
}
}
第4步:创建OrderServlet,加入处理提交订单的方法
public void addOrder(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取订单确认页面传过来的订单数据
// 订单总金额
int totalPrice = Integer.parseInt(request.getParameter("totalPrice"));
// 用户id
int userid = Integer.parseInt(request.getParameter("userid"));
// 收货地址
String odderSonghuodizhi = request.getParameter("odderSonghuodizhi");
// 付款方式
String odderFukuangfangshi = request
.getParameter("odderFukuangfangshi");
// 封装一个订单对象
Order order = new Order();
order.setOrder_jine(totalPrice);
// 创建用户对象
User user = new User();
user.setUser_id(userid);
// 建立订单和用户的关联
order.setUser(user);
order.setOrder_address(odderSonghuodizhi);
order.setOrder_pay(odderFukuangfangshi);
// 设置订单的编号,值是UUID生成的随机不重复的字符串
order.setOrder_id(UUID.randomUUID().toString());
// 创建订单明细的集合
List<Orderitem> itemList = new ArrayList<Orderitem>();
// 从session中获取购物车,再获取所有购物项
HttpSession session = request.getSession();
Cart cart = (Cart) session.getAttribute("cart");
Collection<CartItem> values = cart.getCartMap().values();
for (CartItem cartItem : values) {
// 根据购物项来创建订单明细
Orderitem item = new Orderitem();
item.setOrder(order);
item.setGoods(cartItem.getGoods());
item.setGoods_num(cartItem.getQuantity());
// 添加到订单明细集合中
itemList.add(item);
}
// 调用OrderService的添加订单方法
OrderService service = new OrderServiceImpl();
service.addOrder(order, itemList);
//清空购物车
session.removeAttribute("cart");
// 跳转到orderSubmit.jsp页面
request.setAttribute("order", order);
request.getRequestDispatcher("qiantai/order/orderSubmit.jsp").forward(
request, response);
任务2:查看我的订单
- 修改incTop.jsp页面上”我的订单”超链接,给它加单击事件,调用js函数
//点击“我的订单”
function myOrder() {
<c:if test="${empty user}">
alert("请去右边的登录板块去登录!");
return;
</c:if>
//跳转到后台servlet,调用queryOrders方法,传用户的id过去
var s = "${pageContext.request.contextPath}/order.action?method=queryOrders&uid=${user.user_id}";
window.location.href = s;
}
2.在OrderDao中加一个查询指定用户所有订单的方法
@Override
public List<Order> queryByUserId(int userid) {
//查询订单编号,金额,订单时间,状态
String sql="select order_id,order_jine,order_time,order_zhuangtai from t_order where order_userid=?";
List<Order> orders = this.getList(Order.class, sql, userid);
return orders;
}
- 3.在OrderService中加一个获取用户的所有订单的方法
@Override
public List<Order> getAllOrders(int userid) {
// TODO Auto-generated method stub
List<Order> list = orderDao.queryByUserId(userid);
return list;
}
4.在OrderServlet中处理查看订单的请求
//查看“我的订单”
public void queryOrders(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取用户编号
int uid=Integer.parseInt(request.getParameter("uid"));
//调用OrderService的方法获取用户的所有订单
OrderService service=new OrderServiceImpl();
List<Order> allOrders = service.getAllOrders(uid);
//存到request域中
request.setAttribute("orders", allOrders);
//转发到myOrder.jsp页面
request.getRequestDispatcher("qiantai/order/myOrder.jsp").forward(
request, response);
}
5)在myOrder.jsp页面上显示我的订单数据
<body>
<jsp:include flush="true" page="/qiantai/inc/incTop.jsp"></jsp:include>
<div class="page_row">
<!--左边的 -->
<div class="page_main_msg left">
<div class="left_row">
<div class="list pic_news">
<div class="list_bar"> 我的订单</div>
<table width="99%" border="0" cellpadding="2" cellspacing="1"
bgcolor="#FFFFFF" align="center" style="margin-top: 8px">
<tr align="center" bgcolor="#FAFAF1" height="22">
<td>订单编号</td>
<td>金额</td>
<td>下单时间</td>
<td>订单状态</td>
<td>编辑</td>
</tr>
<c:forEach var="od" items="${orders }">
<tr align='center' bgcolor="#FFFFFF" height="22">
<td>${od.order_id }</td>
<td>¥ ${od.order_jine } <br />
</td>
<td>${od.order_time }</td>
<td><c:choose>
<c:when test="${od.order_zhuangtai eq 0}">待发货</c:when>
<c:when test="${od.order_zhuangtai eq 1}">已发货</c:when>
<c:when test="${od.order_zhuangtai eq 2}">已收货</c:when>
<c:otherwise>已完成</c:otherwise>
</c:choose></td>
<%-- --%>
<td><a href="${pageContext.request.contextPath}/order.action?method=queryOrderDetail&orderid=${od.order_id }"
target="_blank"
>订单明细</a>
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</div>
<!-- 右边的 -->
<div class="page_other_msg right">
<div class="left_row">
<div class="list">
<div class="list_bar">用户登录</div>
<div class="list_content">
<div id="div">
<jsp:include flush="true" page="/qiantai/userinfo/userlogin.jsp"></jsp:include>
</div>
</div>
</div>
</div>
<div class="left_row">
<div class="list">
<div class="list_bar">商品分类</div>
<div class="list_content">
<div id="div">
<div style="overflow: hidden;">
<div id="roll-orig-1607838439">
<!-- 这里需要获取到的所有商品分类数据并显示 -->
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<c:forEach var="c" items="${catelogs }">
<tr>
<td height="28" id="roll-line-1607838439" width="100%">
<div class="" style="padding:2px 0px;">
<div class="f-left">
<img
src="${pageContext.request.contextPath}/img/head-mark3.gif"
align="middle" class="img-vm" border="0" /> <a
href="${pageContext.request.contextPath}/goods.action?method=queryByCatelog&catelogId=${c.catelog_id}">
<span style="font-size:12px">${c.catelog_name }</span>
</a>
</div>
<div class="clear"></div>
</div>
</td>
</tr>
</c:forEach>
</table>
</div>
<div id="roll-copy-1607838439"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="clear: both"></div>
</div>
<div>
<jsp:include flush="true" page="/qiantai/inc/incFoot.jsp"></jsp:include>
</div>
</body>
任务3:查看订单详情
1)修改myOrder.jsp的“订单明细”超链接
<a href="${pageContext.request.contextPath}/order.action?method=queryOrderDetail&orderid=${od.order_id }"
target="_blank"
>订单明细</a>
2)创建OrderItemDao,加入一个查询订单明细的方法
@Override
public List<Orderitem> queryAllByOrderId(String orderId) {
// TODO Auto-generated method stub
String sql = "select goods_name, mall_price,goods_num from t_orderitem t1 join t_goods t2 on t1.goods_id=t2.goods_id "
+ " where t1.order_id=?";
// 手动处理结果集
Connection conn = JdbcUtil.getConnection();
PreparedStatement stmt = null;
ResultSet rs = null;
// 返回值
List<Orderitem> list = new ArrayList<Orderitem>();
try {
stmt = conn.prepareStatement(sql);
stmt.setString(1, orderId);
rs = stmt.executeQuery();
while (rs.next()) {
Orderitem item = new Orderitem();
Goods goods = new Goods();
goods.setGoods_name(rs.getString("goods_name"));
goods.setMall_price(rs.getInt("mall_price"));
item.setGoods(goods);
item.setGoods_num(rs.getInt("goods_num"));
// 添加到集合中
list.add(item);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbcUtil.closeAll(rs, stmt, conn);
}
return list;
}
- 3.创建OrderItemService,添加获取某个订单的所有订单明细的方法
public class OrderItemServiceImpl implements OrderItemService {
private OrderItemDao dao=new OrderItemDaoImpl();
@Override
public List<Orderitem> getAllItems(String orderId) {
// TODO Auto-generated method stub
List<Orderitem> items = dao.queryAllByOrderId(orderId);
return items;
}
}
- 4在OrderServlet中加一个方法获取订单明细
//查看某个订单的订单明细
public void queryOrderDetail(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取订单编号
String orderId=request.getParameter("orderid");
//调用Service的方法获取订单的明细,传入订单编号
OrderItemService service=new OrderItemServiceImpl();
List<Orderitem> allItems = service.getAllItems(orderId);
//存到request域中
request.setAttribute("items", allItems);
//转发到orderDetail.jsp页面
request.getRequestDispatcher("qiantai/order/orderDetail.jsp").forward(request, response);
}
5.)在orderDetail.jsp页面上展示所有订单明细数据
<body class="body" leftmargin="0" rightmargin="0">
<table cellspacing="1" cellpadding="0" width="100%" border="0"
bgcolor="#F7F3F7">
<tr height="26">
<td class="blackTitle" align="center">商品名称</td>
<td class="blackTitle" align="center">单价</td>
<td class="blackTitle" align="center">数量</td>
<td class="blackTitle" align="center">总价</td>
</tr>
<c:forEach var="orderitem" items="${items }">
<tr class="text" align="center" bgcolor="#FFFFFF">
<td>${orderitem.goods.goods_name }</td>
<td>${orderitem.goods.mall_price }</td>
<td>${orderitem.goods_num }</td>
<td>${orderitem.goods.mall_price*orderitem.goods_num }</td>
</tr>
</c:forEach>
</table>
</body>
任务4:用户注册
- 给登录页面userLogin.jsp上的注册按钮添加onclick事件,点击后打开新的窗口加载注册页面
function reg() {
var url = "${pageContext.request.contextPath}/qiantai/userinfo/userReg.jsp";
window.open(url, "_blank");
}
- 2修改注册页面上表单的请求路径,请求UserServlet
<form action="${pageContext.request.contextPath}/user.action?method=addUser" name="form1" method="post"> |
- 3在UserDao中加入一个添加用户方法
@Override
public int insert(User user) {
// TODO Auto-generated method stub
String sql = "insert into t_user(user_name,user_pwd,user_realname,user_address,user_sex,user_tel,user_email,user_qq)"
+ " values(?,?,?,?,?,?,?,?)";
int i = JdbcUtil.executeUpdate(sql, user.getUser_name(),
user.getUser_pwd(), user.getUser_realname(),
user.getUser_address(), user.getUser_sex(), user.getUser_tel(),
user.getUser_email(), user.getUser_qq());
return i;
}
- 4UserService中添加一个注册的方法
@Override
public boolean register(User user) {
// TODO Auto-generated method stub
int i = userDao.insert(user);
return i>0;
}
5) 创建UserServlet,处理添加用户请求
/处理添加用户请求
public void addUser(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取请求参数值
String userName=request.getParameter("userName");
String userPw=request.getParameter("userPw");
String userRealname=request.getParameter("userRealname");
String userAddress=request.getParameter("userAddress");
String userSex=request.getParameter("userSex");
String userTel=request.getParameter("userTel");
String userEmail=request.getParameter("userEmail");
String userQq=request.getParameter("userQq");
//封装一个用户对象
User user=new User();
user.setUser_name(userName);
user.setUser_pwd(userPw);
user.setUser_realname(userRealname);
user.setUser_address(userAddress);
user.setUser_sex(userSex);
user.setUser_tel(userTel);
user.setUser_email(userEmail);
user.setUser_qq(userQq);
//调用service的注册方法
UserService service=new UserServiceImpl();
boolean flag = service.register(user);
if(flag){
//注册成功,跳转到网站首页上
response.sendRedirect(request.getContextPath()+"/goods.action?method=queryFive");
}
}
任务5:修改我的信息
- 点击“我的信息”时跳转到userXinxi.jsp页面
<A href="javascript:void(0)" onclick="myXinxi()"
target="_self" rel="CMenuMultiLevel-332774-43069-213">我的信息</A>
函数
//点击"我的信息"
function myXinxi() {
<c:if test="${empty user}">
alert("请去右边的登录板块去登录!");
return;
</c:if>
var url = "${pageContext.request.contextPath}/qiantai/userinfo/userXinxi.jsp";
window.open(url, "_blank");
}
- 2.在userXinxi.jsp页面回显当前用户的信息
<body>
<form action="${pageContext.request.contextPath}/user.action?method=updateUser" name="form1" method="post">
<table width="98%" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<caption>编辑个人信息</caption>
<tr>
<td width="20%" height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
用户名:
</td>
<td width="80%" bgcolor="#FFFFFF">
<input type="text" name="userName" id="userName" readonly="readonly" value="${sessionScope.user.user_name }"/>
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
密 码:
</td>
<td bgcolor="#FFFFFF">
<input type="password" name="userPw" value="${sessionScope.user.user_pwd }"/>
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
真实姓名:
</td>
<td bgcolor="#FFFFFF">
<input type="text" name="userRealname" value="${sessionScope.user.user_realname }"/>
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
收货住址:
</td>
<td bgcolor="#FFFFFF">
<input type="text" name="userAddress" value="${sessionScope.user.user_address }"/>
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
性别:
</td>
<td bgcolor="#FFFFFF">
<input type="radio" name="userSex" value="男" ${user.user_sex eq '男'?'checked':'' }/>男
<input type="radio" name="userSex" value="女" ${user.user_sex eq '女'?'checked':'' }/>女
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
电话:
</td>
<td bgcolor="#FFFFFF">
<input type="text" name="userTel" value="${sessionScope.user.user_tel }"/>
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
E-mail:
</td>
<td bgcolor="#FFFFFF">
<input type="text" name="userEmail" value="${sessionScope.user.user_email }"/>
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
QQ:
</td>
<td bgcolor="#FFFFFF">
<input type="text" name="userQq" value="${sessionScope.user.user_qq }"/>
</td>
</tr>
<tr>
<td height="30" align="right" bgcolor="#F9F9F9">
</td>
<td bgcolor="#FFFFFF">
<!-- 将用户的id存到隐藏域中 -->
<input type="hidden" name="userId" value="${sessionScope.user.user_id }" />
<input type="submit" value="保存"/>
<input type="button" value="取消" onclick="closeOpen()"/>
</td>
</tr>
</table>
</form>
</body>
3
- 修改userXinxi.jsp页面上表单的请求路径
<form action="${pageContext.request.contextPath}/user.action?method=updateUser" name="form1" method="post">
4.在UserDao中加入修改用户的方法,实现类方法代码
@Override
public int update(User user) {
// TODO Auto-generated method stub
String sql="update t_user set user_name=?,user_pwd=?,user_realname=?,user_address=?,user_sex=?,user_tel=?,user_email=?,user_qq=?"+
" where user_id=?";
Object[] params={user.getUser_name(),user.getUser_pwd(),user.getUser_realname(),
user.getUser_address(), user.getUser_sex(), user.getUser_tel(),
user.getUser_email(), user.getUser_qq(),user.getUser_id()};
int i=JdbcUtil.executeUpdate(sql,params );
return i;
}
5在UserService中加入修改用户的方法
@Override
public boolean updateUser(User user) {
// TODO Auto-generated method stub
int i = userDao.update(user);
return i>0;
}
}
6在UserServlet中加入修改用户的方法
//处理修改用户的请求
public void updateUser(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取请求参数值
String userName=request.getParameter("userName");
String userPw=request.getParameter("userPw");
String userRealname=request.getParameter("userRealname");
String userAddress=request.getParameter("userAddress");
String userSex=request.getParameter("userSex");
String userTel=request.getParameter("userTel");
String userEmail=request.getParameter("userEmail");
String userQq=request.getParameter("userQq");
int userId=Integer.parseInt(request.getParameter("userId"));
//封装成象一个用户对象
User user=new User();
user.setUser_name(userName);
user.setUser_pwd(userPw);
user.setUser_realname(userRealname);
user.setUser_address(userAddress);
user.setUser_sex(userSex);
user.setUser_tel(userTel);
user.setUser_email(userEmail);
user.setUser_qq(userQq);
user.setUser_id(userId);
//调用service的修改用户的方法
UserService service=new UserServiceImpl();
boolean flag = service.updateUser(user);
if(flag){
//将session中的用户换成新用户
HttpSession session = request.getSession();
session.setAttribute("user",user);
//修改成功,跳转到网站首页上
response.sendRedirect(request.getContextPath()+"/goods.action?method=queryFive");
}
}
任务6:创建后台项目
创建一个项目sxt_tysc_system,将资料中的已编译的后台项目sxt_admin_static目录下的静态资源文件拷贝到我们的项目中,如下图:
接下来将jsp文件夹拖到WEB-INF目录下,WEB-INF在web开发中是受保护的目录,
该目录下的资源不能通过客户端请求直接访问(不能用超链接,网址来直接访问),只能通过服务器内部跳转即请求转发的方式来访问。最终我们的后台项目结构:
如果直接访问WEB-INF下的资源,会报错
任务7:管理员登录
- 在登录页面上显示验证码
将资料中的验证码文件夹下的AuthCodeServlet添加到项目的servlet包里,AuthCodeUtil添加到util包里面
然后在web.xml中配置AuthCodeServlet
<!-- 生成验证码的servlet -->
<servlet>
<servlet-name>authCodeServlet</servlet-name>
<servlet-class>com.sxt.servlet.AuthCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>authCodeServlet</servlet-name>
<url-pattern>/authCode.action</url-pattern>
</servlet-mapping>
2.创建AdminDao,添加根据用户名和密码查询的方法
public class AdminDaoImpl extends BaseDao<Admin> implements AdminDao {
@Override
public Admin queryByNameAndPwd(String username, String userpwd) {
// TODO Auto-generated method stub
String sql="select * from t_admin where username=? and userpwd=?";
Admin admin = this.getBean(Admin.class, sql,username,userpwd );
return admin;
}
}
3.在AdminService中添加登录的方法
public class AdminServiceImpl implements AdminService{
private AdminDao adminDao=new AdminDaoImpl();
@Override
public Admin login(String username, String userpwd) {
// TODO Auto-generated method stub
Admin admin = adminDao.queryByNameAndPwd(username, userpwd);
return admin;
}
}
4.在LoginServlet中处理登录请求
package com.sxt.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.sxt.entity.Admin;
import com.sxt.service.AdminService;
import com.sxt.service.impl.AdminServiceImpl;
public class LoginServlet extends HttpServlet {
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
// 处理登录请求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// 获取表单传来的参数
String uloginname = request.getParameter("uloginname");
String upsw = request.getParameter("upsw");
String code = request.getParameter("code");
// 判断输入的验证码和session中存的验证码是否一致
HttpSession session = request.getSession();
String checkCode = (String) session.getAttribute("code");
// equalsIgnoreCase:比较字符串是否相等,不区分大小写
if (code.equalsIgnoreCase(checkCode)) {
// 调用service的登录方法,传入用户名和密码
AdminService service = new AdminServiceImpl();
Admin admin = service.login(uloginname, upsw);
if (admin != null) {
// 如果登录成功,跳转到后台主页
// 1.将管理员对象保存在session
session.setAttribute("admin", admin);
// 2.跳转到后台主页
request.getRequestDispatcher("WEB-INF/jsp/main/index.jsp")
.forward(request, response);
} else {
// 登录失败,跳转到登录页面
// 1.将错误信息存到request中
request.setAttribute("errorMsg", "用户名或密码错误");
// 2.转发到登录页面
request.getRequestDispatcher("login.jsp").forward(request,
response);
}
} else {
// 验证码错误,跳转到登录页面
// 1.将错误信息存到request中
request.setAttribute("errorMsg", "验证码错误");
// 2.转发到登录页面
request.getRequestDispatcher("login.jsp")
.forward(request, response);
}
}
}
任务8:分页显示所有会员
- 修改后台主页jsp/main/index.jsp上会员管理菜单的超链接请求路径
<a
href="${pageContext.request.contextPath}/user.action"
target="right"><span class="icon-caret-right"></span>会员管理</a>
- 在UserDao中添加查询数据集合的方法queryData和查询总记录数的方法queryCount,代码略
package com.sxt.dao;
import java.util.List;
import com.sxt.entity.User;
import com.sxt.util.PageBean;
public interface UserDao {
//根据页号,每页记录数,查询当前页的用户数据集合
List<User> queryData(PageBean<User> pb);
//查询总记录数
int queryCount();
}
package com.sxt.dao.impl;
import java.util.List;
import com.sxt.dao.BaseDao;
import com.sxt.dao.UserDao;
import com.sxt.entity.User;
import com.sxt.util.PageBean;
public class UserDaoImpl extends BaseDao<User> implements UserDao {
@Override
public List<User> queryData(PageBean<User> pb) {
// TODO Auto-generated method stub
String sql="select * from t_user limit ?,?";
List<User> list = this.getList(User.class, sql, (pb.getCurrentPage()-1)*pb.getPageSize(),pb.getPageSize());
return list;
}
@Override
public int queryCount() {
// TODO Auto-generated method stub
String sql="select count(*) from t_user";
int total = this.getTotal(sql);
return total;
}
}
- 在userService中添加分页查询用户的方法
public class UserServiceImpl implements UserService {
private UserDao dao = new UserDaoImpl();
@Override
public void getPageBean(PageBean<User> pb) {
// TODO Auto-generated method stub
List<User> list = dao.queryData(pb);
int totalCount = dao.queryCount();
// 设置pageBean的其它2个属性
pb.setData(list);
pb.setTotalCount(totalCount);
}
}
- 在Userservlet中处理分页查询用户的请求
// 处理分页查询前台用户的请求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取请求的页号,即要查询第几页数据,假设请求参数名currentPage
String pageStr = request.getParameter("currentPage");
// 保存请求的页号
int currentPage = 1;
if (pageStr != null) {
currentPage = Integer.parseInt(pageStr);
}
// 每页条数
int pageSize = 2;
// 封装成PageBean,它只有2个数据currentPage和pageSize
PageBean<User> pb = new PageBean<>();
pb.setCurrentPage(currentPage);
pb.setPageSize(pageSize);
// 调用UserService,传入PageBean
UserService service = new UserServiceImpl();
service.getPageBean(pb);
// 把PageBean存到request域中
request.setAttribute("pb", pb);
// 转发到WEB-INF/jsp/user/list.jsp
request.getRequestDispatcher("WEB-INF/jsp/user/list.jsp").forward(
request, response);
}
5在用户列表页面上分页显示用户,做分页超链接的排版
<!-- 当前页是第1页时,首页,上一页直接显示,
<a class="nocls">首页</a> <a class="nocls">上一页</a>
不是第1页时,点击后跳转页面,onclick指定函数 -->
<c:choose>
<c:when test="${pb.currentPage eq 1}">
<a class="nocls">首页</a>
<a class="nocls">上一页</a>
</c:when>
<c:otherwise>
<a href="javascript:void(0)" onclick="changePageNum(1)">首页</a>
<a href="javascript:void(0)"
onclick="changePageNum(${pb.currentPage-1})">上一页</a>
</c:otherwise>
</c:choose>
<!-- 生成一组页号 -->
<!-- 当前页显示在span里面,其它页点击后跳转页面 -->
<c:forEach var="sn" begin="1" end="${pb.totalPage }">
<c:choose>
<c:when test="${pb.currentPage eq sn}">
<span class="current">${sn }</span>
</c:when>
<c:otherwise>
<a href="javascript:void(0)" onclick="changePageNum(${sn})">${sn }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<!-- <a href="javascript:void(0)" onclick="alert(1);">1</a> <span
class="current">2</span> -->
<!-- 当前页是尾页时,尾页,下一页直接显示,
<a class="nocls">下一页</a> <a class="nocls">尾页</a>
不是尾页时,点击后跳转页面,onclick指定函数 -->
<c:choose>
<c:when test="${pb.currentPage eq pb.totalPage}">
<a class="nocls">下一页</a>
<a class="nocls">尾页</a>
</c:when>
<c:otherwise>
<a href="javascript:void(0)" onclick="changePageNum(${pb.currentPage+1})">下一页</a>
<a href="javascript:void(0)"
onclick="changePageNum(${pb.totalPage})">尾页</a>
</c:otherwise>
</c:choose>
任务9:显示商品类别(无分页)
1)修改main/index.jsp页面上的商品类别管理超链接
<a
href="${pageContext.request.contextPath}/catelog.action?method=queryAll"
target="right"><span class="icon-caret-right"></span>商品类别管理</a>
2.创建CatelogDao接口,添加查询所有商品类别的方法,代码略
package com.sxt.dao;
import java.util.List;
import com.sxt.entity.Catelog;
public interface CatelogDao {
//全查询商品类别
List<Catelog> queryAll();
}
package com.sxt.dao.impl;
import java.util.List;
import com.sxt.dao.BaseDao;
import com.sxt.dao.CatelogDao;
import com.sxt.entity.Catelog;
public class CatelogDaoImpl extends BaseDao<Catelog> implements CatelogDao {
@Override
public List<Catelog> queryAll() {
// TODO Auto-generated method stub
String sql="select * from t_catelog";
List<Catelog> list = this.getList(Catelog.class, sql);
return list;
}
}
3.创建CatelogService接口,加入获取所有类别的方法,代码略
package com.sxt.service;
import java.util.List;
import com.sxt.entity.Catelog;
public interface CatelogService {
//获取所有商品类别
List<Catelog> getAllCatelogs();
}
package com.sxt.service.impl;
import java.util.List;
import com.sxt.dao.CatelogDao;
import com.sxt.dao.impl.CatelogDaoImpl;
import com.sxt.entity.Catelog;
import com.sxt.service.CatelogService;
public class CatelogServiceImpl implements CatelogService {
private CatelogDao dao=new CatelogDaoImpl();
@Override
public List<Catelog> getAllCatelogs() {
// TODO Auto-generated method stub
List<Catelog> list = dao.queryAll();
return list;
}
}
4.创建CatelogServlet,处理获取所有商品类别的请求
//获取所有商品类别
public void queryAll(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//直接调用Service的方法,返回商品类别的集合
CatelogService service=new CatelogServiceImpl();
List<Catelog> list = service.getAllCatelogs();
//把商品类别的集合存到request域中
request.setAttribute("list", list);
//转发到catelog/list.jsp
request.getRequestDispatcher("WEB-INF/jsp/catelog/list.jsp").forward(
request, response);
}