Java任务:商品信息页面连接后台之客户端

来自CloudWiki
跳转至: 导航搜索

前情回顾

Windows窗体在三层架构中的位置

Java2020-12-3.png

windows窗体在三层架构中,属于表示层,表示层需要和中间的业务逻辑层连接起来。

构造方法的修改

GoodsShow添加成员变量

在GoodsShow中添加如下成员变量:

GoodsService gs;
 CartsService cs;
 User user;

Java2020-12-38.png

因为连接业务逻辑层要调用service层的代码,所以,在GoodsShow中添加GoodsService 和CartsService 两个类的对象,

因为要传输用户登录信息,所以增加了User类的对象

编写initialize方法

因为原有的构造方法内容是有机器自动生成,不利于代码阅读,因此我们将原有的构造方法的代码移至方法initialize(User u)中,

在构造方法中调用initialize方法,从而使构造方法的代码尽可能简单、易读。

Java2020-12-37.png

因为要显示当前的用户信息,所以initialize方法体中有一个参数 User u,

在initialize方法内部 靠近lblUser的地方 可以添加显示当前用户名的代码:

if(u != null) lblUser.setText("欢迎你,"+u.getName());

重写GoodsShow构造方法

因为我们刚才把构造方法的大部分代码都迁移至initialize方法,

所以GoodsShow构造方法中 代码就很少了,一个是调用initialize方法,再一个就是建立数据库连接、初始化service层的对象以便使用。

为了增加用户体验,我们可以在窗体一开始创建的时候,就显示全部商品,通过showGoods方法来体现。

构造方法一共有两个:一个是无参的GoodsShow(),供本窗体测试之用,一个是有参的GoodsShow(User u) ,将来可被用户登录窗体所调用,传入用户信息。

	/**
	 * Create the frame.
	 */
	public GoodsShow() {
         
		initialize(this.user);
		MyCon.getConn();//建立数据库连接	
		gs = new GoodsService();
	        cs = new CartsService();
		ArrayList<Goods> goods=gs.queryGoods();		
		showGoods(goods);
	}//这个方法供本类测试之用

	public GoodsShow(User u) {//这个方法供用户登录页面调用

		initialize(u);
		//MyCon.getConn();//建立数据库连接
		this.user =u;
		
		gs = new GoodsService();
	        cs = new CartsService();
		ArrayList<Goods> goods=gs.queryGoods();		
		showGoods(goods);
		
		JOptionPane.showMessageDialog(null, "欢迎您,用户"+u.getId(),"信息", JOptionPane.INFORMATION_MESSAGE);
	}

编写事件响应事件

为“查询”按钮添加响应事件

双击图形界面中“查询”按钮,即可进入其响应事件的编写:

btnQuery.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String goodsname = GoodsNameField.getText();
				ArrayList<Goods> goods=new ArrayList<>();
				String type =(String)TypeBox.getSelectedItem();
				JOptionPane.showMessageDialog(null, "您选择的是"+type, "信息", JOptionPane.INFORMATION_MESSAGE);
				if(type.equals("查询所有")) {
					goods =gs.queryGoods();
				}else if(type.equals("按名称查询")){
					goods =gs.queryGoods(goodsname);
				}
				showGoods(goods);
				//增加调用业务逻辑层的代码,
				JOptionPane.showMessageDialog(null, "'"+type+"'查询成功!", "信息", JOptionPane.INFORMATION_MESSAGE);
			}
		});

显示数据的函数showGoods():


	private void showGoods(ArrayList<Goods> goods){
    	//在表格中显示数据
 		DefaultTableModel dt=(DefaultTableModel) table.getModel();
 		dt.setRowCount(0);
 		
 		for(int i=0;i<goods.size();i++) {
			Goods g=goods.get(i);
			dt.insertRow(i, new Object[] {
					g.getId(),g.getName(),g.getPrice(),g.getNum(),g.getPrice()*g.getNum()
					
			});
		}
    }

为"购买”按钮添加响应事件

双击图形界面中“购买”按钮,即可进入其响应事件的编写:

btnBuy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//获取用户在商品表格中选择的行
				int selectRow = table.getSelectedRow();
				int gid;
				//当用户未登录时
				if(user ==null) {
					JOptionPane.showMessageDialog(null, "请您先登录再购买!", "警告信息",JOptionPane.WARNING_MESSAGE);
					return;
				}
				//当用户没有选择商品时
				if(selectRow<0) {
					JOptionPane.showMessageDialog(null, "请选择你所需要购买的商品","错误信息",JOptionPane.WARNING_MESSAGE);
					return;
				}else {
					String id =(String)table.getModel().getValueAt(selectRow, 0);
					gid=Integer.valueOf(id);
					JOptionPane.showMessageDialog(null, "您选择的是"+gid+"号商品", "信息", JOptionPane.INFORMATION_MESSAGE);
				}
								
				//询问顾客购买商品数量
				int quantity=Integer.parseInt(JOptionPane.showInputDialog("你需要购买数量是:"));
				//JOptionPane.showMessageDialog(null, "您选择的是"+gid+"号商品,购买数量为"+quantity, "信息", JOptionPane.INFORMATION_MESSAGE);
				if(user !=null) {
					int uid = user.getId();
				    String message = cs.addToCart(uid, gid, quantity);		
				    JOptionPane.showMessageDialog(null, message, "信息", JOptionPane.INFORMATION_MESSAGE);
				    //购买后获取购物车种商品数量
				    int goodsQuantity=cs.getNum(uid);
					//显示购物车中的数据
					lblQuantity.setText(goodsQuantity+"件");	
				}				

			}
		});

查看详情的响应事件

鼠标单击图形界面的查看详情标签,点击页面左下角的Source模式,找到查看详情标签对应的代码,添加如下语句:

lblCart.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				JOptionPane.showMessageDialog(null, "您选择的是查看购买情况", "信息", JOptionPane.INFORMATION_MESSAGE);
				ArrayList<Goods> mygoods=new ArrayList<>();
				if(u!=null) {
					mygoods = cs.queryGoods(u.getId());
					showGoods(mygoods);
					//购买后获取购物车种商品数量
				    int goodsQuantity=cs.getNum(u.getId());
					//显示购物车中的数据
					lblQuantity.setText(goodsQuantity+"件");	
				}else {
					JOptionPane.showMessageDialog(null, "请您先登录再购买!", "警告信息",JOptionPane.WARNING_MESSAGE);
				}
				
			}
		});

退出系统的响应事件

鼠标单击图形界面的退出按钮标签,点击页面左下角的Source模式,找到查看详情标签对应的代码,添加如下语句:

退出按钮的响应事件:

lbllogout.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				MyCon.disConn();
				GoodsShow.this.dispose();
				
			}
		});

与用户登录界面联调联试

UserForm的“登录"按钮的响应事件做如下修改:

		btnLogin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				MyCon.getConn();//建立数据库连接
				String uname = textField.getText();
				String pwd = new String(passwordField.getPassword());
				UserService us =new UserService(); 
				String info[]= us.login(uname,pwd);
			        System.out.println(info[1]);//打印登录信息
			        int uid = Integer.valueOf(info[0]);
			        String message = info[1];
				JOptionPane.showMessageDialog(null, uid+","+message, "信息", JOptionPane.INFORMATION_MESSAGE);
				
				//如果登陆成功,进入系统主页面,否则重新输入
				if(message.indexOf("成功") != -1) {
					User u= new User(uid,uname,pwd);
					GoodsShow gform = new GoodsShow(u);
					gform.setVisible(true);
					UserForm.this.dispose();				
				}else {
					textField.setText("");
					passwordField.setText("");
				}
			}
		});

运行结果:

先切换UserForm的图形界面,设计模式下点击运行:

Java2020-12-34.png

如果登录成功,进入商品信息页面,进行浏览:

Java2020-12-39.png