通过按行读取文件中的内容模拟Web应用各客户端发来的数据,然后将它们存储到MongoDB中;输出部分将实现一个按条件查询,从MongoDB中得到的查询结果将通过控制台输出。这样就能模拟Web应用服务端响应请求,将数据推送到客户端页面的场景了。(特别注意:本文中设计到的所有源代码都是UTF-8格式编码的)先实现一个连接属性的配置MongoDBConnConfig.javapackage net.csdn.blog.chaijunkun;public class MongoDBConnConfig { //MongoDB主机名称或IP public static final String SERVER= "localhost"; //MongoDB端口 public static final int PORT= 27017; //使用的数据库名称 public static final String ORDERS_DATABASE= "orders";}再实现一个Morphia框架与MongoDB的集成方法MongoDBDataStore.javapackage net.csdn.blog.chaijunkun;import java.net.UnknownHostException;import com.google.code.morphia.Datastore;import com.google.code.morphia.Morphia;import com.mongodb.Mongo;import com.mongodb.MongoException;/** * MongoDB联合Morphia框架生成DataStore的类 * @author chaijunkun * */public class MongoDBDataStore { /** * 生成Orders数据库Datastore对象 * @return 返回Datastore对象 发生异常返回为null */ public static Datastore getOrdersInstance(){ Mongo connection = null; try { connection = new Mongo(MongoDBConnConfig.SERVER, MongoDBConnConfig.PORT); } catch (UnknownHostException e) { return null; } catch (MongoException e) { return null; } Morphia morphia= new Morphia(); return morphia.createDatastore(connection, MongoDBConnConfig.ORDERS_DATABASE); }}我们还需要一个Java对象到MongoDB文档和Java对象到输出JSON对象的POJO实体:OrderInfo.javapackage net.csdn.blog.chaijunkun.entities;import java.util.Date;import org.bson.types.ObjectId;import org.codehaus.jackson.annotate.JsonIgnore;import org.codehaus.jackson.map.annotate.JsonDeserialize;import org.codehaus.jackson.map.annotate.JsonSerialize;import com.google.code.morphia.annotations.Entity;import com.google.code.morphia.annotations.Id;import com.google.code.morphia.annotations.PostPersist;import com.google.code.morphia.annotations.PrePersist;//morphia中的注解 标明该对象存入orderInfo集合中 并且不存储类名@Entity(value="orderInfo", noClassnameStored= true)public class OrderInfo { //morphia中的注解 标明该key为标识字段(MongoDB中特殊的ObjectId字段) @Id //Jackson中的注解 标明在序列化与反序列化过程中不使用该key @JsonIgnore(value= true) private ObjectId id; private Long orderId; private String productName; private Integer quantity; private Float unitPrice; //Jackson中的注解 标明该字段使用自定义的DateSerializer类实现序列化 @JsonSerialize(using= DateSerializer.class) //Jackson中的注解 标明该字段使用自定义的DateDeserializer类实现反序列化 @JsonDeserialize(using= DateDeserializer.class) private Date orderDate; private String contactName; private String address; private String phone; @SuppressWarnings("unused") //morphia中的注解 指示在存入MongoDB之前的操作 @PrePersist private void beforeSaving(){ System.out.println("即将保存对象:"+ this.toString()); } @SuppressWarnings("unused") //morphia中的注解 指示在存入MongoDB之后的操作 @PostPersist private void afterSaving(){ System.out.println("对象保存完毕:"+ this.toString()); } //以下就是Getters和Setters了 public ObjectId getId() { return id; } public void setId(ObjectId id) { this.id = id; } public Long getOrderId() { return orderId; } public void setOrderId(Long orderId) { this.orderId = orderId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public Float getUnitPrice() { return unitPrice; } public void setUnitPrice(Float unitPrice) { this.unitPrice = unitPrice; } public Date getOrderDate() { return orderDate; } public void setOrderDate(Date orderDate) { this.orderDate = orderDate; } public String getContactName() { return contactName; } public void setContactName(String contactName) { this.contactName = contactName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }我们注意到上面的POJO实体中包含Date(日期)类型的数据。这类数据特别指定了它的序列化与反序列化方法,下面我们来具体看一下:序列化方法:DateSerializer.javapackage net.csdn.blog.chaijunkun.entities;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import org.codehaus.jackson.JsonGenerator;import org.codehaus.jackson.JsonProcessingException;import org.codehaus.jackson.map.JsonSerializer;import org.codehaus.jackson.map.SerializerProvider;public class DateSerializer extends JsonSerializer<Date>{ @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String formatedDate= sdf.format(date); jsonGenerator.writeString(formatedDate); }}这其实是Jackson中的一个很实用的功能,通过自定义序列化器,可以实现Java对象到JSON的数据格式自定义。例如Date的格式我们可以任意改写。上面的泛型类被具象为Date类型。重写了serialize方法。输入的date参数就是将要被序列化的数据,jsonGenerator就是序列化的上下文。当数据内容被整理好后将内容写入序列化的上下文中就完成了自定义过程。类似地,我们来看一下反序列化方法DateDeserializer.javapackage net.csdn.blog.chaijunkun.entities;import java.io.IOException;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import org.codehaus.jackson.JsonParser;import org.codehaus.jackson.JsonProcessingException;import org.codehaus.jackson.map.DeserializationContext;import org.codehaus.jackson.map.JsonDeserializer;public class DateDeserializer extends JsonDeserializer<Date>{ @Override public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { String unformatedDate= jsonParser.getText(); SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date retVal; try { retVal = sdf.parse(unformatedDate); } catch (ParseException e) { return null; } return retVal; }}泛型的JSON反序列化类被我们具象成了Date类型的,并且重写了deserialize方法。传入的jsonParser是反序列化过程中的上下文,通过它我们可以找到当前处理的JSON字段内容。然后将内容按照特定的要求来生成对应的数据类型(Date),然后作为返回值将其返回。此时POJO中相应的字段就顺利完成了反序列化。另外这样做还能保证类型安全。