Struts2整合REST Plugin

1.添加依赖的Jar

 

 <dependency>
  	<groupId>org.apache.struts</groupId>
  	<artifactId>struts2-convention-plugin</artifactId>
  	<version>2.1.6</version>
 </dependency>
 <dependency>
  	<groupId>org.apache.struts</groupId>
  	<artifactId>struts2-rest-plugin</artifactId>
  	<version>2.1.6</version>
 </dependency>


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设计
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
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
<%@ 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--创建新用户
<%@ 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" οnclick="history.back()"/></td>
  		</tr>
  	</table>
  	</s:form>
  </body>
</html>
 
user-edit.jsp--编辑用户信息
<%@ 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/%{id}" theme="simple" method="post">
  	<s:hidden name="_method" value="put" />
  	<table>
  		<tr>
  			<td>ID:<s:textfield name="id" disabled="true"/></td>
  		</tr>
  		<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" οnclick="history.back()"/></td>
  		</tr>
  	</table>
  	</s:form>
  </body>
</html>
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近温习ssh2整合编程,顺便浏览下struts2有什么更新的消息,下载了新版本的struts2的2.1.8.1版,使用的是MyEclipse8.0开发,但是问题就随之而来了。MyEclipse8.0中自带的struts2版本是2.1.6,spring版本有2.0,2.5的,hibernate版本较多些至3.2,首先选版本就选择最优的,struts2没的选只有2.1.6版的,所以先导入struts2支持,然后是spring选的是2.0,问题就出在struts2中spring的插件上了,没有从MyEclipse8.0中导入2.1.6版本的包,而是选择我本地的一个2.1.8.1版本的包,问题就出来了,报dispatcher 不能初始化,找不到类;更换ok!另外的问题就是spring和hibernate整合的问题了,当时也是一股脑的将hibernate和spring的包全导入进来,然后发布,启动tomcat,查看报错的问题,这个方面到没有出现版本差异的问题,典型的就是缺包,然后报找不到类,添加进来就行了啊!这个就不再详述,具体请看下面,经过详细排查,终于分析完毕相关包的作用,并整理完一套完整的包(由于大小问题没有上传,附图): struts2的包必须版本一致 不能即用2.1.6的包 又用到了2.1.8的包 ,其他版本类似。 另外三大框架的添加顺序也需要注意下,我的添加顺序是 struts2.1.6、spring2.0、hibernate3.2 spring版本差异(包方面)没有研究过,大致雷同,也应该保持版本一致,即在同一个稳定发行包中下载的包。 以下包后面跟的数字意思:(带*号为可选包,根据需要额外增加) 0 一些基本的包需要添加 删除需慎重; 1 spring的相关包,先添加struts2.0的支持时标记的包; 2 struts2的相关包;以struts2-core-2.1.6版本为准; 注:struts2-core-2.1.8有较大变化需要注意替换相关包,注意尾号尽量不要是单号 例子:xwork-2.1.2.jar在2.1.8中xwork-core-2.1.6.jar 具体啥问题没测过 3 hibernate3相关包 antlr-2.7.2.jar //2 aopalliance-1.0.jar //2 asm-attrs.jar //3 asm.jar // 3 cglib-2.1.3.jar //3 commons-beanutils-1.7.0.jar //2 commons-chain-1.2.jar //2 commons-codec-1.3.jar //0 commons-collections-3.1.jar //2 commons-digester-1.8.jar //2 commons-el-1.0.jar //2 * commons-fileupload-1.1.1.jar //2 commons-io-1.1.jar //2 commons-lang-2.1.jar //2 commons-logging-1.0.4.jar //2 commons-logging-api-1.1.jar //2 * commons-validator-1.3.1.jar //2 derbyclient.jar //3 dom4j-1.6.1.jar //3 ehcache-1.2.3.jar //3* ejb3-persistence.jar //3 freemarker-2.3.13.jar //2 hibernate3.jar //3 hibernate-annotations.jar //3 hibernate-commons-annotations.jar //3 hibernate-entitymanager.jar //3 hibernate-validator.jar //3 jaas.jar //3 javassist.jar //3 jaxen-1.1-beta-7.jar //3 jboss-archive-browsing.jar //3 * jdbc2_0-stdext.jar //3 jta.jar //3 jstl-1.1.0.jar //0 json-lib-2.1.jar //2* junit-3.8.2.jar //0 * log4j-1.2.9.jar //0 ognl-2.6.11.jar //2 oro-2.0.8.jar //2 sitemesh-2.4.2.jar //2* spring-beansjar //1 spring-context.jar //1 spring-core.jar //1 spring-dao.jar //3 spring-hibernate3.jar //3 spring-jdbc.jar //3 spring-web-2.5.6.jar //1 struts2-core-2.1.6.jar //2 struts2-convention-plugin-2.1.6.jar //2* struts2-spring-plugin-2.1.6.jar //1 xwork-2.1.2.jar //2 xerces-2.6.2.jar //3 xml-apis.jar //3 注:以下包为数据源连接池 相关 用到那个添加相应的包 c3p0-0.9.1.2.jar //3 commons-pool.jar //3 commons-dbcp.jar //3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值