struts2 对RESTful的支持真的是花架子吗?``

pioneer_csdn 2010-05-31 10:18:31
想在一个struts2的项目里加上REST的支持``

在上网搜资料的时候`看到有段这样的话``

引用
我不清楚你看到的是一篇什么样的文章,是用struts2实现rest架构吗?如果是那样的话,索性劝你就不要用了,如果你真正想去玩一下rest的话,可以去试试restlet 之类的基于rest的轻量级框架,用struts只是能模拟rest的资源uri而已,它们两个的最初设计思想是截然不同的
``

"用struts只是能模拟rest的资源uri而已"

是这样的吗?``REST除了对资源的标准化还有什么?``

"它们两个的最初设计思想是截然不同的"``

怎么个不同法?``
...全文
483 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pioneer_csdn 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bao110908 的回复:]

Web 服务仅仅是作为服务提供的,如果某些数据需要鉴权才能使用,那么每次必须将认证数据一并传送过去。Web 服务仅维持一次认证,响应完了之后就结束了,服务端不需要记录些什么。
[/Quote]

嗯 ``这就和我想的一样了`
pioneer_csdn 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]

很多人对于 REST 有种误区,认为就是 URL 重写,实际上并不是这样的。
[/Quote]实际上什么样的呢?``

还有`

REST是不是没有session的``

那有些有登录信息啥的怎么办?`
  • 打赏
  • 举报
回复
Jersey 的 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/web-app_2_5.xsd"
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>jaxrs</display-name>

<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<!-- 表示扫描哪个包中的资源,如有多个包的话用“;”分隔 -->
<param-value>net.blogjava.frankiegao123.resource</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<!-- REST 资源的顶层路径 -->
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
</web-app>


REST 与 Java 相关的书籍目前有 O'Reilly 的 Resutful Java with JAX-RS
  • 打赏
  • 举报
回复
REST 很好用,我用 Jersey JAX-RS 和 JAXB 写了个小例子:

REST 端:

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.blogjava.frankiegao123.bean.Link;
import net.blogjava.frankiegao123.bean.User;

@Path("/user")
public class UserResource {

private static Logger log = LoggerFactory.getLogger(UserResource.class);

@Context
private UriInfo info;

private static Map<Integer, User> database = new TreeMap<Integer, User>();

static {
innerAddUser(1, "Tom");
innerAddUser(2, "Jerry");
innerAddUser(3, "Mike");
innerAddUser(4, "Alice");
innerAddUser(5, "Frank");
}

private static User innerAddUser(Integer id, String name) {
User user = new User(id, name);
return innerAddUser(user);
}

private static User innerAddUser(User user) {
database.put(user.getId(), user);
return user;
}

@GET
@Produces("application/xml")
public List<User> getAllUsers() {
log.debug("get all user, request path: {}", info.getPath());
List<User> users = new LinkedList<User>(database.values());
UriBuilder builder = info.getAbsolutePathBuilder();
builder.path("{id}");
for(User user : users) {
user.setLink(new Link(builder.clone().build(user.getId()).toString(), "application/xml"));
}
return users;
}

@GET
@Produces("application/xml")
@Path("{id}")
public User getUser(@PathParam("id") int id) {
User user = database.get(id);
log.debug("get {} user: {}, request path: {}, ", new Object[]{ id, user, info.getPath() });
return user;
}

@POST
@Produces("application/xml")
@Path("{id}/{name}")
public User updateUser(@PathParam("id") int id, @PathParam("name") String name) {
User user = database.get(id);
if(user == null) {
log.info("update user failed, id: {}, user isnot exist that cannot be update, request path: {}", id, info.getPath());
return null;
}
user = innerAddUser(id, name);
log.debug("update user ok, id: {}, user: {}, request path: {}", new Object[]{ id, user, info.getPath() });
return user;
}

@PUT
@Produces("application/xml")
@Path("{id}/{name}")
public User addUser(@PathParam("id") int id, @PathParam("name") String name) {
User user =database.get(id);
if(user != null) {
log.info("add user failed, id: {}, user has exist that cannot be add, request path: {}", id, info.getPath());
return null;
}
user = innerAddUser(id, name);
log.debug("add user ok, id: {}, user: {}, request path: {}", new Object[]{ id, user, info.getPath() });
return user;
}

@DELETE
@Produces("application/xml")
@Path("{id}")
public User removeUser(@PathParam("id") int id) {
User user = database.get(id);
if(user == null) {
log.info("remove user failed, id: {}, user has exist that cannot be delete, request path: {}", id, info.getPath());
return null;
}
user = database.remove(id);
log.debug("remove user ok, id: {}, user: {}, request path: {}", new Object[]{ id, user, info.getPath() });
return user;
}
}



两个 JAXB XML 绑定的类:

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

@XmlRootElement(name = "link")
public class Link {

protected String href;
protected String type;

public Link() {
}

public Link(String href, String type) {
this.href = href;
this.type = type;
}

@XmlAttribute
public String getHref() {
return href;
}

public void setHref(String href) {
this.href = href;
}

@XmlAttribute
public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}
}

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "user")
public class User {

private Link link;
private Integer id;
private String name;

public User() {
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}

public Link getLink() {
return link;
}
public void setLink(Link link) {
this.link = link;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}


我向 REST 服务端发出 http://localhost:8080/jaxrs/rs/user GET 请求,根据资源定义,这个请求表示查询所有的用户,返回的结果为:

<users>
<user>
<id>1</id>
<link type="application/xml" href="http://localhost:8080/jaxrs/rs/user/1"/>
<name>Tom</name>
</user>
<user>
<id>2</id>
<link type="application/xml" href="http://localhost:8080/jaxrs/rs/user/2"/>
<name>Jerry</name>
</user>
<user>
<id>3</id>
<link type="application/xml" href="http://localhost:8080/jaxrs/rs/user/3"/>
<name>Mike</name>
</user>
<user>
<id>4</id>
<link type="application/xml" href="http://localhost:8080/jaxrs/rs/user/4"/>
<name>Alice</name>
</user>
<user>
<id>5</id>
<link type="application/xml" href="http://localhost:8080/jaxrs/rs/user/5"/>
<name>Frank</name>
</user>
</users>
izard999 2010-05-31
  • 打赏
  • 举报
回复
没有过rest,不好说.!
进来学习下.!
  • 打赏
  • 举报
回复
很多人对于 REST 有种误区,认为就是 URL 重写,实际上并不是这样的。
  • 打赏
  • 举报
回复
REST 是把一个服务作为资源来看待,需要向服务端的 endpoint 传送数据(并非必须是 XML 的)。然后服务端处理后进行响应。

我没用过 Struts 2 的 Struts 2 的 REST 无法进行比较。我认为 Struts 2 只是一个 MVC 框架,要做到 REST 这种 Web 服务形式的话我想可能有点差距。

在这个帖子中我描述了一下 REST,有兴趣的话可以去看一下:
http://topic.csdn.net/u/20100507/01/7a74b283-892e-4551-8589-5d8701795106.html

Java EE 对于 REST 的支持已经进行标准化(JSR311 - JAX-RS v1.1)已经被纳入了 Java EE 6 规范中。

目前遵守 JAX-RS 的 REST 工具有:

在 JAX-RS 之前就有的 REST 框架 Restlet: http://www.restlet.org/
Sun jersey: https://jersey.dev.java.net/
Apache CXF: http://cxf.apache.org/docs/jax-rs.html

当然还有其他的,具体的参数 InfoQ 上面的一篇文章:
http://www.infoq.com/cn/news/2008/10/jaxrs-comparison

对于 Struts 2 来说,只有看到 REST 的插件,并没有 JAX-RS 的实现。

如果 REST 应用需要与 Spring 集成的话,那建议使用 Apache CXF
如果不需要与 Spring 集成,那建议使用 Jersey,毕竟 Jersey 是 Glassfish v3 中 JAX-RS 的实现
  • 打赏
  • 举报
回复
Web 服务仅仅是作为服务提供的,如果某些数据需要鉴权才能使用,那么每次必须将认证数据一并传送过去。Web 服务仅维持一次认证,响应完了之后就结束了,服务端不需要记录些什么。
  • 打赏
  • 举报
回复
如果把 URI 设计成这样:

GET 请求 http://localhost:8080/app/rs/message

而在服务端含有用户状态,本意是查询这个用户的消息。这样做的话是不符合 REST 要求的。

REST 服务是无状态的,服务端不能记录用户状态。

维基百科上有关于 REST 的介绍和要求:

http://zh.wikipedia.org/zh/REST
http://en.wikipedia.org/wiki/Representational_State_Transfer
  • 打赏
  • 举报
回复
REST 服务主要是针对 URI 的设计:

像那个查询 URI 可以设计成这样:

GET 请求 http://localhost:8080/app/rs/message/<username>

把用户 message 抽象为资源,后面的一个 PATH 指的是哪个用户的 message
pioneer_csdn 2010-05-31
  • 打赏
  • 举报
回复
比如说``

用户要查看自己的短消息`

是不是没法做成REST``还是每次查寻都要报自己的用户认证信息?`
  • 打赏
  • 举报
回复
你先要理解一下,Web 应用与 Web 服务有什么区别,否则很难理解的。
  • 打赏
  • 举报
回复
服务怎么会有状态呢?
  • 打赏
  • 举报
回复
实际上是怎么样的,我在 1 楼的回复中,第一个链接里已经说过了,你肯定没去看。

REST 是资源服务是无状态的,如果弄成有状态的话,那就违反了 REST 的基本原则。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧