Struts2整合REST Plugin

1.添加依赖的Jar

Xml代码 复制代码 收藏代码
  1. <span style="font-size: small;"><dependency>
  2. <groupId>org.apache.struts</groupId>
  3. <artifactId>struts2-convention-plugin</artifactId>
  4. <version>2.2.3</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.struts</groupId>
  8. <artifactId>struts2-rest-plugin</artifactId>
  9. <version>2.2.3</version>
  10. </dependency></span>


2.参数配置

// Action的类名以Controller为后缀
<constant name="struts.convention.action.suffix" value="Controller"/>
// Action中没有@Action注解也创建映射
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
// Action类所在的包
<constant name="struts.convention.action.packages" value="com.st.web"/>
// 搜索以web为结尾的包
<constant name="struts.convention.package.locators" value="web"/>

3.BaseController设计
Java代码 复制代码 收藏代码
  1. <span style="font-size: small;">package com.st.web;
  2. import java.io.Serializable;
  3. import org.apache.struts2.rest.HttpHeaders;
  4. import com.opensymphony.xwork2.ModelDriven;
  5. import com.opensymphony.xwork2.Preparable;
  6. public abstractclass BaseController<T> implements ModelDriven<T>,
  7. Serializable, Preparable {
  8. private staticfinal long serialVersionUID = 7449478681110941532L;
  9. protected T entity;
  10. /**
  11. * GET: /{model}
  12. */
  13. public abstract HttpHeaders index();
  14. /**
  15. * POST: /{model}
  16. */
  17. public abstract HttpHeaders create();
  18. /**
  19. * PUT: /{model}/{id}
  20. */
  21. public abstract String update();
  22. /**
  23. * DELETE: /{model}/{id}
  24. */
  25. public abstract String destroy();
  26. /**
  27. * GET: /{model}/{id}
  28. */
  29. public abstract HttpHeaders show();
  30. /**
  31. * GET: /{model}/{id}/edit
  32. */
  33. public abstract String edit();
  34. /**
  35. * GET: /{model}/new
  36. */
  37. public abstract String editNew();
  38. @Override
  39. public T getModel() {
  40. return entity;
  41. }
  42. /**
  43. * 子类通过重写此方法初始化实体类
  44. */
  45. @Override
  46. public abstractvoid prepare();
  47. }
  48. </span>
package com.st.web;

import java.io.Serializable;

import org.apache.struts2.rest.HttpHeaders;

import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;

public abstract class BaseController<T> implements ModelDriven<T>,
		Serializable, Preparable {
	private static final long serialVersionUID = 7449478681110941532L;
	protected T entity;

	/**
	 * GET: /{model}
	 */
	public abstract HttpHeaders index();

	/**
	 * POST: /{model}
	 */
	public abstract HttpHeaders create();

	/**
	 * PUT: /{model}/{id}
	 */
	public abstract String update();

	/**
	 * DELETE: /{model}/{id}
	 */
	public abstract String destroy();

	/**
	 * GET: /{model}/{id}
	 */
	public abstract HttpHeaders show();

	/**
	 * GET: /{model}/{id}/edit
	 */
	public abstract String edit();

	/**
	 * GET: /{model}/new
	 */
	public abstract String editNew();

	@Override
	public T getModel() {
		return entity;
	}

	/**
	 * 子类通过重写此方法初始化实体类
	 */
	@Override
	public abstract void prepare();
}


什么时候需要返回HttpHeaders?
当返回的给用户的响应需要在http头部自定义一些内容,需要返回HttpHeaders的实现类。

官方文档原文:
The REST Plugin adds support for action methods that return HttpHeaders objects as a way for the action to have more control over the response.

REST Plugin HttpHeaders的实现类DefaultHttpHeaders有哪些更多的控制?
String resultCode;
int status = SC_OK;
Object etag; //被请求变量的实体值
Object locationId;
String location; // 响应报头域用于重定向接受者到一个新的位置
boolean disableCaching; // 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)
boolean noETag = false;
Date lastModified; //标记此文件在服务期端最后被修改的时间

Last-Modified和Etags如何帮助提高性能?
聪明的开发者会把Last-Modified 和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
过程如下:
1. 客户端请求一个页面(A)。
2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

4.自定义的Controller
Java代码 复制代码 收藏代码
  1. package com.st.web;
  2. import java.util.Date;
  3. import java.util.List;
  4. import org.apache.struts2.convention.annotation.Result;
  5. import org.apache.struts2.convention.annotation.Results;
  6. import org.apache.struts2.rest.DefaultHttpHeaders;
  7. import org.apache.struts2.rest.HttpHeaders;
  8. import com.st.entity.User;
  9. import com.st.service.UserService;
  10. @Results( { @Result(name ="success", type = "redirectAction", params = {
  11. "actionName", "user" }) })
  12. public class UserControllerextends BaseController<User> {
  13. private staticfinal long serialVersionUID = -2697052455833496406L;
  14. private UserService userService;
  15. private List<User> list;
  16. private Long id;
  17. public HttpHeaders create() {
  18. entity.setCreateTime(new Date());
  19. userService.save(entity);
  20. return new DefaultHttpHeaders("success");
  21. }
  22. public String destroy() {
  23. userService.delete(entity.getId());
  24. return "success";
  25. }
  26. public String edit() {
  27. return "edit";
  28. }
  29. public String editNew() {
  30. entity = new User();
  31. return "editNew";
  32. }
  33. public HttpHeaders index() {
  34. list = userService.list();
  35. return new DefaultHttpHeaders("index").disableCaching();
  36. }
  37. public HttpHeaders show() {
  38. return new DefaultHttpHeaders("show");
  39. }
  40. public String update() {
  41. userService.save(entity);
  42. return "success";
  43. }
  44. public void setUserService(UserService userService) {
  45. this.userService = userService;
  46. }
  47. public UserService getUserService() {
  48. return userService;
  49. }
  50. @Override
  51. public User getModel() {
  52. return entity;
  53. }
  54. public void setId(Long id) {
  55. if (null != id) {
  56. System.out.println("id:" + id);
  57. entity = userService.get(id);
  58. } else {
  59. this.id = id;
  60. }
  61. }
  62. public Long getId() {
  63. return id;
  64. }
  65. public List<User> getList() {
  66. return list;
  67. }
  68. public void setList(List<User> list) {
  69. this.list = list;
  70. }
  71. @Override
  72. public void prepare() {
  73. entity = new User();
  74. }
  75. }
package com.st.web;

import java.util.Date;
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.st.entity.User;
import com.st.service.UserService;

@Results( { @Result(name = "success", type = "redirectAction", params = {
		"actionName", "user" }) })
public class UserController extends BaseController<User> {
	private static final long serialVersionUID = -2697052455833496406L;
	private UserService userService;
	private List<User> list;
	private Long id;

	public HttpHeaders create() {
		entity.setCreateTime(new Date());
		userService.save(entity);
		return new DefaultHttpHeaders("success");
	}

	public String destroy() {
		userService.delete(entity.getId());
		return "success";
	}

	public String edit() {
		return "edit";
	}

	public String editNew() {
		entity = new User();
		return "editNew";
	}

	public HttpHeaders index() {
		list = userService.list();
		return new DefaultHttpHeaders("index").disableCaching();
	}

	public HttpHeaders show() {
		return new DefaultHttpHeaders("show");
	}

	public String update() {
		userService.save(entity);
		return "success";
	}

	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public UserService getUserService() {
		return userService;
	}

	@Override
	public User getModel() {
		return entity;
	}

	public void setId(Long id) {
		if (null != id) {
			System.out.println("id:" + id);
			entity = userService.get(id);
		} else {
			this.id = id;
		}
	}

	public Long getId() {
		return id;
	}

	public List<User> getList() {
		return list;
	}

	public void setList(List<User> list) {
		this.list = list;
	}

	@Override
	public void prepare() {
		entity = new User();
	}
}
5.View层
在WEB-INF\content目录下建立以下文件:user-edit.jsp,user-editNew.jsp,user-index.jsp。
user-index.jsp--以列表显示所有的User
Html代码 复制代码 收藏代码
  1. <%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags"prefix="s" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>User</title>
  7. </head>
  8. <body>
  9. <a href="">List</a>
  10. <a href="user/new">Add User</a>
  11. <table border="0">
  12. <tr>
  13. <td width="100">Login Name</td>
  14. <td width="120">Password</td>
  15. <td width="100">Create Time</td>
  16. <td width="80">Manage</td>
  17. </tr>
  18. <s:iteratorvalue="list"id="u">
  19. <tr>
  20. <td><s:propertyvalue="#u.loginName"/></td>
  21. <td><s:propertyvalue="#u.password"/></td>
  22. <td><s:dateformat="yyyy-MM-dd HH:mm"name="#u.createTime"/></td>
  23. <td>
  24. <a href="user/${u.id }/edit">Edit</a>
  25. <span>|</span>
  26. <a href="user/${u.id}?_method=DELETE">Delete</a>
  27. </td>
  28. </tr>
  29. </s:iterator>
  30. </table>
  31. </body>
  32. </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>User</title>
  </head>
  	
  <body>
  	<a href="">List</a>
  	<a href="user/new">Add User</a>
  	
  	<table border="0">
  		<tr>
  			<td width="100">Login Name</td>
  			<td width="120">Password</td>
  			<td width="100">Create Time</td>
  			<td width="80">Manage</td>
  		</tr>
  		<s:iterator value="list" id="u">
	  		<tr>
	  			<td><s:property value="#u.loginName"/></td>
	  			<td><s:property value="#u.password"/></td>
	  			<td><s:date format="yyyy-MM-dd HH:mm" name="#u.createTime"/></td>
	  			<td>
	  				<a href="user/${u.id }/edit">Edit</a>
	  				<span>|</span>
	  				<a href="user/${u.id}?_method=DELETE">Delete</a>
	  			</td>
	  		</tr>
  		</s:iterator>
  	</table>
  </body>
</html>
user-editNew.jsp--创建新用户
Html代码 复制代码 收藏代码
  1. <%@ page contentType="text/html; charset=UTF-8"language="java"import="java.util.*"pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags"prefix="s" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>User</title>
  7. <meta http-equiv="Content-Type"content="text/html; charset=UTF-8"/>
  8. </head>
  9. <body>
  10. <s:form action="%{#request.contextPath}/user"theme="simple"method="post">
  11. <table>
  12. <tr>
  13. <td>Login Name:<s:textfieldname="loginName"/></td>
  14. </tr>
  15. <tr>
  16. <td>Password:<s:passwordname="password"/></td>
  17. </tr>
  18. <tr>
  19. <td><s:submitvalue="Submit"/><s:resetvalue="Cancel"onclick="history.back()"/></td>
  20. </tr>
  21. </table>
  22. </s:form>
  23. </body>
  24. </html>
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>User</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  </head>
  
  <body>	
  	<s:form action="%{#request.contextPath}/user" theme="simple" method="post">
  	<table>
  		<tr>
  			<td>Login Name:<s:textfield name="loginName"/></td>
  		</tr>
  		<tr>
  			<td>Password:<s:password name="password"/></td>
  		</tr>
  		<tr>
  			<td><s:submit value="Submit"/><s:reset value="Cancel" onclick="history.back()"/></td>
  		</tr>
  	</table>
  	</s:form>
  </body>
</html>
user-edit.jsp--编辑用户信息
Html代码 复制代码 收藏代码
  1. <%@ page contentType="text/html; charset=UTF-8"language="java"import="java.util.*"pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags"prefix="s" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>User</title>
  7. <meta http-equiv="Content-Type"content="text/html; charset=UTF-8"/>
  8. </head>
  9. <body>
  10. <s:form action="%{#request.contextPath}/user/%{id}"theme="simple"method="post">
  11. <s:hidden name="_method"value="put"/>
  12. <table>
  13. <tr>
  14. <td>ID:<s:textfieldname="id"disabled="true"/></td>
  15. </tr>
  16. <tr>
  17. <td>Login Name:<s:textfieldname="loginName"/></td>
  18. </tr>
  19. <tr>
  20. <td>Password:<s:passwordname="password"/></td>
  21. </tr>
  22. <tr>
  23. <td><s:submitvalue="Submit"/><s:resetvalue="Cancel"onclick="history.back()"/></td>
  24. </tr>
  25. </table>
  26. </s:form>
  27. </body>
  28. </html> 

//注意需要将web.xml中struts2的url-pattern改为<url-pattern>/*</url-pattern> ,不能是<url-pattern>*.action</url-pattern>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值