码迷,mamicode.com
首页 > Web开发 > 详细

Tapestry5.3.8 Web Services开发

时间:2015-09-16 18:21:35      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:

还是直接上代码:

WebServices.tml:

<!DOCTYPE html>
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
	xmlns:p="tapestry:parameter">
	<head>
		<meta charset="UTF-8" />
		<title>学习Tapestry5.3.8</title>
		<link rel="stylesheet" type="text/css"
			href="${context:css/examples/examples.css}" />
	</head>
	<body>
		<h1>Web Services</h1>
		Here we have a link to a Tapestry page that acts as a REST-like web
		service.
		<br />
		<br />
		<div class="eg">
			<a t:type="pagelink" t:page="ws/PersonFind" t:context="literal:1"
				href="#">PersonFind/1</a>
		</div>
	</body>
</html>

WebServices.java:

public class WebServices {

}

然后页面就长成这死样子了:

技术分享

PersonFind.java (向Tapestry页面输出对象了):

/**
 * @package :com.changhongit.andy.pages.ws<br>
 * @author :wanglongjie<br>
 * @createDate :2015年9月16日下午2:41:16<br>
 */
package com.changhongit.andy.pages.ws;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.apache.tapestry5.StreamResponse;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.Response;

import com.changhongit.andy.dao.PeopleDao;
import com.changhongit.andy.entity.People;
import com.changhongit.andy.entity.ws.WsPeople;

/**
 * @package :com.changhongit.andy.pages.ws<br>
 * @file :PersonFind.java<br>
 * @describe :<br>
 * @author :wanglongjie<br>
 * @createDate :2015年9月16日下午2:41:16<br>
 * @updater :<br>
 * @updateDate :<br>
 * @updateContent :<br>
 */
public class PersonFind {
	@Inject
	private PeopleDao peopleDao;

	Object onActivate(final Long personId) {
		System.out.println("onActivate..." + personId);

		return new StreamResponse() {
			private InputStream inputStream;

			@Override
			public void prepareResponse(Response response) {
				// TODO Auto-generated method stub
				WsPeople wsPeople = findPerson(personId);
				if (wsPeople == null) {
					try {
						response.sendError(HttpServletResponse.SC_NOT_FOUND,
								"Resource not found");
					} catch (IOException e) {
						// TODO: handle exception
						throw new RuntimeException("failed to redirect?", e);
					}
				} else {
					try {
						JAXBContext context = JAXBContext.newInstance(wsPeople
								.getClass());
						Marshaller marshaller = context.createMarshaller();
						ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
						marshaller.marshal(wsPeople, outputStream);

						inputStream = new ByteArrayInputStream(
								outputStream.toByteArray());

						response.setHeader("Content-Length",
								outputStream.size() + "");
					} catch (JAXBException e) {
						// TODO: handle exception
						throw new IllegalStateException("write failure!", e);
					}
				}
			}

			@Override
			public InputStream getStream() throws IOException {
				// TODO Auto-generated method stub
				return inputStream;
			}

			@Override
			public String getContentType() {
				// TODO Auto-generated method stub
				return "text/xml";
			}
		};
	}

	public WsPeople findPerson(Long personId) {
		WsPeople wsPeople = null;
		People people = peopleDao.findById(personId);
		System.out.println(people);
		if (people != null) {
			wsPeople = new WsPeople(people.getId(), people.getName(),
					people.getAge(), people.getBirthday(), people.getGender(),
					people.getHobby());
		}
		return wsPeople;
	}
}

依赖转化为XML的实体类 WsPerson.java , 这家伙不能放在pages目录下,不然他会“挂掉的”

/**
 * @package :example.crud.entity<br>
 * @author :wanglongjie<br>
 * @createDate :2015年8月17日上午9:26:32<br>
 */
package com.changhongit.andy.entity.ws;

import java.io.Serializable;
import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @package :example.crud.entity<br>
 * @file :People.java<br>
 * @describe :用户 实体类<br>
 * @author :wanglongjie<br>
 * @createDate :2015年8月17日上午9:26:32<br>
 * @updater :<br>
 * @updateDate :<br>
 * @updateContent :<br>
 */
@SuppressWarnings("serial")
@XmlRootElement(name = "people")
@XmlAccessorType(XmlAccessType.FIELD)
public class WsPeople implements Serializable {
	/**
	 * ID 好
	 */
	@XmlAttribute(name = "id")
	private Long id;
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 年龄
	 */
	private int age;
	/**
	 * 生日
	 */
	private Date birthday;
	/**
	 * 性别
	 */
	private String gender;
	/**
	 * 兴趣爱好
	 */
	private String hobby;

	public WsPeople() {
	}

	public WsPeople(Long id, String name, int age, Date birthday,
			String gender, String hobby) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.birthday = birthday;
		this.gender = gender;
		this.hobby = hobby;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

	@Override
	public String toString() {
		return "People [id=" + id + ", name=" + name + ", age=" + age
				+ ", birthday=" + birthday + ", gender=" + gender + ", hobby="
				+ hobby + "]";
	}

}


通过注解,这家伙已经百毒不侵了,可以轻松的转化为XML文件。

点击页面上的“PersonFind/1“,跳转到PersonFind 页面,内容如下所示:

技术分享

就此,Tapestry 就创建了一个标准的 as a REST-like web service.

********************************************************************************************************

重点来了,正如上边所说:WsPerson.java 如果放在pages包下,就会报异常错误:Class com.changhongit.andy.pages.ws.WsPeople has been transformed and may not be directly instantiated. 技术分享

说这个类已经被转化不能直接实例化,这大概就是为什么Tapestry的页面类都要放在pages包下,肯定是已经做过一些处理,至于怎么处理的,抱歉我也没看过过源码!


Tapestry5.3.8 Web Services开发

标签:

原文地址:http://my.oschina.net/andy1989/blog/506900

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!