java 模板+参数
2017-03-30 14:31:21 qq_29689487 阅读数 11654

**发送邮件实现的代码和配置文件的加载,统一将邮件相关的配置置于配置文件中,增强工具类的适应性。
闲来无事,自己写了一个工具类,发送邮件使用自定义的模板,配置文件采用了 xml 和 properties 文件,并且采用 JSSE 的 SSL socketfactory 来取代默认的 socketfactory。**

相关 jar 包:

*①:commons-lang-2.4.jar
②:jdom.jar
③:mail.jar
*整个的参数处理,配置文件加载,详见代码即其中的注释:
邮件模板:xxx.model**

[lqs-##] [lqs-##],此为注释 --- 此为实例模板,图片 logo 替换规则 cid:logo , 正文替换格式${xxx},在调用的时候自定义替换其中的内容 2017年3月28日18:27:07
<div id="mainmail" style="margin-bottom: 12px; position: relative; z-index: 1;">
                <div class="body" id="contentDiv" style="padding: 15px 15px 10px; height: auto; line-height: 1.7; font-size: 14px; position: relative; z-index: 1; -ms-zoom: 1;">
                    <div id="qm_con_body">
                        <div class="emailbox" style="height: auto;min-height: 100px;word-wrap: break-word;font-size: 14px;font-family: "lucida Grande", Verdana, "Microsoft YaHei";" id="mailContentContainer"> <br><br>
                            <table align="center" border="0" cellspacing="0" cellpadding="0">
                                <tr>
                                    <td align="left" valign="top">
                                        <table width="500" border="0" cellspacing="0" cellpadding="0">
                                            <tr>
                                                <td align="left" valign="top"><img width="127" height="28" src="cid:taizi_logo.png" border="0"></td>
                                                <td align="right" valign="top">it52luo@163.com</td>
                                                [lqs-##]<td align="right" valign="top"><img width="328" height="44" src="cid:right_logo" border="0"></td>
                                                <td align="right" valign="top">&nbsp;</td>
                                            </tr>
                                            <tr>
                                                <td colspan="2"><img width="500" height="1" src="cid:email_line" border="0"></td>
                                            </tr>
                                            <tr height="24">
                                                <td height="24" colspan="2">
                                            </tr>
                                            <tr>
                                                <td style="color: rgb(51, 51, 51); font-family: Geneva,Verdana,Arial,Helvetica; font-size: 10px; font-weight: normal;" colspan="2">
                                                    ${content}
                                                </td>
                                            </tr>
                                            <tr height="24">
                                                <td height="24" colspan="2">
                                            </tr>
                                            <tr>
                                                <td colspan="2"><img width="500" height="1" src="cid:email_line" border="0"></td>
                                            </tr>
                                            <tr height="36">
                                                <td height="24" colspan="2">
                                            </tr>
                                            <tr>
                                                <td class="message" style="color: rgb(0, 0, 0); font-family: Geneva,Verdana,Arial,Helvetica; font-size: 9px;" colspan="2"> <b>T̶a̶i̶z̶i̶ Inc.</b><br>Organization:T̶a̶i̶z̶i̶
                                                    <a href="https://user.qzone.qq.com/1194895584" target="_blank">T̶a̶i̶z̶i̶</a><br><br> 获取常见问题的解答,请咨询T̶a̶i̶z̶i̶
                                                    <a href="https://user.qzone.qq.com/1194895584" target="_blank">https://user.qzone.qq.com/1194895584</a>
                                                </td>
                                            </tr>
                                        </table>
                                        </td>
                                </tr>
                                <tr height="75">
                                    <td height="75">
                                </tr>
                                <tr>
                                    <td>
                                        <table align="center">
                                            <tr>
                                                <td width="500" align="center" class="message" style="color: rgb(51, 51, 51); font-family: Geneva,Verdana,Arial,Helvetica; font-size: 9px;">
                                                    <a href="https://user.qzone.qq.com/1194895584" target="_blank">T̶a̶i̶z̶i̶</a> <br><br></td>
                                            </tr>
                                            <tr>
                                                <td width="500" align="center" class="message" style="color: rgb(51, 51, 51); font-family: Geneva,Verdana,Arial,Helvetica; font-size: 9px;"> T̶a̶i̶z̶i̶尊重你的隐私权。<br>与您个人信息有关的规定见
                                                    <a href="https://user.qzone.qq.com/1194895584" target="_blank">https://user.qzone.qq.com/1194895584</a> <br><br></td>
                                            </tr>
                                            <tr>
                                                <td width="500" align="center" class="disclaimer" style="color: rgb(110, 110, 110); font-family: Geneva,Verdana,Arial,Helvetica; font-size: 9px;"> Copyright©2017LUO YuCheng.
                                                    <a href="https://user.qzone.qq.com/1194895584" target="_blank">保留所有权利</a>
                                                </td>
                                            </tr>
                                        </table>
                                    </td>
                                </tr>
                            </table><br><br> <img src="cid:email_spacer"></div>
                    </div>
                </div>
            </div>

使用 email.properties 配置:

## 尝试使用AUTH命令认证用户
mail.smtp.auth=true
## 服务协议
mail.transport.protocol=smtp
## 邮件服务器
mail.smtp.host=smtp.163.com
## 使用 JSSE 的 SSL socketfactory 来取代默认的 socketfactory
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
## false:只处理 SSL 的连接,对于非 SSL 的连接不做处理. true:处理 SSL 和非 SSL 的连接
mail.smtp.socketFactory.fallback=false
## 端口号
## mail.smtp.port=25
mail.smtp.port=465
## 服务邮箱
username=xxx
## 邮箱密码
password=xxx
## 发送人名称
senderNick=T̶a̶i̶z̶i̶
## logUrl 请以逗号分隔,且除去后缀后的名称和模板中的名称一致,不一致则不会替换,
## 会出现 tcmime.9162.9263.10034.bin 此类型的附件,凡是有图片参数的,请在模板设置对应的替换字段 cid:name
logoUrl=taizi_logo.png,email_line.gif,email_spacer.gif

其中读取文件代码及加载到 JAVA MAIL 的 session 中:

public EmailUtils(){
        pro = new Properties();
        try {
            if(!fileIsTrue(filePath)){
                System.out.println("配置文件不存在");
                return;
            }
            in = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"));
            if(in == null) return;
            pro.load(in);//加载配置文件
            in.close();//关闭流
        } catch (FileNotFoundException e) {
            System.out.println("文件不存在:"+e.toString());
        } catch (IOException e) {
            System.out.println("IO 流关闭异常:"+e.toString());
        } finally {
            if(in != null){
                try {
                    in.close();//关闭流
                } catch (IOException e) {
                    System.out.println("IO 流关闭异常:"+e.toString());
                }
            }
        }
        /*MailSSLSocketFactory msf = null;//SSL 加密
        try {
            msf = new MailSSLSocketFactory();
            msf.setTrustAllHosts(true);
        } catch (GeneralSecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        pro.put("mail.smtp.ssl.socketFactory",msf);*/
        //尝试使用AUTH命令认证用户
        auth = pro.getProperty("mail.smtp.auth").toString();
        //装载服务协议、服务器
        protocol = pro.getProperty("mail.transport.protocol").toString();
        host = pro.getProperty("mail.smtp.host").toString();
        //装载发件人昵称
        senderNick = pro.getProperty("senderNick").toString();
        //装载服务邮箱和密码
        username = pro.getProperty("username").toString();
        password = pro.getProperty("password").toString();
        //装载 logo 图标路径
        logoUrl = pro.getProperty("logoUrl").toString();
        //建立会话
        session = Session.getDefaultInstance(pro);
        session.setDebug(true);
    }

使用 XML 配置:

<?xml version="1.0" encoding="UTF-8"?>
<Email>
      <!--
        ## 尝试使用AUTH命令认证用户
        mail.smtp.auth=true
        ## 服务协议
        mail.transport.protocol=smtp
        ## 邮件服务器
        mail.smtp.host=smtp.163.com
        ## 使用 JSSE 的 SSL socketfactory 来取代默认的 socketfactory
        mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
        ## false:只处理 SSL 的连接,对于非 SSL 的连接不做处理. true:处理 SSL 和非 SSL 的连接
        mail.smtp.socketFactory.fallback=true
        ## 端口号
        ## mail.smtp.port=25 非加密
        mail.smtp.port=465 加密
        ## 服务邮箱
        username=xxx
        ## 邮箱密码
        password=xxx
        ## 发送人名称
        senderNick=T̶a̶i̶z̶i̶
        ## logUrl 请以逗号分隔,且除去后缀后的名称和模板中的名称一致,不一致则不会替换,
        ## 会出现 tcmime.9162.9263.10034.bin 此类型的附件,凡是有图片参数的,请在模板设置对应的替换字段 cid:name
        logoUrl=logo_apple.png,right_logo.gif,email_line.gif,email_spacer.gif
      -->
       <package mail.smtp.auth="true" mail.transport.protocol="smtp"
     mail.smtp.host="smtp.163.com" mail.smtp.port="465" mail.smtp.socketFactory.class="javax.net.ssl.SSLSocketFactory"
     mail.smtp.socketFactory.fallback="false" username="xxx" password="xxx" senderNick="T̶a̶i̶z̶i̶"
       logoUrl="taizi_logo.png,email_line.gif,email_spacer.gif"></package>
</Email>

加载 XML 中的配置进 Session:

public EmailUtils(){
        pro = new Properties();
        SAXBuilder builder = new SAXBuilder(false);
        Document doc = new Document();//解析XML配置文件
        try {
            doc = builder.build(filePath);
            //获取根元素<package>
            root = (Element)doc.getRootElement().getChildren().get(0);
            //尝试使用AUTH命令认证用户
            auth = root.getAttributeValue("mail.smtp.auth");
            //装载服务协议、服务器
            protocol = root.getAttributeValue("mail.transport.protocol");
            host = root.getAttributeValue("mail.smtp.host");
            //装载端口
            port = root.getAttributeValue("mail.smtp.port");
            //使用 JSSE 的 SSL socketfactory 来取代默认的 socketfactory
            socketFactoryclass = root.getAttributeValue("mail.smtp.socketFactory.class");
            //false:只处理 SSL 的连接,对于非 SSL 的连接不做处理. true:处理 SSL 和非 SSL 的连接
            socketFactoryfallback = root.getAttributeValue("mail.smtp.socketFactory.fallback");
            //装载服务邮箱和密码
            username = root.getAttributeValue("username");
            password = root.getAttributeValue("password");
            //装载发件人昵称
            senderNick = root.getAttributeValue("senderNick");
            //装载 logo 图标
            logoUrl = root.getAttributeValue("logoUrl");
        } catch (JDOMException e) {
            System.out.println("JDOMException 异常:"+e.toString());
        } catch (IOException e) {
            System.out.println("IO 异常:"+e.toString());
        }
        /*~采用JSSE SSL 加密代替 SSL 加密~*/
        /*MailSSLSocketFactory msf = null;//SSL 加密
        try {
            msf = new MailSSLSocketFactory();
            msf.setTrustAllHosts(true);
        } catch (GeneralSecurityException e) {
            System.out.println("GeneralSecurityException 异常:"+e.toString());
        }
        pro.put("mail.smtp.ssl.socketFactory",msf);*/
        pro.put("mail.smtp.auth", auth);//auth 认证
        pro.put("mail.transport.protocol", protocol);//协议
        pro.put("mail.smtp.host", host);//服务器
        pro.put("mail.smtp.port", port);//端口
        pro.put("mail.smtp.socketFactory.class", socketFactoryclass);//加密方式 JSSE SSL
        pro.put("mail.smtp.socketFactory.fallback", socketFactoryfallback);//是否同时处理非加密连接
        pro.put("username", username);//发送邮箱
        pro.put("password", password);//密码
        //建立会话
        session = Session.getDefaultInstance(pro);
        session.setDebug(false);
    }

配置文件加载进 Session 中之后,就可以开始发送邮件了,可以直接在main 方法中测试,前提是先配置好邮箱服务器,配制方法详见百度,x相关的变量,请自行增加或者下载附件

详见代码:

static{
        rpath = getRealPath();//src 目录
        filePath = rpath+PROPERTIESNAME;//配置文件路径
    }
/**
     * 
     * @Title: getInstance
     * @Description: TODO 单列
     * @return
     * @return: EmailUtils
     */
    public static EmailUtils getInstance() {
        if (instance == null) {
            instance = new EmailUtils();
        }
        return instance; 
    }

    /**
     * 
     * @Title: sendMail
     * @Description: TODO 邮件发送
     * @param to 收件人
     * @param copyto 抄送人[可为空数组或者null]
     * @param subject 主题
     * @param content 正文
     * @param logoarr html 邮件中的图片,名称需要和模板中的名称相同,
     *          如模板中为 cid:top_logo,那么图片名称就应该是 top_logo.xxx
     * @param fileList 附件列表
     * @return
     * @return: boolean
     */
    private boolean sendMail(String[] to, String[] copyto, String subject, String content, String[] logoarr, String[] fileList) {
        boolean success = true;
        try {
            mimeMsg = new MimeMessage(session);
            mp = new MimeMultipart();
            String nick = "";//自定义发件人昵称
            try {
                nick = MimeUtility.encodeText(senderNick);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            mimeMsg.setFrom(new InternetAddress(username, nick));//设置发件人
            //设置收件人
            if (to != null && to.length > 0) {
                String toListStr = getMailList(to);
                System.out.println("收件人:"+toListStr);
                mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toListStr));
            }
            //设置抄送人
            if (copyto != null && copyto.length > 0) {
                String ccListStr = getMailList(copyto);
                System.out.println("抄送人:"+ccListStr);
                mimeMsg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccListStr)); 
            }
            mimeMsg.setSubject(subject);//设置主题
            MimeBodyPart bp = new MimeBodyPart();//设置正文
            String body = content;
            bp.setContent(body, "text/html;charset=utf-8");
            mp.addBodyPart(bp);

            for (int i = 0; i < logoarr.length; i++) {
                String sUrl = rpath+File.separator+logoarr[i];
                String str = logoarr[i].substring(0, logoarr[i].lastIndexOf("."));
                boolean flag = fileIsTrue(sUrl);
                if(flag){
                    //正文的图片部分
                    MimeBodyPart jpgBody = new MimeBodyPart();
                    FileDataSource fds = new FileDataSource(sUrl);
                    jpgBody.setDataHandler(new DataHandler(fds));
                    jpgBody.setContentID(str);
                    mp.addBodyPart(jpgBody);
                }else{
                    System.out.println("logo 不存在:"+logoarr[i]);
                }
            }

            //设置附件
            if (fileList != null && fileList.length > 0) {
                for (int i = 0; i < fileList.length; i++) {
                    boolean flag = fileIsTrue(fileList[i]);
                    if(!flag){
                        System.out.println("此附件不存在:"+fileList[i]);
                        continue;
                    }
                    bp = new MimeBodyPart();
                    FileDataSource fds_file = new FileDataSource(fileList[i]);
                    bp.setDataHandler(new DataHandler(fds_file));
                    String filename = MimeUtility.encodeText(fds_file.getName(), "UTF-8", "B");
                    filename = filename.replaceAll("\r","").replaceAll("\n","");
                    bp.setFileName(filename);
                    mp.addBodyPart(bp);
                }
            }
            mimeMsg.setContent(mp);
            mimeMsg.saveChanges();
            //发送邮件
            if (auth.equals("true")) {
                Transport transport = session.getTransport(protocol);
                transport.connect(host, username, password);
                transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
                transport.close();
            } else {
                Transport.send(mimeMsg);
            }
            System.out.println("邮件发送成功");
        } catch (MessagingException e) {
            System.out.println("邮件发送异常:"+e.toString());
            success = false;
        } catch (UnsupportedEncodingException e) {
            System.out.println("编码异常:"+e.toString());
            success = false;
        }
        return success;
    }

    /**
     * 
     * @Title: readEamilModel
     * @Description: TODO 读取模板,路径存在返回,不存在返回 null
     * @param modelPath 模板路径
     * @return
     * @return: String
     */
    private static String readEamilModel(String modelPath){
        sbf = new StringBuffer();
        String modelFilePath = rpath+modelPath;
        boolean flag = fileIsTrue(modelFilePath);
        if(!flag){
            System.out.println("路径不正确:"+rpath+",或模板不存在:"+modelPath);
            return null;
        }
        InputStreamReader in = null;
        BufferedReader br = null;
        try {
            in = new InputStreamReader(new FileInputStream(modelFilePath));
            br = new BufferedReader(in);
            String line=null;
            while((line=br.readLine()) != null){
                int index = line.indexOf("[lqs-##]");
                if(index != -1){
                    System.out.println("过滤注释行:"+line);
                    line = line.substring(0, index);
                    if("".equals(line))continue;
                }
                sbf.append(line).append("\n");
            }
        } catch (FileNotFoundException e) {
            System.out.println("IO 异常:模板不存在!"+e.toString());
        } catch (IOException e) {
            System.out.println("IO 异常:获取模板流出现异常!"+e.toString());
        } finally {
            try {
                if(br != null){
                    br.close();
                }
                if(in != null){
                    in.close();
                }
            } catch (IOException e) {
                System.out.println("IO 异常:关闭流出现异常!"+e.toString());
            }
        }
        return sbf.toString();
    }

    /**
     * 
     * @Title: getMailList
     * @Description: TODO 收件人地址处理
     * @param mailArray
     * @return
     * @return: String
     */
    private String getMailList(String[] mailArray){
        sbf = new StringBuffer();
        int length = mailArray.length;
        if(mailArray != null && length < 2){
            sbf.append(mailArray[0]);
        }else{
            for(int i = 0; i < length; i++){
                sbf.append(mailArray[i]);
                if(i != (length - 1)){
                    sbf.append(",");
                }
            }
        }
        return sbf.toString();
    }

    /**
     * 
     * @Title: fileIsTrue
     * @Description: TODO 判断文件路径是否存在
     * @param filePath 文件路径
     * @return
     * @return: boolean
     */
    public static boolean fileIsTrue(String filePath){
        File file = new File(filePath);
        if(file.exists())return true;
        return false;
    }

    /**
     * 
     * @Title: sendEmailCase
     * @Description: TODO 邮件参数处理
     * @param emailmodel 模板全名+后缀
     * @param copyto 抄送人
     * @param subject 主题
     * @param content 正文
     * @param fileList 附件列表
     * @param to 收件人
     * @return
     * @return: boolean
     */
    public boolean sendEmailCase(String emailmodel, String[] copyto, String subject, String content, String[] fileList, String... to){
        /*******************************模板处理*******************************/
        if(emailmodel != null){//测试模板是否存在,不存在的话直接使用正文作为邮件发送内容
            int indexof = emailmodel.lastIndexOf(".");
            if(indexof == -1){
                System.out.println("邮件模板异常:["+emailmodel+"],将不使用模板!");
            }else{
                if(!"model".equals(emailmodel.substring(indexof+1, emailmodel.length()))){//拿到模板后缀
                    System.out.println("邮件模板后缀异常:["+emailmodel+"],将不使用模板!");
                }else{
                    emailmodel = readEamilModel(emailmodel);//获取模板
                    if(emailmodel == null){
                        System.out.println("邮件模板为空,将不使用模板!");
                    }else{
                        content = StringUtils.replace(emailmodel, "${content}", content);//替换模板中的正文
                    }
                }
            }
        }else{
            System.out.println("邮件模板异常:[NULL],将不使用模板!");
        }
        /*******************************收件人处理*******************************/
        List<String> toFrom = null;//用于接收处理过的收件人
        int k=0;
        do{//k==1 处理收件人,k>1 处理转送人
            k++;
            String[] stri;
            toFrom = new ArrayList<String>();
            if(k==1){
                stri = to;
            }else{
                stri = copyto;
            }
            for (int i = 0; i < stri.length; i++) {
                String str = stri[i];
                str = str.replaceAll(REGEX, "");//去除空格
                Pattern r = Pattern.compile(PATTERN);//匹配邮箱
                Matcher m = r.matcher(str);
                if(m.matches()){
                    toFrom.add(str);
                }
            }
            int size = toFrom.size();
            if(size<1 && k==1){
                System.out.println("无收件人,邮件发送失败");
                return false;
            }else if(size<1 && k>1){
                System.out.println("此邮件无需转送他人");
                copyto = null;
            }else{
                if(k==1){
                    to = (String[])toFrom.toArray(new String[size]);
                }else if(k>1){
                    copyto = (String[])toFrom.toArray(new String[size]);
                }
            }
        }while(k<2);
        /*******************************正文图片处理*******************************/
        String[] logoarr = logoUrl.split(",");//配置文件的图片路径
        if(logoarr.length > 0){
            List<String> logolist = new ArrayList<String>(Arrays.asList(logoarr));
            Iterator<String> it = logolist.iterator();
            while(it.hasNext()){
                String str = it.next();
                int num = str.indexOf(".");//判断文件是否有 . 存在
                if(num == -1){
                    it.remove();
                }
            }
            logoarr = logolist.toArray(new String[logolist.size()]);
        }
        return sendMail(to, copyto, subject, content, logoarr, fileList);
    }


    /**
     * 
     * @Title: getRealPath
     * @Description: TODO 获取项目 src 路径
     * @return
     * @return: String
     */
    private static String getRealPath(){
        rpath = EmailUtils.class.getResource("/").getPath().toString();
        rpath = rpath.substring(1, rpath.length());
        rpath = rpath.replace("\\","");
        rpath = rpath.replace("/","\\");
        /*realPath = realPath.replace("file:","");
        realPath = realPath.replace("classes\\","");
        String path = Thread.currentThread().getContextClassLoader().getResource("").toString();
        path = path.replace("/","\\");
        path = path.replace("file:","");
        path = path.replace("classes\\","");
        path = path.substring(1);
        */
        return rpath;
    }

    /**
     * @Title: getRealPath
     * @Description: TODO 获取项目真实路径+后缀
     * @param fileName
     * @return
     * @return: String
     */
    public static String getRealPath(String fileName){
        return getRealPath()+fileName;
    }

    /**
     * 
     * @Title: main
     * @Description: TODO 测试
     * @param args
     * @return: void
     */
    public static void main(String[] args) {
        EmailUtils eu = EmailUtils.getInstance();
        eu.configurationFile();//测试配置文件
        String[] to = {"xxx@qq.com","xxx@163.com","xxx@xxx.com"};//收件人
        String[] copyto = {"xxx@qq.com"};//转送人
        String subject = "T̶a̶i̶z̶i̶";//主题
        sbf = new StringBuffer();
        sbf.append("您好:<p class=\"body\" style=\"margin: 1em 0px; color: rgb(51, 51, 51); font-size: 10px;\">如果有一天:<br><br><br>你不再寻找爱情,只是去爱;<br><br><br>你不再渴望成功,只是去做;<br><br><br>你不再追求空泛的成长,只是开始修养自己的性情;<br><br><br>你人生的一切,才真正开始。");
        sbf.append("<a href=\"mailto:it52luo@163.com\" target=\"_blank\">Tai<wbr>zi</a> 长情。</p>");
        sbf.append("<p class=\"body\" style=\"margin: 1em 0px; color: rgb(51, 51, 51); font-size: 10px;\">Luoyc</p>");
        sbf.append("<p class=\"body salutation\" style=\"margin: 1em 0px; color: rgb(51, 51, 51); font-size: 10px;\">此致<br>Luoyc</p>");
        String content = sbf.toString();//正文
        String emailmodel = "email.model";//模板名称.后缀
        List<String> list = new ArrayList<String>();//附件地址
        list.add(getRealPath()+"TaiziLuoyc.gif");
        int size = list.size();
        String[] fileList = (String[])list.toArray(new String[size]);
        eu.sendEmailCase(emailmodel, copyto, subject, content, fileList, to);
    }

    /**
     * 
     * @Title: configurationFile
     * @Description: TODO 测试配置文件
     * @return: void
     */
    private void configurationFile(){
        System.out.println("当前路径:"+rpath);
        System.out.println("配置文件路径:"+filePath);
        Set<String> spn = pro.stringPropertyNames();
        if(spn.size() == 0){
            System.out.println("无数据");
            return;
        }
        Iterator<String> it = spn.iterator();
        System.out.println("打印配置文件参数:");
        while(it.hasNext()){
            String key = it.next();
            System.out.println(key+":"+pro.getProperty(key));
        }
    }

至此,邮件发送结束,代码块的逻辑很简单,就不赘述了。

资源地址:http://download.csdn.net/detail/qq_29689487/9798886

2018-11-06 11:41:27 wochunyang 阅读数 247
Java web 返回参数模板 Response
public class Response<T> {
    private int version = 0;
    private int status = 0;
    private String errMsg = "";
    /** @deprecated */
    @Deprecated
    private String errorMsg = "";
    private long ts = System.currentTimeMillis();
    private T data;

    public Response() {
    }

    public static <T> ResponseBuilder<T> builder() {
        return new ResponseBuilder();
    }

    public static <T> Response<T> ok() {
        return ok((Object)null);
    }

    public static <T> Response<T> ok(T data) {
        return ok(0, data);
    }

    public static <T> Response<T> ok(int version, T data) {
        return ok(version, System.currentTimeMillis(), data);
    }

    public static <T> Response<T> ok(int version, long ts, T data) {
        return of(ErrorCode.OK, version, ts, "ok", data);
    }

    public void setErrorCode(ErrorCode code) {
        this.setErrorCode(code, code.getMsg());
    }

    public void setErrorCode(ErrorCode code, String msg) {
        if (null != code) {
            this.status = code.getCode();
            this.errMsg = msg;
            this.errorMsg = msg;
        }

    }

    public static <T> Response<T> error(ErrorCode code) {
        return of(code, code.getMsg());
    }

    public static <T> Response<T> error(ErrorCode code, T data) {
        return of(code, (String)null, data);
    }

    public static Response<String> error(String data, ErrorCode code) {
        return of(code, (String)null, data);
    }

    public static <T> Response<T> error(ErrorCode code, String msg) {
        return of(code, msg, (Object)null);
    }

    public static <T> Response<T> error(ErrorCode code, String msg, T data) {
        return of(code, 0, msg, data);
    }

    public static <T> Response<T> error(ErrorCode code, int version, String msg, T data) {
        return of(code, version, System.currentTimeMillis(), msg, data);
    }

    public static <T> Response<T> error(ErrorCode code, int version, long ts, String msg, T data) {
        return of(code, version, ts, msg, data);
    }

    public static <T> Response<T> of(ErrorCode code) {
        return of(code, code.getMsg());
    }

    public static <T> Response<T> of(ErrorCode code, T data) {
        return of(code, (String)null, data);
    }

    public static Response<String> of(String data, ErrorCode code) {
        return of(code, (String)null, data);
    }

    public static <T> Response<T> of(ErrorCode code, String msg) {
        return of(code, msg, (Object)null);
    }

    public static <T> Response<T> of(ErrorCode code, String msg, T data) {
        return of(code, 0, msg, data);
    }

    public static <T> Response<T> of(ErrorCode code, int version, String msg, T data) {
        return of(code, version, System.currentTimeMillis(), msg, data);
    }

    public static <T> Response<T> of(ErrorCode code, int version, long ts, String msg, T data) {
        Response<T> resp = new Response();
        resp.setErrorCode(code);
        resp.setData(data);
        if (null != msg) {
            resp.setErrMsg(msg);
        }

        resp.setVersion(version);
        resp.setTs(ts);
        return resp;
    }

    public int getStatus() {
        return this.status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getErrMsg() {
        return this.errMsg;
    }

    public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
        this.errorMsg = errMsg;
    }

    public T getData() {
        return this.data;
    }

    public void setData(T data) {
        this.data = data;
    }

    /** @deprecated */
    @Deprecated
    public String getErrorMsg() {
        return this.errorMsg;
    }

    /** @deprecated */
    @Deprecated
    public void setErrorMsg(String errorMsg) {
        this.errMsg = errorMsg;
        this.errorMsg = errorMsg;
    }

    public int getVersion() {
        return this.version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    public long getTs() {
        return this.ts;
    }

    public void setTs(long ts) {
        this.ts = ts;
    }

    public String toString() {
        return "Response{version=" + this.version + ", status=" + this.status + ", errMsg='" + this.errMsg + '\'' + ", errorMsg='" + this.errorMsg + '\'' + ", ts=" + this.ts + ", data=" + this.data + '}';
    }
}
 @POST
    @Path("/test")
    public Response<Void> confirm(@Valid Param param) throws Exception {

         try {
          
            return Response.ok();

        } catch (ServiceException ex) {

            log.error(ex.getMessage(), ex);

            return Response.error(ex.getErrorCode());
        }

    }

 

2016-08-16 22:20:22 killuzitoto1 阅读数 357

java中有32个模板,是前人总结实践和沉淀下来的解决某种问题的优良解法。

单例模板是指一个类只能创建一个对象。

如何进行单例模板的书写呢?其利用的是private、static等修饰符的使用。

首先就先说一说static的用法,它修饰的是类的成员,除了构造器,其余属性,方法,代码块均可被修饰。

※static修饰的成员属于类,不属于对象※;与类同生共死,※static修饰的属性只有一份※

以建立一个China类为例:

public class China {
	private static China china=null;
	private China(){}//构造函数私有化,为了不能在类外创建对象。
	public static China getInstance(){
		if(china==null){
			china=new China();
		}
		return china;
	}
}
或者是:

public class China {
	private static China china=new China();
	private China(){}//构造函数私有化,为了不能在类外创建对象。
	public static China getInstance(){
		return china;
	}
}
因为构造器(构造方法)是作用就是规范对象的创建,将其私有化后在其他类中就无法创建类的对象了,但是我们还是需要得到一个对象的,所以我们可以在本类中定义一个类的对象作为属性,然后用一个public方法得到就行了。但是这个属性我们就要使用static来修饰确保他只有一个。


2011-09-08 10:06:58 bingdongguke 阅读数 453

新建java类模板,留着用


${filecomment}
${package_declaration}
/************************* 版权声明 *********************************
 *
 * 版权所有:zcw
 *
 ************************* 变更记录 *********************************
 *
 * 创建者:zcw   创建日期: ${date}
 * 创建记录:创建类结构。
 *
 * 修改者:       修改日期:
 * 修改记录:
 *
 * 修改者:       修改日期:
 * 修改记录:
 * ……
 ************************* To  Do *********************************
 *
 * 1、实现所有未实现的方法(抛出UnsupportedOperationException的方法)。
 *
 ************************* 随   笔 *********************************
 *
 * 这里可以写写感想,感慨,疑问什么的。
 *
 ******************************************************************
 */
${typecomment}
${type_declaration}


2011-09-08 10:06:00 bingdongguke1 阅读数 15

新建java类模板,留着用


${filecomment}
${package_declaration}
/************************* 版权声明 *********************************
*
* 版权所有:zcw
*
************************* 变更记录 *********************************
*
* 创建者:zcw 创建日期: ${date}
* 创建记录:创建类结构。
*
* 修改者: 修改日期:
* 修改记录:
*
* 修改者: 修改日期:
* 修改记录:
* ……
************************* To Do *********************************
*
* 1、实现所有未实现的方法(抛出UnsupportedOperationException的方法)。
*
************************* 随 笔 *********************************
*
* 这里可以写写感想,感慨,疑问什么的。
*
******************************************************************
*/
${typecomment}
${type_declaration}


java参数

阅读数 479

setJAVA_OPTS=%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize=256m Xms最小使用堆大小(程序刚开始运行,申请使用的内在大小)Xmx最大使用堆大小(程序最大使用内存大小)Xms与Xmx两个值通常设置一样.并且等于80%物理内存而Xms通常为1/4Xmx-Xms:初始值 -Xmx:最大值 -X

博文 来自: jimenghu

java参数--> ...

阅读数 24

今天见了参数后加"省略号"的,以前没见过,先记下,以免忘记 publicclassTest{ /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List&lt;String&gt;list=new...

博文 来自: zhanghaodengsheng

java参数

阅读数 496

实参:调用方法中实际传递的参数。形参:声明方法是的参数。实参有确定的值,形参没有。

博文 来自: u011414958

java ...参数

阅读数 98

如果是是形参里面出现,表示的是可变参数比如://表示的传入的参数可以随意,你传多少个参数都被放到一个数组里面。publicstaticvoiddealArray(int...intArray){for(inti:intArray){System.out.print(i+"");}System.out.println();}

博文 来自: qq_15037231

java 替换字符串模板(模板渲染)

阅读数 48

java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串。下面介绍4种替换模板方式:  1、使用内置String.format123String message = String.format("您好%s,晚上好!您目前余额:%.2f元,积分:%d", "张三", 10.155, 10)...

博文 来自: weixin_33811961
没有更多推荐了,返回首页