参考的狂神的Web综合项目,新加了一个邮件验证功能,以及多次验证失败群发管理邮件报警功能,邮件创建/发送的创建工具类参数比较多,所以采用了构造模式实现,其他都与狂神的代码大同小异 (或许SQL写得不一样(滑稽))。
主要还是复习MVC的思想和JavaWeb那些内容吧。
结构:
由上图可知,总共可以分为5个模块
- Dao层负责直接与数据库进行交互
- Servlet层负责调用Dao层相应方法执行一些业务逻辑操作。
- POJO层数据库中数据对应的实体类
- Servlet层衔接视图与模型
- jsp…这个不是我写的,照搬的狂神的
代码实现就不讲,详细的去看狂神的视频,主要学习了一种思路吧(俺上面那个箭头画反了,应该从底到顶,写一个小模块测一下)。
最后讲一下构造器模式:
由于俺加那个邮件功能的工具类参数有点多,所以用的建造者设计模式。
建造者模式俺的理解就是,对一个类的构建(实例化)交给一个建造者来创建,需要设置什么参数就告诉它要做什么工作,然后完活。
《Effective Java》建议超过4参数的情况下就可以考虑使用构造者模式,主要就是类的构成复杂(简单的说参数多),或者参数的初始化的顺序影响类的功能的情况下就考虑使用它了。
public class SendEmail extends Thread {
private List<String> toEmail;
private String subject;
private String content;
private String fromEmail;
private String fromEmailPassword;
public static class Builder{
private List<String> toEmail;
private String subject;
private String content;
private String fromEmail;
private String fromEmailPassword;
public SendEmail build(){
return new SendEmail(this);
}
public Builder toEmail(List<String> list){
this.toEmail = list;
return this;
}
public Builder subject(String subject){
this.subject = subject;
return this;
}
public Builder content(String content){
this.content = content;
return this;
}
public Builder fromEmail(String fromEmail){
this.fromEmail = fromEmail;
return this;
}
public Builder fromEmailPassword(String fromEmailPassword){
this.fromEmailPassword = fromEmailPassword;
return this;
}
}
.........无关代码
//使用代码
SendEmail email = new SendEmail.Builder().
content("建造者模式的尝试").fromEmail("").
fromEmailPassword("").subject("建造者模式").
toEmail(list).build();
目前没解决的问题:
1.js乱码:
- 设置为UTF-8和js文本本身设置为UTF-8(无效)
- 将js文本设置为带dom的utf-8然后设置为GB2312(非动态传参有效)
InternetAddress[] objects = (InternetAddress[])toEmail.
stream().map(t->{
try {
return new InternetAddress(t);
} catch (AddressException e) {
e.printStackTrace();
}
return null;
}).toArray();
这段代码会报类型强转异常,提示Object和InternetAddress不在一个loder中,具体为啥不在一个加载器中就不行就不得而知了。
Exception in thread "Thread-0" java.lang.ClassCastException:
class [Ljava.lang.Object; cannot be converted to class
[Ljavax.mail.internet.InternetAddress;
([Ljava.lang.Object;
located in the loader 'bootstrap' Module of java.base;
[Ljavax.mail.internet.InternetAddress;
located in the unnamed module of the loader "app")