您的位置:首页 > 其它

从订单信息页面进入订单详细商品页面,最简单的MVC思想

2017-11-24 17:15 411 查看

前言

习惯上图,看流程图把,下面是具体实现以后的一个流程图。







步骤-

(1)点击订单详情,进入订单详情列表,展示订单的一下基本信息,在上图框内,可随机输入查询信息,查询具体订单信息。

(2)点击订单商品详情,进入具体订单,图中进入订单编号1的商品页面,可以看到具体商品信息,从数据库我们建立一张表,关联订单跟具体商品的关系。

正文

直接上代码吧,简单粗暴,因为之前有朋友需要具体实现,我会把最重要的放在这里,因为篇幅,所以一些不太重要的就不放了,下面是OrderDaoImpl.java的具体代码,这三个方法具体就涉及到了上图三个页面的跳转。

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanListHandler;

import org.apache.commons.dbutils.handlers.ColumnListHandler;

import com.shao.Util.C3P0Util;

import com.shao.dao.OrderDao;

import com.shao.pojo.Order;

public class OrderDaoImpl implements OrderDao {

@Override

public List<Order> selectOrders() throws SQLException {

// TODO Auto-generated method stub

QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

String sql =" select * from orders";

return qr.query(sql, new BeanListHandler<Order>(Order.class));

}

@Override

public List<Object> selectItemsById(int order_id) throws SQLException {

// TODO Auto-generated method stub

QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

String sql =" select item_id from ord_item where order_id = ?";

return qr.query(sql, new ColumnListHandler(1), order_id);

}

@Override

public List<Order> selectByCondition(String id, String shop_id, String user_id) throws SQLException {

// TODO Auto-generated method stub

QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

String sql =" select * from orders where 1=1 ";

List list = new ArrayList();

if(!"".equals(id.trim())){

int iid = Integer.parseInt(id.trim());

sql+=" and id =?"; // 不能在这写% %'1002'%

list.add(iid);// '%1002%'

}

if(!"".equals(shop_id.trim())){

int sid = Integer.parseInt(shop_id.trim());

sql+=" and shop_id=?";

list.add(sid);

}

if(!"".equals(user_id.trim())){

int uid = Integer.parseInt(user_id.trim());

sql+=" and user_id = ?";

list.add(uid);

}

return qr.query(sql, new BeanListHandler<Order>(Order.class), list.toArray());

}

}

(1)public List<Order> selectOrders() 该方法主要是实现对所有订单的查询,这个应该没有难度。

(2)public List<Object> selectItemsById(int order_id) 该方法具体涉及到根据订单编号,寻找商品编号,然后我们再根据商品编号,寻找具体商品信息。寻找具体商品信息我写在ItemDaoImpl.java里面了。

public Item selectItemById(int id) throws SQLException {

// TODO Auto-generated method stub

QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

String sql =" select * from item where id = ?";

return qr.query(sql, new BeanHandler<Item>(Item.class), id);

}

(3) public List<Order> selectByCondition(String id, String shop_id, String user_id)该方法主要就是通过输入条件,进一步对订单筛选,这样我们可以快速定位到我们需要的订单信息。

问题

其实上面的都应该好处理,在这里,我遇到了一个问题,主要在于具体商品商品信息的处理,怎么才能通过上面的轮转跳到具体商品信息呢,在这里我后来用这样的方法处理出来了!



上面是订单详情的事件处理,/servlet/FindItemsByOrderServlet?order_id=${o.id },通过把order_id的编号传给这个servlet来处理,具体FindItemsByOrderServlet代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

request.setCharacterEncoding("UTF-8");

int order_id =Integer.parseInt(request.getParameter("order_id")) ;//获取order_id的参数并且转化成int类型

System.out.println("order_id = "+order_id);

OrderService os = new OrderServiceImpl();

ItemService is = new ItemServiceImpl();

List<Object> list = new ArrayList<>();

list= os.selectItemsById(order_id); //根据order_id找到对应的Item_id的集合,并放在list中

System.out.println(list.toString());

List<Item> itemList = new ArrayList<Item>();

for(int i=0;i<list.size();i++){

itemList.add(is.selectItemById((int)list.get(i))); //遍历list,根据商品编号找到具体的商品信息放在JavaBen(Item),然后存入itemList

}

request.getSession().setAttribute("item", itemList);

System.out.println("找到订单对应的商品信息!");

request.getRequestDispatcher("/admin/myhome/ord_itemlist.jsp").forward(request, response);

}



可以看到具体输出,我们通过得到订单编号1,查到在订单编号里面有2件商品,商品编号为2,3,然后放在List里面,最后遍历list 得到具体商品的信息,显示在页面中。

问题

还有一个问题,之前写完以后,发现List一直为空,没有取到2,3的商品编号,然后我就定义到下面的数据库语句:

@Override

public List<Integer> selectItemsById(int order_id) throws SQLException {

// TODO Auto-generated method stub

QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

String sql =" select item_id from ord_item where order_id = ?";

return qr.query(sql, new BeanListHandler<Integer>(Integer.class), order_id);

}



select item_id from ord_item where order_id = 1,通过运行这句话得到上面的结果,语句是对的,但是却一直说List 是空,那么我的问题就出在return qr.query(sql, new BeanListHandler<Integer>(Integer.class), order_id);后来查询了资料,BeanListHandler主要是存储对象的集合,而我这里只有一列值,但是我不知道为什么存储值就不行?所以我就继续找,一列数据采用的是ColumnListHandler,于是我改成了new
ColumnListHandler<Integer>(),然后eclipse开始报错The type ColumnListHandler is not generic; it cannot be parameterized with arguments <Integer>告诉我,里面是不能存Integer,不支持,里面还是只能放Object,最后就继续改,写成了下面这样:

@Override

public List<Object> selectItemsById(int order_id) throws SQLException {

// TODO Auto-generated method stub

QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

String sql =" select item_id from ord_item where order_id = ?";

return qr.query(sql, new ColumnListHandler(1), order_id);

}

最后,控制器哪里也要处理,所以在servlet里面我们看到这样一句话:

for(int i=0;i<list.size();i++){

itemList.add(is.selectItemById((int)list.get(i))); //遍历list,根据商品编号找到具体的商品信息放在JavaBen(Item),然后存入itemList

}

我把(int)list.get(i)强制转化成Int类型,因为is.selectItemById(int shop_id);里面定义的Int 类型,到此就结束了,list里面终于出现了我预期的【2,3】集合。

问题就是这么让你意想不到,不过现在遇到问题我也不急了,主要就是一定要看错误,然后定义到具体位置,最怕就是显示台什么也不报错,我也出现了,于是我就重启服务器,然后显示台就会把错误显示出来,我们然后根据提示大概定义到错误的地方,我们可以采用我里面的System.out.print()去尝试输出,也可以Debug来一步步看,这样我们就可以快速定位问题,多做多调试,其实编程也可以很快乐,那种一点点的成就感!喜欢的可以关注,有问题,或者对上面的解决方案你有更好的,欢迎探讨,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐