Struts2 - Rest(1)
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(1)的更多相关文章
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- 菜鸟学Struts2——Interceptors
昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 菜鸟学Struts2——Results
在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 13、零配置Struts2开发
Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...
- 12、Struts2表单重复提交
什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
随机推荐
- python学习:猜数字小游戏
在学习python过程中,没有项目做,就想到哪儿弄到哪儿. 头一发.让机器随机固定一个数字,然后让人去猜. 就这么简单.代码如下: #-*- encoding:utf8 -*- import rand ...
- tracking 问题解决
1.dir,或者C++函数读文件名,不推荐.搞乱了名字 2. matio读写矩阵
- C++学习笔记5:如何给变量及函数命名?
1.遵循C++规定的变量及函数命名方法: 2.原则:简单,易于理解: 以下是一些例子,可以作为参考: //bad examples: int ccount;//Nobody knows what a ...
- 【转】C++析构函数为什么要为虚函数
注:本文内容来源于zhice163博文,感谢作者的整理. 1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生. 下面转自网络:源地址 ...
- 刻通云KeyTone Cloud测试
注:本文转自陈沙克的博客,原文见http://www.chenshake.com/carved-through-the-keytone-cloud-cloud-testing/ 一直都很希望有更多的O ...
- 当我把电脑500G硬盘格式化了的时候,在想些什么
所以我就想重新尝试一下怎么装多系统,bootloader,MBR到底是怎么回事儿. 简要记录一下: 首先,在可以作为启动盘的U盘里面,备份一份可以用的WinXP镜像+校园网客户端安装文件+驱动精灵安装 ...
- (转)PK系列之六:该不该读中文翻译的专业书
本文引用地址:http://blog.sciencenet.cn/blog-2999994-956596.html 此文来自科学网王立新博客,转载请注明出处. 刘新建:这几天在读一本译著:投入产出分析 ...
- 1-1 Java简介
主要内容: <1>Java平台应用 <2>核心概念:JVM.JDK.JRE <3>搭建Java开发环境 <4>使用工具开发Java程序 <5> ...
- 关于kafka连接不上别的机器问题Connection refused
1.确认config里面的server.properties 正确(包括IP+端口2181记得看清,用hostname的话记得etc/hostnames下面查看全部配置上没,建议用hostname方便 ...
- U盘
U盘里的.Trashes是什么文件,要怎么去掉?为什么会出现这个文件? 这是苹果电脑的垃圾文件. 1.在苹果电脑上删除文件后,没有清空回收站,就会留下这些文件. 2.可以重新插入Mac, 然后会发现T ...