Struts2提供了一个restful的插件:struts2-rest-plugin-2.3.16.1.jar

这个插件可以把Struts2当做restful来使用,不过它的rest功能目前来说有点“死板”,定死了格式,这是使用这个插件不是那么爽的地方,或许有别的方式可以修改,之后再研究。

这是它的rest格式:

RestActionMapper 对 HTTP 请求的处理

HTTP 方法 URI 调用 Action 的方法 请求参数
GET /user index  
POST /user create  
PUT /user/2 update id=2
DELETE /user/2 destroy id=2
GET /user/2 show id=2
GET /user/2/edit edit id=2
GET /user/new editNew  

直接上自己学习写的例子:
在eclipse中怎么加插件就不写了,引包就可以了,记得要把Convertion的包也引入。

1)web.xml的配置:

    <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2)新增一个Entity:

package com.my.beans;

import java.util.Date;

public class User {

    private int Id;
private String username;
private String password;
private int age;
private Date createTime; public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
} public User(int id, String username, String password, int age,
Date createTime) {
Id = id;
this.username = username;
this.password = password;
this.age = age;
this.createTime = createTime;
} public User() {
} }

3) 建一个Service类,用于模拟持久层的读写用:

package com.my.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.my.beans.User; public class UserService { // new一个用户列表数据对象,模拟持久层数据
private static Map<Integer, User> users = new HashMap<Integer, User>(); // 初始化用户列表数据,模拟持久层数据
static {
users.put(1, new User(1, "robin1", "password1", 18, new Date()));
users.put(2, new User(2, "robin2", "password2", 19, new Date()));
users.put(3, new User(3, "robin3", "password3", 20, new Date()));
users.put(4, new User(4, "robin4", "password4", 21, new Date()));
users.put(5, new User(5, "robin5", "password5", 22, new Date()));
} /**
* 通过用户ID取得用户实体
* @param id
* @return
*/
public User getId(int id) {
return users.get(id);
} /**
* 取得所有用户列表
* @return
*/
public List<User> getAll() {
return new ArrayList<User>(users.values());
} /**
* 更新用户
* @param user
*/
public void update(User user) {
if (user.getId() > 0) {
users.put(user.getId(), user);
}
} /**
* 新增用户
* @param user
*/
public void add(User user) {
int size = users.size();
int id = size + 1;
user.setId(id);
users.put(id, user);
} /**
* 删除用户
* @param id
*/
public void remove(int id) {
users.remove(id);
} }

4) 新建一个struts.xml在src目录下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 把它设置为开发模式,发布时要设置为false -->
<constant name="struts.devMode" value="true" />
<!-- 设置在class被修改时是否热加载,发布时要设置为false -->
<constant name="struts.convention.classes.reload" value="true"/>
<!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 指定jsp文件所在的目录地址 -->
<constant name="struts.convention.result.path" value="/WEB-INF/content/" />
<!-- 使用struts-default默认的转换器,如果是rest的使用:rest-default,rest需要rest的jar插件 -->
<constant name="struts.convention.default.parent.package" value="rest-default"/>
<!-- 用于配置包名后缀。默认为action、actions、struts-->
<constant name="struts.convention.package.locators" value="controller" />
<!-- 用于配置类名后缀,默认为Action,设置后,Struts2只会去找这种后缀名的类做映射 -->
<constant name="struts.convention.action.suffix" value="Controller"/>
<!-- 设置即使没有@Action注释,依然创建Action映射。默认值是false。因为Convention-Plugin是约定优于配置的风格,
可以不通过注解根据预先的定义就能访问相应Action中的方法 -->
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<!-- 自定义jsp文件命名的分隔符 -->
<constant name="struts.convention.action.name.separator" value="-" />
<!-- 国际化资源文件名称 -->
<constant name="struts.custom.i18n.resources" value="i18n" />
<!-- 是否自动加载国际化资源文件 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 上传文件大小限制设置 -->
<constant name="struts.multipart.maxSize" value="-1" />
<!-- 主题,将值设置为simple,即不使用UI模板。这将不会生成额外的html标签 -->
<constant name="struts.ui.theme" value="simple" />
<!-- 编码格式 -->
<constant name="struts.i18n.encoding" value="UTF-8" /> </struts>

5) 新建设一个Controller的类:

package com.my.controller;

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.my.beans.User;
import com.my.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; @SuppressWarnings("serial")
@Results(@Result(name = "success", type = "redirect", location="/user"))
public class UserController extends ActionSupport implements
ModelDriven<Object> { // Rest URL请求的ID值
private int id;
// 用户实体
private User model = new User();
// 用户列表
private List<User> list;
// 用户Service
private UserService userService = new UserService(); /**
* 使用ModelDriven,重写getModel()方法
*/
@Override
public Object getModel() {
return (list != null ? list : model);
} /**
* 设置用户ID
* @param id
*/
public void setId(int id) {
this.id = id;
// 如果用户ID大于零,取得用户实体
if (id > 0) {
this.model = userService.getId(id);
}
} /**
* 取得用户ID
* @return
*/
public int getId() {
return this.id;
} /**
* 功能:首页
* 调用:GET /user
* 返回:user-index.jsp
* @return
*/
public HttpHeaders index() {
list = userService.getAll();
return new DefaultHttpHeaders("index").disableCaching();
} /**
* 功能:新增一个用户
* 调用:GET /user/new
* 返回:user-editNew.jsp
* @return
*/
public String editNew() {
model = new User();
return "editNew";
} /**
* 功能:保存新增用户
* 调用:POST /user
* 返回:user-index.jsp
* @return
*/
public HttpHeaders create() {
userService.add(this.model);
return new DefaultHttpHeaders(SUCCESS)
.setLocationId(this.model.getId());
} /**
* 功能:显示用户信息明细,返回show的jsp
* 调用:GET /user/1
* 返回:user-show.jsp
* @return
*/
public HttpHeaders show() {
return new DefaultHttpHeaders("show");
} /**
* 功能:编辑用户
* 调用:GET /user/1/edit
* 返回:user-edit.jsp
* @return
*/
public String edit() {
return "edit";
} /**
* 功能:更新用户信息
* 调用:PUT /user/1
* 返回:user-index.jsp
* @return
*/
public String update() {
userService.update(this.model);
addActionMessage("Update user successed.");
return SUCCESS;
} /**
* 功能:删除用户
* 调用:DELETE /user/1
* 返回:user-index.jsp
* @return
*/
public String destroy() {
userService.remove(id);
addActionMessage("Delete user successed.");
return SUCCESS;
} }

注意这一句:@Results(@Result(name = "success", type = "redirect", location="/user"))
这句注解的意思是如果在方法中返回的是SUCCESS,则会将页面重定向到这个地址:/user
不知道为什么,如果把type="redirect"改为type="redirectAction",它总会在地址后面加一个statusCode=303,然后会报一个错误。
AddActionMessage(...)方法调用后,在jsp中可以使用<s:actionmessage/>输出内容。

(继:Struts2 - Rest(2))

Struts2 - Rest(1)的更多相关文章

  1. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  2. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  3. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  4. 菜鸟学Struts2——Results

    在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...

  5. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  6. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  7. 13、零配置Struts2开发

    Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...

  8. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  9. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  10. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

随机推荐

  1. OpenFlow Switch学习笔记(七)——Matching Fields

    Matching Fields in_port=port Matches OpenFlow port port dl_vlan=vlan Matches IEEE 802.1q Virtual LAN ...

  2. OpenvSwitch架构

    Openvswitch的架构 数据库结构和OVS-VSCTL # ps aux | grep openvswitch root      1117  0.0  0.0  21200  1580 ?   ...

  3. 【转】java 注释规范

    原则: 1.注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释.如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范. 2 ...

  4. java web目录结构

    转自:http://blog.csdn.net/javaloveiphone/article/details/7828894 Javaweb项目的源文件与字节码文件的目录结构 1.新建项目的源文件目录 ...

  5. 基础套接字的C#网络编程

    1.基于socket创建套接字网络连接服务端1.初始化 步骤 操作 方法 操作类 1. 创建ip ipaddress IPAddress类 2. 创建ip终结点   ipendpoint IpendP ...

  6. SQL Server 合并表 union 和union all

    如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...

  7. leetcode 113 Path Sum II ----- java

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  8. 工作中遇到的问题--实现CustomerSetting的实时更新

    首先在项目运行时就初始化CustomerSettings的值,采用@Bean,默认是singtone模式,只会加载一次. @Configuration@Order(3)@EnableWebMvcSec ...

  9. 4-1 yum源文件

    1.Yum源文件 <1>在Linux中,有这样一个目录 /etc/yum.repos.d/,里面有默认4个yum源文件, 其中Base是基本yum源文件,它是默认生效的 其他的几个默认都是 ...

  10. 了解CentOS及周边

    CentOS相关介绍 CentOS是Community ENTerprise Operating System的简称RHEL的全称则是Red Hat Enterprise LinuxFedoro Co ...