這段代碼本身只是利用java訪問(wèn)了一個(gè)url:(",后面帶了一堆的參數(shù):String data = "user_id=" + user_id + "password=" + password +
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、松原ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的松原網(wǎng)站制作公司
"mobile_phone=" + mobile_phone +
"msg=" + URLEncoder.encode(msg, "GBK") + "send_date=" + send_date +
"subcode=" + subcode;
,僅此而已,至于具體要怎么發(fā),那就要看這個(gè)URL提供放的后臺(tái)是如何定義參數(shù)的含義了。
方法一:
1.web.xml中配置listener
listener
listener-class
cn.com.jxlife.shs.web.action.csinquiry.surrender.MyListener
/listener-class
/listener
2.創(chuàng)建listener
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
private Timer timer = null;
@Override
public void contextInitialized(ServletContextEvent sce) {
timer = new Timer(true);
//設(shè)置任務(wù)計(jì)劃,啟動(dòng)和間隔時(shí)間
timer.schedule(new MyTask(), 0, 3*60*1000);
//3分鐘
//timer.schedule(new MyTask(), 0, 3*60*1000);
//在1秒后執(zhí)行此任務(wù),每次間隔2秒
//timer.schedule(new MyTask(), 1000, 2000);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
}
}
3.創(chuàng)建啟動(dòng)的類MyTask
import java.util.Date;
import java.util.TimerTask;
public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("call at " + (new Date()));
}
}
方法二:
spring 下實(shí)現(xiàn)定時(shí)工作的調(diào)度框架quartz
· 1。從下載quartz的開(kāi)源包
quartz-1.7.3.tar.gz
3.07M
· 2。從quartz-1.7.3.tar.gz 找到quartz-1.7.3.jar,放到項(xiàng)目的classpath下
(放到webroot/WEB-INF/lib)下
· 3。定義一個(gè)需要時(shí)間調(diào)度的程序
package com.machome.quartz;
public class CustomJob1 {
public void onTimeWork() {
System.out.println("數(shù)據(jù)備份任務(wù)啟動(dòng)");
System.out.println("...");
System.out.println("數(shù)據(jù)備份任務(wù)完成");
}
}
· 4。剩余的工作就都在spring xml文件里完成了
!-- 被調(diào)度的bean --
bean id="job1" class="com.machome.quartz.CustomJob1"/bean
!-- 定義任務(wù)對(duì)象 --
bean id="jobtask1"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
!-- 被調(diào)度的bean --
property name="targetObject"
ref bean="job1" /
/property
!-- 被調(diào)度的bean中的被調(diào)度的方法 --
property name="targetMethod"
valueonTimeWork/value
/property
/bean
!-- 定義觸發(fā)對(duì)象 --
bean id="trigger1"
class="org.springframework.scheduling.quartz.CronTriggerBean"
!-- 任務(wù)對(duì)象 --
property name="jobDetail"
ref bean="jobtask1" /
/property
!-- cron表達(dá)式 --
property name="cronExpression"
value10,15,20,25,30,35,40,45,50,55 * * * * ?/value
/property
/bean
!-- 調(diào)度對(duì)象 --
!-- 如果將lazy-init='false'那么容器啟動(dòng)就會(huì)執(zhí)行調(diào)度程序 --
bean id="scheduler" lazy-init="false"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
!-- 觸發(fā)對(duì)象 --
property name="triggers"
list
ref bean="trigger1" /
/list
/property
/bean
· 5。 將spring 項(xiàng)目部署到TOMCAT或JBOSS服務(wù)器上
deploy項(xiàng)目
重啟TOMCAT server
· 6??唇Y(jié)果:
cron表達(dá)式參考:Quartz的cron表達(dá)式
方法:
1.前提準(zhǔn)備工作:
首先,郵件的發(fā)送方要開(kāi)啟POP3 和SMTP服務(wù)--即發(fā)送qq郵件的賬號(hào)要開(kāi)啟POP3 和SMTP服務(wù)
2.開(kāi)啟方法:
登陸qq郵箱
3.點(diǎn)擊 設(shè)置
4.點(diǎn)擊—-賬戶
5.找到:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù) —點(diǎn)擊開(kāi)啟
6.送短信 —–點(diǎn)擊確定
7.稍等一會(huì),很得到一個(gè)授權(quán)碼! –注意:這個(gè)一定要記住,一會(huì)用到
8.點(diǎn)擊保存修改 —OK 完成
9.java 測(cè)試代碼:
package cn.cupcat.test;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class SendmailUtil {
public static void main(String[] args) throws AddressException, MessagingException {
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");// 連接協(xié)議
properties.put("mail.smtp.host", "smtp.qq.com");// 主機(jī)名
properties.put("mail.smtp.port", 465);// 端口號(hào)
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.ssl.enable", "true");//設(shè)置是否使用ssl安全連接 ---一般都使用
properties.put("mail.debug", "true");//設(shè)置是否顯示debug信息 true 會(huì)在控制臺(tái)顯示相關(guān)信息
//得到回話對(duì)象
Session session = Session.getInstance(properties);
// 獲取郵件對(duì)象
Message message = new MimeMessage(session);
//設(shè)置發(fā)件人郵箱地址
message.setFrom(new InternetAddress("123456789@qq.com"));
//設(shè)置收件人地址 message.setRecipients( RecipientType.TO, new InternetAddress[] { new InternetAddress("987654321@qq.com") });
//設(shè)置郵件標(biāo)題
message.setSubject("這是第一封Java郵件");
//設(shè)置郵件內(nèi)容
message.setText("內(nèi)容為: 這是第一封java發(fā)送來(lái)的郵件。");
//得到郵差對(duì)象
Transport transport = session.getTransport();
//連接自己的郵箱賬戶
transport.connect("123456789@qq.com", "vvctybgbvvophjcj");//密碼為剛才得到的授權(quán)碼
//發(fā)送郵件 transport.sendMessage(message, message.getAllRecipients());
}
}
10.運(yùn)行就會(huì)發(fā)出郵件了。。。。
下面是我收到郵件的截圖,當(dāng)然我把源碼中的郵件地址都是修改了,不是真實(shí)的,你們測(cè)試的時(shí)候,可以修改能你們自己的郵箱。最后,祝你也能成功,如果有什么問(wèn)題,可以一起討論!
注意事項(xiàng)
得到的授權(quán)碼一定要保存好,程序中要使用
發(fā)送短信的接口
根據(jù)自己的情況選擇服務(wù)商。
開(kāi)發(fā)文檔
從開(kāi)發(fā)文檔中我們可以看到. 可以直接使用http請(qǐng)求也可以使用WebService請(qǐng)求發(fā)送短信. 由于DEMO文件夾下的java和jsp文件夾中的代碼都是使用http請(qǐng)求發(fā)送短信. 所以這里就不再細(xì)說(shuō)了, 我們使用WebService的方式演示發(fā)送短信.
生成客戶端代碼
從接口文檔中我們知道它的WebService的WSDL的url為:?那么我們可以執(zhí)行下面的命令生成客戶端代碼:
wsimport -keep
其中wsimport是JDK自帶的工具, -keep url選項(xiàng)是"保留生成的文件". 該命令會(huì)在當(dāng)前目錄下生成sms.cn.ihuyi._106包, 以及眾多的類. 接下來(lái)開(kāi)始編寫我們自己的代碼.
定義接口
為了方便, 這里我們首先定義一個(gè)接口:
Sms.java
public?interface?Sms?{
/**
*?向mobile發(fā)送短信,?內(nèi)容為message
*?
*?@param?mobile?手機(jī)號(hào)
*?@param?message?短信內(nèi)容
*?@return?成功返回-1,?否則返回其他值
*/
int?sendMessage(String?mobile,?String?message);
}
這個(gè)接口很簡(jiǎn)單, 只有一個(gè)方法. 這個(gè)方法用來(lái)發(fā)送短信.
同步發(fā)送短信
接下來(lái)我們首先實(shí)現(xiàn)一個(gè)同步發(fā)送短信的類:
IhuyiSmsImpl.java
public?class?IhuyiSmsImpl?implements?Sms?{
private?String?account;
private?String?password;
public?void?setAccount(String?account)?{
this.account?=?account;
}
public?void?setPassword(String?password)?{
this.password?=?password;
}
@Override
public?int?sendMessage(String?mobile,?String?message)?{
cn.ihuyi._106.Sms?factory?=?new?cn.ihuyi._106.Sms();
SmsSoap?smsSoap?=?factory.getSmsSoap();
SubmitResult?submit?=?smsSoap.submit(account,?password,?mobile,?message);
int?code?=?submit.getCode();
if(code?==?2){
return?-1;
}
System.out.println("發(fā)送短信失敗,?code:"?+?code);
return?code;
}
}
異步發(fā)送短信
由于發(fā)送短信涉及到網(wǎng)絡(luò)通信, 因此sendMessage方法可能會(huì)有一些延遲. 為了改善用戶體驗(yàn), 我們可以使用異步發(fā)送短信的方法. 原理很簡(jiǎn)單: 如果用戶請(qǐng)求發(fā)送短信, 我們不是直接調(diào)用IhuyiSmsImpl的sendMessage方法, 而是將請(qǐng)求保存起來(lái)(生產(chǎn)者), 然后告訴用戶: 短信發(fā)送成功. 之后有若干個(gè)消費(fèi)者取出任務(wù), 調(diào)用sendMessage方法發(fā)送短信.
這里, 我使用線程池完成上面的任務(wù):
AsyncSmsImpl.java
public?class?AsyncSmsImpl?implements?Sms?{
public?Sms?sendSms;
private?ExecutorService?executorService?=?Executors.newFixedThreadPool(3);
public?void?setSendSms(Sms?sendSms)?{
this.sendSms?=?sendSms;
}
@Override
public?int?sendMessage(String?mobile,?String?message)?{
try?{
executorService.submit(()?-?sendSms.sendMessage(mobile,?message));
}
catch(Exception?e)?{
Sysemt.out.println("提交任務(wù)時(shí)發(fā)生錯(cuò)誤"?+?e);
return?0;
}
return?-1;
}
public?void?destroy(){
try{
executorService.shutdown();
}
catch(Exception?e){}
}
}
在第17行, 我們獲得遠(yuǎn)程對(duì)象的一個(gè)代理對(duì)象. 之后就可以通過(guò)這個(gè)代理對(duì)象進(jìn)行發(fā)送短信, 查詢賬戶余額等操作.
第18行, 使用該代理對(duì)象的submit方法提交了短信內(nèi)容. 該方法的參數(shù)信息及返回值含義在接口文檔中有詳細(xì)的說(shuō)明.
第19行我們獲得了結(jié)果的狀態(tài)碼. 根據(jù)文檔上的說(shuō)明, 狀態(tài)碼為2說(shuō)明提交成功. 簡(jiǎn)單起見(jiàn), 這里我們只關(guān)注提交成功的情況. 需要注意的是, 狀態(tài)碼為2只是說(shuō)明提交成功. 根據(jù)官網(wǎng)上的"3-5秒內(nèi)響應(yīng)、100%到達(dá)", 我們可以推測(cè). 如果提交成功, 那么基本上3-5秒內(nèi),短信就會(huì)發(fā)送成功, 根據(jù)用戶的網(wǎng)絡(luò)情況, 可能稍有延遲用戶就可以收到短信.
使用這段代碼發(fā)送短信也很簡(jiǎn)單, 直接new一個(gè)對(duì)象, 設(shè)置好賬號(hào)和密碼就可以發(fā)送短信了.
代碼很簡(jiǎn)單, 直接將Sms接口的sendMessage(mobile, message)方法作為一個(gè)任務(wù)加到線程池的任務(wù)隊(duì)列中. 這樣等到有空閑線程時(shí), 就會(huì)執(zhí)行sendSms.sendMessage(mobile, message)發(fā)送短信. 這里我們假設(shè)只要保存到線程池就可以成功發(fā)送短信. 因?yàn)榘l(fā)送失敗的情況實(shí)際上很罕見(jiàn).
Java實(shí)現(xiàn)短信自動(dòng)發(fā)送功能主要是用httpclient實(shí)現(xiàn)的,要有發(fā)短信的端口。
1、硬件設(shè)備是一個(gè)3G網(wǎng)卡;
2、軟件方面需要sun提過(guò)的java底層通信common包;
3、此外還需要第三方庫(kù)SMSLib,這個(gè)是開(kāi)源項(xiàng)目,主要用于實(shí)現(xiàn)java發(fā)短信的功能;
主要代碼如下:
HttpClient?client?=?new?HttpClient();
PostMethod?post?=?new?PostMethod(
"");
post.addRequestHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");//?在頭文件中設(shè)置轉(zhuǎn)碼
NameValuePair[]?data?=?{?new?NameValuePair("sname",?"*****"),
new?NameValuePair("spwd",?"*****"),
new?NameValuePair("scorpid",?"*****"),
new?NameValuePair("sprdid",?"*****"),
new?NameValuePair("sdst",?"*****"),
new?NameValuePair("smsg",?"*****")?};
post.setRequestBody(data);
client.executeMethod(post);
Header[]?headers?=?post.getResponseHeaders();
int?statusCode?=?post.getStatusCode();
System.out.println("statusCode:"?+?statusCode);
for?(Header?h?:?headers)?{
System.out.println(h.toString());
}
String?result?=?new?String(post.getResponseBodyAsString().getBytes("utf-8"));
System.out.println(result);
post.releaseConnection();
Java源程序(.java文件)——java字節(jié)碼文件(.class文件)——由解釋執(zhí)行器(java.exe)將字節(jié)碼文件加載到j(luò)ava虛擬機(jī)(jvm)——字節(jié)碼文件(.class)就會(huì)在java虛擬機(jī)中執(zhí)行。
Java是一門面向?qū)ο缶幊陶Z(yǔ)言,不僅吸收了C++語(yǔ)言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語(yǔ)言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程? ?。
Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、健壯性、安全性、平臺(tái)獨(dú)立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn)? 。Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等