10.4.4 处理用户竞价

10.4.4 处理用户竞价

当用户进行竞价时,系统不仅需要添加竞价记录,还需要向竞价用户发送通知邮件,通知该用户已经竞价成功。
下面是处理用户竞价的业务逻辑方法代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 增加新的竞价,并对竞价用户发邮件通知
* @param itemId 物品id;
* @param bid 竞价
* @param userId 竞价用户的ID
* @return 返回新增竞价记录的ID
*/
public int addBid(int itemId, Bid bid, Integer userId)
throws AuctionException
{
try
{
AuctionUser au = userDao.get(AuctionUser.class, userId);
Item item = itemDao.get(Item.class, itemId);
if (bid.getBidPrice() <= item.getMaxPrice())
{
return -1;
}
item.setMaxPrice(bid.getBidPrice());
itemDao.save(item);
// 设置Bid对象的属性
bid.setBidItem(item);
bid.setBidUser(au);
bid.setBidDate(new Date());
// 持久化Bid对象
bidDao.save(bid);
// 准备发送邮件
SimpleMailMessage msg = new SimpleMailMessage(this.message);
msg.setTo(au.getEmail());
msg.setText("Dear " + au.getUsername() + ", 谢谢你参与竞价,你的竞价的物品的是: "
+ item.getItemName());
mailSender.send(msg);
return bid.getId();
} catch (Exception ex)
{
ex.printStackTrace();
log.debug(ex.getMessage());
throw new AuctionException("处理用户竞价出现异常,请重试");
}
}

从该方法代码不难看出,方法的前半部分是添加竞价记录,并依赖于系统的DAO组件提供实现;而后半部分发送通知邮件,发送通知邮件依赖于Spring的邮件抽象层。
发送通知邮件在实际项目中是非常重要的事情,每当用户竞价成功后,系统可以发送通知邮件让用户确认,只有用户确认竞价后该竞价才会真正生效。
当使用Spring邮件抽象层时,需要使用Spring的如下两个工具类。

  • JavaMailSender:用于发送邮件。
  • SimpleMailMessage:表示邮件本身。

本系统并未发送MimeMessage信息,所以使用SimpleMailMessage已经足够。本系统把邮件的MailSenderSimleMailMessage都配置在Spring容器中,因此必须在业务逻辑组件的代码中增加这两个组件的setter 方法。下面是在业务逻辑组件中依赖注入邮件MailSenderSimleMailMessagesetter方法代码。

1
2
3
4
5
6
7
8
9
// 为业务逻辑组件注入两个邮件发送Bean的setter方法
public void setMailSender(MailSender mailSender)
{
this.mailSender = mailSender;
}
public void setMessage(SimpleMailMessage message)
{
this.message = message;
}

当然,还应该在Spring容器中配置如下两个关于邮件发送的Bean

  • mailSender:配置Spring发送邮件的MailSender Bean
  • mailMessage:配置所发送的邮件本身。

下面是配置这两个邮件发送Bean的配置片段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- 定义JavaMailSenderImpl,它用于发送邮件 指定发送邮件的SMTP服务器地址, 指定登录邮箱的用户名、密码 -->
<bean
id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:host="smtp.163.com"
p:username="spring_test"
p:password="123abc">
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
</bean>

<!-- 定义SimpleMailMessage Bean,它代表了一份邮件 指定发件人地址,指定邮件标题 -->
<bean
id="mailMessage"
class="org.springframework.mail.SimpleMailMessage"
p:from="spring_test@163.com"
p:subject="竞价通知" />

从以上代码可以看出,本系统使用163的电子邮件系统发送通知邮件,因此要求运行系统时服务器可以正常访问163的电子邮件系统,否则系统将抛出异常。当然,如果是一个企业级的应用,则应该改为使用本企业的邮件系统。
因为163的邮件系统要求先登录邮箱,然后才可发送邮件,故配置MailSender时,指定了mail.smtp.auth属性的值为true,并提供登录邮箱所必需的用户名和密码。
提示:Spring的邮件抽象层完全支持发送带附件、HTML格式的邮件,如果需要发送这种”复杂”类型的邮件,则应该使用MimeMessage信息,而不是SimpleMailMessage信息。SimpleMailMessage信息只支持普通文本内容。如果读者希望了解关于Spring邮件抽象层的更多知识,则可以参考Spring官方手册。