具體關於SOAP和RESTful類型的服務的區別,可自行百度。 java
建立web工程,個人工程名是:RESTStyleMailServer web
工程結構 spring
1. JavaBean的編寫。 apache
package edu.ncut.mail; import java.io.Serializable; import java.util.Observable; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="Mail") public class Mail extends Observable implements Serializable{ /** 設置SMTP端口號 */ private static final String MAIL_PORT = "25"; /** 郵件發送服務器地址 */ private static final String MAIL_SERVAL_HOST = "smtp.126.com"; /** 郵件發送服務器是否須要驗證,默認爲TRUE */ private boolean validate ; /** 郵件主題 */ private String subject; /** 郵件內容 */ private String content; private String fromAddress; private String toAddress; /** 驗證時的用戶名和密碼 */ private String username = null; private String password = null; private transient Authenticator authenticator = null; //驗證 public String sendMail(){ if(isValidate()){ authenticator = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // TODO Auto-generated method stub return new PasswordAuthentication(getUsername(), getPassword()); } }; } if(isValidate() && authenticator == null){ return "failure"; } this.setChanged(); this.notifyObservers(this); return "success"; } public Mail(){ validate = true; } public Mail(String from, String to, String subject, String content, String password) { this.fromAddress = from; this.toAddress = to; this.subject = subject; this.content = content; this.password = password; this.username = from; validate = true; } /** * 方法名稱:getProp() * 方法描述:驗證時所須要的額屬性 * @param * @return String * @Exception */ public Properties getProp() { Properties p = new Properties(); p.put("mail.smtp.host", MAIL_SERVAL_HOST); p.put("mail.smtp.port", MAIL_PORT); p.put("mail.smtp.auth", validate ? "true" : "false"); return p; } public String getSubject() { return subject; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public boolean isValidate() { return validate; } public void setValidate(boolean validate) { this.validate = validate; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public void setSubject(String subject) { this.subject = subject; } public String getFromAddress() { return fromAddress; } public void setFromAddress(String fromAddress) { this.fromAddress = fromAddress; setUsername(fromAddress); } public String getToAddress() { return toAddress; } public void setToAddress(String toAddress) { this.toAddress = toAddress; } public Authenticator getAuthenticator() { return authenticator; } public void setAuthenticator(Authenticator authenticator) { this.authenticator = authenticator; } @Override public String toString() { return "Mail [validate=" + validate + ", subject=" + subject + ", content=" + content + ", fromAddress=" + fromAddress + ", toAddress=" + toAddress + ", username=" + username + ", password=" + password + "]"; } }
import java.io.Serializable; import java.util.Observable; import java.util.Observer; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="Sender") public class Sender implements Observer,Serializable { /** * @param o * @param obj * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ @Override public void update(Observable o, Object obj) { // TODO Auto-generated method stub System.out.println("execute"); final Mail mail = (Mail)obj; System.out.println(mail); //建立session try { Session session = Session.getInstance(mail.getProp(), mail.getAuthenticator()); Message message = new MimeMessage(session); message.setSubject(mail.getSubject()); message.setFrom(new InternetAddress(mail.getFromAddress())); message.setRecipient(Message.RecipientType.TO, new InternetAddress(mail.getToAddress())); message.setText(mail.getContent()); //發送 Transport.send(message); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }2. 對外服務接口的編寫。
import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import edu.ncut.mail.Mail; import edu.ncut.mail.Sender; @Produces({MediaType.TEXT_XML}) @Path("/impl") public class MailServiceImpl { /* 註釋(Annotation):在 javax.ws.rs.* 中定義,是 JAX-RS (JSR 311) 規範的一部分。 @Path:定義資源基 URI。由上下文根和主機名組成,資源標識符相似於 http://localhost:8080/RESTful/rest/hello。 @GET:這意味着如下方法能夠響應 HTTP GET 方法。 @Produces:以純文本方式定義響應內容 MIME 類型。 @Context: 使用該註釋注入上下文對象,好比 Request、Response、UriInfo、ServletContext 等。 @Path("{contact}"):這是 @Path 註釋,與根路徑 「/contacts」 結合造成子資源的 URI。 @PathParam("contact"):該註釋將參數注入方法參數的路徑,在本例中就是聯繫人 id。其餘可用的註釋有 @FormParam、@QueryParam 等。 @Produces:響應支持多個 MIME 類型。在本例和上一個示例中,APPLICATION/XML 將是默認的 MIME 類型。 */ @GET @Path("/send/{from}/{to}/{subject}/{content}/{password}") @Produces({MediaType.TEXT_XML}) public void sendMail(@PathParam("from")String from,@PathParam("to")String to, @PathParam("subject")String subject, @PathParam("content")String content, @PathParam("password")String password ) { // TODO Auto-generated method stub System.out.println("execute"); Mail mail = new Mail(from, to, subject, content, password); Sender sender = new Sender(); mail.addObserver(sender); mail.sendMail(); } @GET @Path("/test{id}") @Produces({MediaType.TEXT_XML}) public void test(@PathParam("id")int id){ System.out.println("test****" + id); } @POST @Path("/sendByPost") @Produces({MediaType.TEXT_XML}) public String sendMailByPost(@QueryParam("from")String from,@QueryParam("to")String to, @QueryParam("subject")String subject, @QueryParam("content")String content ) { // TODO Auto-generated method stub System.out.println("execute"); Mail mail = new Mail(to, subject, content); Sender sender = new Sender(); mail.setSender(sender); return mail.sendMail(); } }3. spring配置文件:beans.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <!-- 此處爲對外發布的服務的類--> <bean id="mail" class="edu.ncut.view.impl.MailServiceImpl"/> <!--address 爲服務的地址--> <jaxrs:server id="restServiceContainer" address="/mailService"> <jaxrs:serviceBeans> <ref bean="mail" /> </jaxrs:serviceBeans> <jaxrs:extensionMappings> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </jaxrs:extensionMappings> <jaxrs:languageMappings> <entry key="en" value="en-gb" /> </jaxrs:languageMappings> </jaxrs:server> </beans>注意:可能有的文章說明在beans.xml中加了這些內容:
<import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-http.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
4. 配置web.xml json
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>RestStyleMailServer</display-name> <!-- Spring 配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- cxf配置 --> <servlet> <servlet-name>restStyleMailServer</servlet-name> <!-- <servlet-class>edu.ncut.listener.NonSpringServlet</servlet-class> --> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>restStyleMailServer</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <!-- <session-config> <session-timeout>60</session-timeout> </session-config> --> </web-app>配置完成後啓動tomcat發佈。
http://localhost:8080/RESTStyleMailServer/這樣可查看是否成功 tomcat
若是出現上圖的內容,表示成功。 服務器
測試test方法,http://localhost:8080/RESTStyleMailServer/mailService/impl/test1.會在控制檯打印內容 session