序列化与反序列化
因为TCP/IP协议只支持字节数组的传输,不能直接传对象。对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
socket编程使用的是TCP协议
今天偶然看到了之前用java写的一个课设,简单记录一下这个知识点。
下面是我的课程设计的内容:
根据本课程实验材料和各次实验列出的任务要求,完成一个相对完整的小型管理系统,涉及到的核心知识包括数据库访问(JDBC、事务)、配置文件、对象序列化与反序列化、多线程、计时器、网络编程、Swing界面与事件驱动模型、正则表达式和格式化显示等。
3.1 基本模块1:对象序列化与反序列化(订单和订单项对应的类代码)
订单Orders.java
package water.test1.po;
import java.io.Serializable;
import java.sql.Date;
public class Orders implements Serializable {
private String orderID;
private String customerID;
private Date orderTime;
private double totalMoney;
private String orderState;
private String senderName;
private String senderPhone;
public Orders()
{
}
public Orders(String orderID,String customerID,Date orderTime,double totalMoney,String orderState,String senderName,String senderPhone)
{
this.orderID=orderID;
this.customerID=customerID;
this.orderTime=orderTime;
this.totalMoney=totalMoney;
this.orderState=orderState;
this.senderName=senderName;
this.senderPhone=senderPhone;
}
public void setOrderID(String orderID)
{
this.orderID=orderID;
}
public void setCustomerID(String customerID)
{
this.customerID=customerID;
}
public void setOrderTime(Date orderTime)
{
this.orderTime=orderTime;
}
public void setTotalMoney(double totalMoney)
{
this.totalMoney=totalMoney;
}
public void setOrderState(String orderState)
{
this.orderState=orderState;
}
public void setSenderName(String senderName)
{
this.senderName=senderName;
}
public void setSenderPhone(String senderPhone)
{
this.senderPhone=senderPhone;
}
public String getOrderID()
{
return this.orderID;
}
public String getCustomerID()
{
return this.customerID;
}
public Date getOrderTime()
{
return this.orderTime;
}
public double getTotalMoney()
{
return this.totalMoney;
}
public String getOrderState()
{
return this.orderState;
}
public String getSenderName()
{
return this.senderName;
}
public String getSenderPhone()
{
return this.senderPhone;
}
public String toString() {
return this.getOrderID() + "," + this.getCustomerID() + "," + this.getOrderTime()
+ "," + this.getTotalMoney() + "," + this.getOrderState()+ "," + this.getSenderName()
+ "," + this.getSenderPhone();
}
}
订单项OrderItems.java
package water.test1.po;
import java.io.Serializable;
public class OrderItems implements Serializable {
private String orderID;
private String type;
private double price;
private int number;
private double total;
public OrderItems()
{
}
public OrderItems(String orderID,String type,double price,int number,double total){
this.orderID=orderID;
this.type=type;
this.price=price;
this.number=number;
this.total=total;
}
public void setOrderID(String orderID)
{
this.orderID=orderID;
}
public void setType(String type)
{
this.type=type;
}
public void setPrice(double price)
{
this.price=price;
}
public void setNumber(int number)
{
this.number=number;
}
public void setTotal(double total)
{
this.total=total;
}
public String getOrderID()
{
return this.orderID;
}
public String getType()
{
return this.type;
}
public double getPrice()
{
return this.price;
}
public int getNumber()
{
return this.number;
}
public double getTotal()
{
return this.total;
}
public String toString() {
return this.getOrderID() + "," + this.getType()+ "," + this.getPrice()
+ "," + this.getNumber() + "," + this.getTotal();
}}
3.2 基本模块2:JDBC下单事务和商品浏览功能的相关代码、必要的方案说明。
对于下单,我采用了购物车的方式,浏览商品后可添加至个人购物车,在购物车中选择需要购买的商品可完成下单操作。对于下单事务,包括3个操作——删除购物车中的商品、生成订单、生成订单对应的所有订单项,一旦3个步骤任意一个出现错误,便进行回滚操作。
对于商品浏览,我采用JTree的方式来对商品进行展示,所以需要获取产品集合,然后在JTree中进行展示。
对于数据库操作的部分,我采用的是存储过程的方式,下单事务以及商品浏览时所需调用的存储过程如下:
调用的存储过程
/*查询所有产品*/
alter procedure selectPro
as
select * from Products order by cast(type as decimal)
go
/*添加订单*/
alter procedure addOrd(@orderID varchar(100),@customerID varchar(20),@orderTime datetime,@totalMoney real,@orderState varchar(20),@senderName varchar(20),@senderPhone varchar(20))
as
insert into Orders(orderID,customerID,orderTime,totalMoney,orderState,senderName,senderPhone) values(@orderID,@customerID,@orderTime,@totalMoney,@orderState,@senderName,@senderPhone)
GO
/*添加订单项*/
alter procedure addOrderItems(@orderID varchar(100),@type varchar(10),@price real,@number int,@total real)
as
insert into OrderItems(orderID,type,price,number,total) values(@orderID,@type,@price,@number,@total)
go
/*删除购物车的商品*/
alter procedure deleteShopCar(@customerID varchar(50),@type varchar(10))
as
delete ShopCar where customerID=@customerID and type=@type
go
下单事务PlaceOrdTran.java
package water.test1.transaction;
import java.sql.*;
import java.util.*;
import javax.swing.plaf.synth.SynthSeparatorUI;
import water.test1.db.DBUtil;
import water.test1.po.*;
import water.test1.service.OrderItemsService;
import water.test1.service.OrdersService;
public class PlaceOrdTran {
public boolean placeOrd(Orders order,ArrayList<OrderItems> ordItem,ArrayList<ShopCar> shopCars)
{
DBUtil db=new DBUtil();
String sql="{call addOrd(?,?,?,?,?,?,?)}";
String sql2="{call addOrderItems(?,?,?,?,?)}";
String sql3="{call deleteShopCar(?,?)}";
//删除购物车中的购物项
Connection conn=null;
try {
conn=db.getConnection();
boolean autoCommit=conn.getAutoCommit();
if(autoCommit)
{
conn.setAutoCommit(false);
}
Statement stmt=conn.createStatement();
for(int i=0;i<ordItem.size();i++)
{
db.executeUpdate(sql2, new Object[] { ordItem.get(i).getOrderID(),ordItem.get(i).getType(),
ordItem.get(i).getPrice(),ordItem.get(i).getNumber(),ordItem.get(i).getTotal()}) ;
}
db.executeUpdate(sql, new Object[] { order.getOrderID(),order.getCustomerID(),
order.getOrderTime(),order.getTotalMoney()
,order.getOrderState(),order.getSenderName(),order.getSenderPhone()});
for(int i=0;i<shopCars.size();i++)
{
db.executeUpdate(sql3, new Object[] { shopCars.get(i).getCustomerID(),shopCars.get(i).getType()}) ;
}
conn.commit();
conn.setAutoCommit(autoCommit);
}
catch(Exception e)
{
if(conn!=null)
{
try {
System.out.println("回滚");
conn.rollback();
return false;
}
catch(SQLException e1)
{
e1.printStackTrace();
}
}
e.printStackTrace();
}
finally {
db.closeAll();
}
return true;
}
}
获取商品集合方法
public ArrayList<Products> select()
{
ArrayList<Products> pro=new ArrayList<Products>();
DBUtil db=new DBUtil();
String sql="{call selectPro}";
try {
db.getConnection();
ResultSet rs=db.executeQuery(sql, null);
while(rs.next())
{
Products product=new Products();
System.out.println(rs.getString(1));
product.setType(rs.getString(1));
product.setPrice(rs.getDouble(2));
product.setPath(rs.getString(3));
pro.add(product);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
db.closeAll();
}
return pro;
}
商品浏览客户端代码
JTree tree = new JTree();
tree.setModel(new DefaultTreeModel(
new DefaultMutableTreeNode("Water") {
{
//请求服务器,读取产品类型集合
pro=Client.selectProducts();
DefaultMutableTreeNode node_1;
node_1 = new DefaultMutableTreeNode("产品类型");
for(int i=0;i<pro.size();i++)
{
node_1.add(new DefaultMutableTreeNode(pro.get(i).getType()+"L"));
}
add(node_1);
}
}
));
tree.setBounds(0, 0, 122, 369);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(0, 0, 122, 369);
panel.add(scrollPane_1);
scrollPane_1.setViewportView(tree);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent arg0) {
TreePath path=tree.getSelectionPath();
if(path==null)
{
return ;
}
DefaultMutableTreeNode selectedNode=(DefaultMutableTreeNode)path.getLastPathComponent();
if(selectedNode.getUserObject().toString().equals("产品类型"))
{
panel_2.removeAll();
panel_2.add(lblNewLabel_1);
lblNewLabel_1.setVisible(true);
textArea.setText("");
repaint();
}
//浏览商品
for(int i=0;i<pro.size();i++)
{
if(selectedNode.getUserObject().toString().equals(pro.get(i).getType()+"L"))
{
products=pro.get(i);
panel_2.removeAll();
lblNewLabel_1.setVisible(false);
//在文本区添加产品类型的信息
double p=pro.get(i).getPrice();
Locale cnLocale=new Locale("zh", "CN");
NumberFormat cnNumberFormat=NumberFormat.getCurrencyInstance(cnLocale);
textArea.setText(selectedNode.getUserObject().toString()+" "+cnNumberFormat.format(p));
JLabel lblNewLabel = new JLabel("");
String str="./src/images/";
lblNewLabel.setIcon(new ImageIcon(str+pro.get(i).getPath()));
lblNewLabel.setBounds(0, 0, 347, 302);
panel_2.add(lblNewLabel);
JButton btnNewButton1 = new JButton("购物车");
btnNewButton1.setBounds(452, 115, 93, 23);
panel_2.add(btnNewButton1);
JLabel label=new JLabel("",JLabel.CENTER);
label.setBounds(452, 95, 93, 23);
panel_2.add(label);
repaint();
btnNewButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//int number=Integer.parseInt(label.getText());
//number++;
if(Login.id==null)
{
JOptionPane.showMessageDialog(btnNewButton1.getParent(), "请先进行登录","",JOptionPane.ERROR_MESSAGE);
}
else
{
ShopCar shopCar=new ShopCar();
shopCar.setCustomerID(Login.id);
shopCar.setType(products.getType());
shopCar.setNum(1);
boolean flag=Client.addShopCar(shopCar);
if(flag)
label.setText("已加入购物车");
else
label.setText("添加失败");
new UpdateShopCar().start();
}
//添加到购物车
}
});
}
}
}
});
3.3 基本模块3:服务器端程序代码(含对模块1和模块2数据相关代码的调用)、必要的方案说明。
对于服务器端,我利用Packet类对客户端传来的数据进封装,根据Packet的flag标志判断用户请求。我利用三个线程:分别是接收socket线程receive、处理客户端请求线程getMess、返回客户端数据的线程sendMess来处理用户请求。接收客户端发来的socket的线程一直处于alive状态用来接收socket,一旦接收到后便开一个处理该socket的线程,处理完请求后开一个返回客户端数据的线程,从而保证支持多用户并发操作。
模块一和模块二的调用:对于下单的操作,我在客户端进行装箱操作(把数据放至ArrayList),在服务器端进行拆箱操作(把ArrayList中数据,利用集合中object的getClass().getName()方法判断是何种类型的数据,从而进行转换),然后传参数到处理下单事务的数中,并调用该函数完成下单,返回Boolean型数据给客户端,表示是否下单成功。对于商品浏览的客户端请求,在服务器端直接调用ProductsService中获取全部产品的方法,保存数据到集合中,将该集合封装到Packet,返回给客户端,在客户端进行展示。
服务器ServerService.java
package water.test2.view;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Vector;
import water.test1.po.Customers;
import water.test1.po.OrderItems;
import water.test1.po.Orders;
import water.test1.po.Products;
import water.test1.po.ShopCar;
import water.test1.service.CustomersService;
import water.test1.service.OrderItemsService;
import water.test1.service.OrdersService;
import water.test1.service.ProductsService;
import water.test1.service.ShopCarService;
import water.test1.transaction.AddShopCarTran;
import water.test1.transaction.PlaceOrdTran;
public class ServerService {
ServerSocket server;
public ServerService() {
try {
server=new ServerSocket(28890);
System.out.println("服务器已启动");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new receive().start();
// TODO Auto-generated constructor stub
}
class receive extends Thread
{
public void run()
{
while(this.isAlive()) {
try {
Socket socket=server.accept();
if(socket!=null)
{
new getMess(socket).start();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
class getMess extends Thread
{
Socket socket;
ObjectInputStream ois;
public getMess(Socket socket)
{
this.socket=socket;
try {
ois=new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run()
{
//while(this.isAlive()) {
try {
Packet packet=(Packet)ois.readObject();
//if(packet!=null) {
//注册
if(packet.getFlag().equals("注册"))
{
Customers customers=(Customers) packet.getContent();
CustomersService cs=new CustomersService();
int flag=0;
try {
flag=cs.add(customers);
}
catch(Exception e)
{
Packet packet2;
packet2=new Packet("注册结果", false);
new sendMess(socket,packet2).start();
e.printStackTrace();
}
Packet packet2;
if(flag==1)
packet2=new Packet("注册结果", true);
else {
packet2=new Packet("注册结果", false);
}
new sendMess(socket,packet2).start();
}
//登录
if(packet.getFlag().equals("登录"))
{
Customers customers=(Customers) packet.getContent();
CustomersService cs=new CustomersService();
boolean flag=false;
try {
flag=cs.selectCumLog(customers);
}
catch(Exception e)
{
Packet packet2;
packet2=new Packet("登录失败", false);
new sendMess(socket,packet2).start();
e.printStackTrace();
}
Packet packet2;
if(flag)
packet2=new Packet("登录成功", true);
else {
packet2=new Packet("登录失败", false);
}
new sendMess(socket,packet2).start();
}
//添加购物车
if(packet.getFlag().equals("添加购物车"))
{
ShopCar shopCar=(ShopCar) packet.getContent();
AddShopCarTran addShopCarTran=new AddShopCarTran();
boolean flag=false;
try {
flag=addShopCarTran.addShopCar(shopCar);
}
catch(Exception e)
{
Packet packet2;
packet2=new Packet("添加失败", false);
new sendMess(socket,packet2).start();
e.printStackTrace();
}
Packet packet2;
if(flag)
packet2=new Packet("添加成功", true);
else {
packet2=new Packet("添加失败", false);
}
new sendMess(socket,packet2).start();
}
//产品列表
if(packet.getFlag().equals("产品"))
{
ProductsService ps=new ProductsService();
ArrayList<Products> products =new ArrayList<Products>();
products=ps.select();
Packet packet2;
packet2=new Packet("所有产品", products);
new sendMess(socket,packet2).start();
}
//显示购物车
if(packet.getFlag().equals("显示购物车"))
{
ShopCar shopCar=(ShopCar) packet.getContent();
ShopCarService shopCarService=new ShopCarService();
Vector<Vector<Object>> data=new Vector<Vector<Object>>();
data=shopCarService.select(shopCar);
Packet packet2;
packet2=new Packet("购物车内商品", data);
new sendMess(socket,packet2).start();
}
//下单操作
if(packet.getFlag().equals("下单"))
{
ArrayList<Object> a=(ArrayList<Object>)packet.getContent();
Iterator<Object> iterator=a.iterator();
Orders orders=new Orders();
ArrayList<OrderItems> orderItems=new ArrayList<OrderItems>();
ArrayList<ShopCar> shopCars=new ArrayList<ShopCar>();
while(iterator.hasNext())
{
Object object=iterator.next();
if(object.getClass().getName().equals("water.test1.po.Orders"))
orders=(Orders)object;
if(object.getClass().getName().equals("water.test1.po.OrderItems"))
{
OrderItems orderItems2=new OrderItems();
orderItems2=(OrderItems)object;
orderItems.add(orderItems2);
}
if(object.getClass().getName().equals("water.test1.po.ShopCar"))
{
ShopCar shopCar=new ShopCar();
shopCar=(ShopCar)object;
shopCars.add(shopCar);
}
}
PlaceOrdTran p=new PlaceOrdTran();
boolean flag=p.placeOrd(orders, orderItems,shopCars);
Packet packet2;
if(flag)
packet2=new Packet("下单成功", true);
else {
packet2=new Packet("下单失败", false);
}
new sendMess(socket,packet2).start();
}
//显示个人订单
if(packet.getFlag().equals("显示个人订单"))
{
Customers customers=(Customers) packet.getContent();
OrdersService orderService=new OrdersService();
Vector<Vector<Object>> data=new Vector<Vector<Object>>();
data=orderService.selectOrdsByPerson(customers);
Packet packet2;
packet2=new Packet("个人订单", data);
new sendMess(socket,packet2).start();
}
if(packet.getFlag().equals("订单项"))
{
Orders orders=(Orders)packet.getContent();
OrderItemsService os=new OrderItemsService();
ArrayList<OrderItems> orderItems =new ArrayList<OrderItems>();
orderItems=os.select(orders);
Packet packet2;
packet2=new Packet("订单项", orderItems);
new sendMess(socket,packet2).start();
}
if(packet.getFlag().equals("删除订单"))
{
Orders orders=(Orders) packet.getContent();
OrdersService ordersService=new OrdersService();
//方法
boolean flag=true;
Packet packet2;
packet2=new Packet("删除成功否", flag);
new sendMess(socket,packet2).start();
}
}catch(IOException e)
{
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class sendMess extends Thread
{
Socket socket;
Packet packet;
public sendMess(Socket socket,Packet packet)
{
this.socket=socket;
this.packet=packet;
}
public void run()
{
try {
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(packet);
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String args[])
{
ServerService serverService=new ServerService();
}
}
3.4 基本模块4:客户端商品浏览(含格式化价格)和下单界面截图,以及下单操作的处理代码(含使用客户端Socket对象与服务端Sockect对象的通信代码)、必要的方案说明。
商品浏览截图如图一,下单过程的界面截图如下图。
下单操作:我将客户端请求封装到Client类的静态方法中,发送下单请求时调用该类中的静态方法即可。对于下单操作,,根据tabel中复选框是否选中,来对要下单的数据进行判断,如果选中就将该行数据加入到订单项并存到OrderItems类型的集合中,将该行数据放到要购物车要删除的shopCar类型的集合中,利用 Orders类型的对象,存放订单。将这三部分数据存放到ArrayList的对象中,进行装箱,然后使用客户端Socket对象向服务发送请求,服务器接收到后进行拆箱,使其变回原来的数据类型,在下单的事务中传入这些参数完成下单。将下单结果返回给客户端,进行提示是否成功下单。
该部分中订单编号我是利用UUID的randomUUID()方法来获取随机订单编号,保证随机生成的订单编号尽量避免重复,对于价格和日期进行了格式化显示,下单时对于价格,因为含有“¥”符号,故利用parse()方法,使其变为原来的数字格式。
图一 商品浏览截图
图二 购物车界面截图
图三 结算界面截图
图四 下单成功界面截图
图五 下单后购物车界面截图
图六 下单后个人订单页面截图
下单操作处理代码:
客户端界面按钮事件提取数据信息
JButton button = new JButton("结算");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
ArrayList<OrderItems> orderItems=new ArrayList<OrderItems>();
ArrayList<ShopCar> shopCarList=new ArrayList<ShopCar>();
Orders orders=new Orders();
Locale cnLocale=new Locale("zh", "CN");
NumberFormat cnNumberFormat=NumberFormat.getCurrencyInstance(cnLocale);
//int selectRows = table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int rows=table.getRowCount();
double sum=0;
String orderID=UUID.randomUUID().toString();
Date orderTime=new Date();
orders.setCustomerID(Login.id);
orders.setOrderID(orderID);
orders.setOrderTime(orderTime);
orders.setOrderState("0");
int flag=0;
for(int i=0;i<rows;i++)
{
boolean select=(Boolean) tableModel.getValueAt(i,0);
if(select)
{
flag=1;
OrderItems items=new OrderItems();
ShopCar shopCar=new ShopCar();
//Date date=new Date();
//SimpleDateFormat nowdate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String type=tableModel.getValueAt(i,1).toString();
double price=0;
try {
price = Double.parseDouble(cnNumberFormat.parse(tableModel.getValueAt(i,2).toString()).toString());
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//.replace('¥',' ')
int num=Integer.parseInt(tableModel.getValueAt(i,3).toString());
double total=price*num;
sum+=total;
items.setNumber(num);
items.setOrderID(orderID);
items.setPrice(price);
items.setTotal(total);
items.setType(type);
orderItems.add(items);
shopCar.setCustomerID(Login.id);
shopCar.setType(type);
shopCarList.add(shopCar);
}
}
if(flag==1)
{
int r=JOptionPane.showConfirmDialog(table, "您的订单价格"+sum+"元"+"确定下单","确认",JOptionPane.YES_NO_OPTION);
if(r==JOptionPane.YES_OPTION)
{
orders.setTotalMoney(sum);
ArrayList<Object> a =new ArrayList<Object>();
a.add(orders);
for(int i=0;i<orderItems.size();i++)
{
a.add(orderItems.get(i));
}
Iterator iterator=shopCarList.iterator();
while(iterator.hasNext())
{
a.add(iterator.next());
}
boolean flag2=Client.placeOrder(a);//调用下单请求函数,同时返回下单
Object[] msg= { Login.id,orderTime};
Locale locale=Locale.getDefault();
String pattern="账号为{0}的用户,您好,您在{1,date,long} {1,time,hh:mm:ss}下单成功";
if(flag2)
{
JOptionPane.showMessageDialog(button.getParent(), FormatDate.msgFormat(pattern, locale, msg),"",JOptionPane.INFORMATION_MESSAGE);
new UpdateShopCar().start();
new UpdateOrders2().start();
}
else
{
JOptionPane.showMessageDialog(button.getParent(), "下单失败","",JOptionPane.ERROR_MESSAGE);
}
}
else
{
JOptionPane.showMessageDialog(button.getParent(), "取消下单成功","",JOptionPane.INFORMATION_MESSAGE);
}
}
else
{
JOptionPane.showMessageDialog(button.getParent(), "请选择商品后进行下单","",JOptionPane.ERROR_MESSAGE);
}
}
});
Cilent中
客户端发送下单请求调用的方法
public static boolean placeOrder(ArrayList<Object> a)
{
boolean reg=false;
try {
Socket socket=new Socket(Login.ip,Login.port);
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
Packet packet=new Packet("下单", a);
oos.writeObject(packet);
Packet packet2=(Packet)new ObjectInputStream(socket.getInputStream()).readObject();
reg=(boolean) packet2.getContent();
oos.close();
socket.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return reg;
}
服务器处理主要代码
if(packet.getFlag().equals("下单"))
{
ArrayList<Object> a=(ArrayList<Object>)packet.getContent();
Iterator<Object> iterator=a.iterator();
Orders orders=new Orders();
ArrayList<OrderItems> orderItems=new ArrayList<OrderItems>();
ArrayList<ShopCar> shopCars=new ArrayList<ShopCar>();
while(iterator.hasNext())
{
Object object=iterator.next();
if(object.getClass().getName().equals("water.test1.po.Orders"))
orders=(Orders)object;
if(object.getClass().getName().equals("water.test1.po.OrderItems"))
{
OrderItems orderItems2=new OrderItems();
orderItems2=(OrderItems)object;
orderItems.add(orderItems2);
}
if(object.getClass().getName().equals("water.test1.po.ShopCar"))
{
ShopCar shopCar=new ShopCar();
shopCar=(ShopCar)object;
shopCars.add(shopCar);
}
}
PlaceOrdTran p=new PlaceOrdTran();
boolean flag=p.placeOrd(orders, orderItems,shopCars);
Packet packet2;
if(flag)
packet2=new Packet("下单成功", true);
else {
packet2=new Packet("下单失败", false);
}
new sendMess(socket,packet2).start();
}
3.5 基本模块5:注册界面的正则表达式验证
对于注册验证部分,我采用类似网页注册验证的方式,逐个进行验证,只有当前验证通过才可以填写下一部分信息。该部分验证包括对姓名、电话号码、账号、密码的验证,对于姓名只可输入中文或英文,电话号码要求符合电话号码规则,账号和密码是6-10位的数字或字母的组合,验证用到的方法如下:
public static boolean verifyPhoneno(String input) {
boolean ck = false;
String regex = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
ck = true;
}
return ck;
}
public static boolean verifyID(String input) {
boolean ck = false;
String regex = "^[a-zA-Z0-9]{6,10}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
ck = true;
}
return ck;
}
public static boolean verifyName(String input) {
boolean ck = false;
String regex = "^([\\u4e00-\\u9fa5]{1,20}|[A-Za-z\\.\\s]{1,20})$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
ck = true;
}
return ck;
}
public static boolean verifyPsd(String input) {
boolean ck = false;
String regex = "^[a-zA-Z0-9]{6,10}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
ck = true;
}
return ck;
}
界面调用验证方法(对姓名验证,其余验证操作与之相似,不在罗列)
textField_tel.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent arg0) {
if (!FormatDate.verifyPhoneno(textField_tel.getText().trim())) { //调用验证方法
textField_tel.selectAll();
textField_tel.requestFocus();
lblNewLabel_5.setText("输入不合法");
}
else {
lblNewLabel_5.setText("√") }}});
还没有评论,来说两句吧...