Struts从2.1开始提供了RESTful插件,使 Struts 2 可以支持 Rails 风格的 URL,以对外提供 REST 风格的资源服务。
1 导入jar包
从struts 2.3.15.3压缩包中找到以下文件导入到项目WEB-INF/lib目录中:
ezmorph-1.0.6.jar
json-lib-2.3-jdk15.jar
struts2-convention-plugin-2.3.15.3.jar
struts2-rest-plugin-2.3.15.3.jar
xstream-1.4.2.jar
2 创建实体类
package com.whowii.app.model;
public class Book {
private Integer id;
private String name;
private double price;
// 无参数的构造器
public Book() {
}
public Book(Integer id, String name, double price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
// id 属性的 setter 和 getter 方法
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return this.id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
3 创建Service层代码
这里只是演示代码,并未从数据库中读取数据。
package com.whowii.app.restful.book.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.whowii.app.model.Book;
public class BookService {
private static Map<Integer, Book> books = new HashMap<Integer, Book>();
// 保留下本图书的 ID
private static int nextId = 5;
// 以内存中的数据模拟数据库的持久存储
static {
books.put(1, new Book(1, "疯狂 Java 讲义", 99));
books.put(2, new Book(2, "轻量级 Java EE 企业应用实战", 89));
books.put(3, new Book(3, "疯狂 Ajax 讲义", 78));
books.put(4, new Book(4, "Struts 2 权威指南", 79));
}
// 根据 ID 获取
public Book get(int id) {
return books.get(id);
}
// 获取系统中全部图书
public List<Book> getAll() {
return new ArrayList<Book>(books.values());
}
// 更新已有的图书或保存新图书
public void saveOrUpdate(Book book) {
// 如果试图保存的图书的 ID 为 null,表明是保存新的图书
if (book.getId() == null) {
// 为新的图书分配 ID。
book.setId(nextId++);
}
// 将保存 book
books.put(book.getId(), book);
}
// 删除图书
public void remove(int id) {
books.remove(id);
}
}
4 创建控制器
package com.whowii.app.restful.book.action;
import java.util.List;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.rest.DefaultHttpHeaders;
import org.apache.struts2.rest.HttpHeaders;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.whowii.app.model.Book;
import com.whowii.app.restful.book.service.BookService;
//定义返回 success 时重定向到 book Action
@Results(@Result(name = "success", type = "redirectAction", params = { "actionName", "book" }))
public class BookController extends ActionSupport implements ModelDriven<Object> {
private static final long serialVersionUID = 3983645930580636395L;
// 封装 id 请求参数的属性
private int id;
private Book model = new Book();
private List<Book> list;
// 定义业务逻辑组件
private BookService bookService = new BookService();
// 获取 id 请求参数的方法
public void setId(int id) {
this.id = id;
// 取得方法时顺带初始化 model 对象
if (id > 0) {
this.model = bookService.get(id);
}
}
public int getId() {
return this.id;
}
// 处理不带 id 参数的 GET 请求
// 进入首页
public HttpHeaders index() {
list = bookService.getAll();
DefaultHttpHeaders dh = new DefaultHttpHeaders("index").disableCaching();
return dh;
}
// 处理不带 id 参数的 GET 请求
// 进入添加新图书。
public String editNew() {
// 创建一个新图书
model = new Book();
return "editNew";
}
// 处理不带 id 参数的 POST 请求
// 保存新图书
public HttpHeaders create() {
// 保存图书
bookService.saveOrUpdate(model);
addActionMessage("添加图书成功");
return new DefaultHttpHeaders("success").setLocationId(model.getId());
}
// 处理带 id 参数的 GET 请求
// 显示指定图书
public HttpHeaders show() {
return new DefaultHttpHeaders("show");
}
// 处理带 id 参数、且指定操作 edit 资源的 GET 请求
// 进入编辑页面 (book-edit.jsp)
public String edit() {
return "edit";
}
// 处理带 id 参数的 PUT 请求
// 修改图书
public String update() {
bookService.saveOrUpdate(model);
addActionMessage("图书编辑成功!");
return "success";
}
// 处理带 id 参数,且指定操作 deleteConfirm 资源的方法
// 进入删除页面 (book-deleteConfirm.jsp)
public String deleteConfirm() {
return "deleteConfirm";
}
// 处理带 id 参数的 DELETE 请求
// 删除图书
public String destroy() {
bookService.remove(id);
addActionMessage("成功删除 ID 为" + id + "的图书!");
return "success";
}
// 实现 ModelDriven 接口必须实现的 getModel 方法
public Object getModel() {
return (list != null ? list : model);
}
}
5 创建视图文件
以下文件保存到:WEB-INF\content\book-index.jsp
<%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 图书展示系统 </title>
<link href="<%=request.getContextPath() %>/css/demo.css"
rel="stylesheet" type="text/css" />
</head>
<body>
<s:actionmessage />
<table>
<tr>
<th> 图书 ID</th>
<th> 书名 </th>
<th> 价格 </th>
<th> 操作 </th>
</tr>
<s:iterator value="model">
<tr>
<td><s:property value="id"/></td>
<td>${name}</td>
<td>${price}</td>
<td><a href="book/${id}"> 查看 </a> |
<a href="book/${id}/edit"> 编辑 </a> |
<a href="book/${id}/deleteConfirm"> 删除 </a></td>
</tr>
</s:iterator>
</table>
<a href="<%=request.getContextPath() %>/book/new"> 创建新图书 </a>
</body>
</html>
6 访问示例
http://localhost:8180/ssh/book.do