具体关于SOAP和RESTful类型的服务的区别,可自行百度。
创建web工程,我的工程名是:RESTStyleMailServer
工程结构
1. JavaBean的编写。
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
<?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/这样可查看是否成功
如果出现上图的内容,表示成功。
测试test方法,http://localhost:8080/RESTStyleMailServer/mailService/impl/test1.会在控制台打印内容