Struts2和REST Web Service集成事例

java技术文章

2018-11-28

148

0

这篇文章将提供struts2和rest web service集成事例,struts2提供Rest插件去集成Rest web Service。父包应该设置为rest-default.惯例action类名称填写Controller前缀。struts2 rest web service支持不同类型的相应结果类型。使用json扩展名获取json响应结果和使用xml扩展名获取xml响应结果。在这个例子中我有一个employee库Rest web service。在Rest url中的提供employee id,应用将返回employee格式内容将被返回。

运行应用需要的软件

为了运行实例,我们需要如下软件:

1、java 7
2、tomcat 7
3、eclipse
4、maven

eclipse项目结构

找到struts2和REST web service在eclipse中集成的结构。

 

Struts2 Rest插件:pom.xml

为了解释struts2 REST API,我们需要在pom.xml文件中添加如下插件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.concretepage</groupId>
  <artifactId>struts2rest</artifactId>
  <packaging>war</packaging>
  <version>1</version>
  <name>Struts2Rest</name>
  <dependencies>
	<dependency>
		<groupId>org.apache.struts</groupId>
		<artifactId>struts2-convention-plugin</artifactId>
		<version>2.3.20</version>
	</dependency>
	<dependency>
		<groupId>org.apache.struts</groupId>
		<artifactId>struts2-rest-plugin</artifactId>
		<version>2.3.20</version>
	</dependency>
  </dependencies>
</project> 
为了支持struts2 rest插件,我们需要添加对struts2约定插件的解释依赖插件。
 

struts2.xml :配置约定插件

在项目中找到struts2.xml,配置struts约定插件配置项。
struts.xml
 
<?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>
    <constant name="struts.convention.action.suffix" value="Controller"/>
    <constant name="struts.convention.action.mapAllMatches" value="true"/>
    <constant name="struts.convention.default.parent.package" value="rest-default"/>
    <constant name="struts.convention.package.locators" value="rest"/>
</struts> 

找到约定插件的描述,并且开始使用。

<constant name="struts.convention.action.suffix" value="Controller"/>

定义一个action类前缀。rest web service的action类约定使用Controller前缀并且这个前缀将不包括在URL内。

 <constant name="struts.convention.action.mapAllMatches" value="true"/>

映射匹配,可以设置值true或false

<constant name="struts.convention.default.parent.package" value="rest-default"/>

为了支持REST Web service,struts2 继承rest-default父包名;

<constant name="struts.convention.package.locators" value="rest"/>

locator表示哪一个controller类的包名中最后一个单词存在设置的值。在我们的class中,它被设置为rest

创建一个Employee实体库

对于实例应用,我们创建一个Employee实体库。先找到employee类.
Employee.java
package com.concretepage.rest;
public class Employee {
	private Integer id;
	private String name;
	private String company;
	public Employee(Integer id, String name, String company){
		this.id =id;
		this.name = name;
		this.company = company;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
} 
现在找到用简单数据构成的数据层。
EmployeeRepository.java
package com.concretepage.rest;
import java.util.HashMap;
import java.util.Map;
public class EmployeeRepository {
	private static Map<String,Employee> map = new HashMap<String,Employee>(); 
	public EmployeeRepository(){
		map.put("111", new Employee(111, "Ram", "ABC"));
		map.put("222", new Employee(222, "Shyam", "EFG"));
		map.put("333", new Employee(333, "Mohan", "XYZ"));
	}
	public  Employee getEmployeeById(String id){
		return map.get(id);
	}
	public  Map<String,Employee> findAllEmployee(){
		return map;
	}
} 

创建一个Controller action类:继承ModelDriven

找到controller类。类将继承ModelDriven并且需要重写getModel ()方法。无论一个REST url是否被命中,这个方法将返回一个响应结果。
EmployeeController.java
package com.concretepage.rest;
import java.util.Map;
import org.apache.struts2.rest.DefaultHttpHeaders;
import org.apache.struts2.rest.HttpHeaders;
import com.opensymphony.xwork2.ModelDriven;
public class EmployeeController implements ModelDriven<Object>{
	private static final long serialVersionUID = 1L;
	private String id;
	private Object model;
	private EmployeeRepository employeeRepository = new EmployeeRepository();
	private static Map<String,Employee> map;
	{
		map = employeeRepository.findAllEmployee();
	}
	public HttpHeaders index() {
		model = map;
		return new DefaultHttpHeaders("index").disableCaching();
	}
	public String add(){
		Integer empId = Integer.parseInt(id);
		Employee emp = new Employee(empId,"Ramesh", "PQR");
		model = emp;
		return "SUCCESS";
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		model = employeeRepository.getEmployeeById(id);
		this.id = id;
	}
	@Override
	public Object getModel() {
		return model;
	}
}  

1、对于Index()的URL: rest web service url 可以通过如下链接调用index()方法
http://localhost:8080/struts2rest-1/employee.json
http://localhost:8080/struts2rest-1/employee.xml

看这个url,将从EmployeeController类中获取employee的数据。前缀被忽略。默认方法为index()。为了获取json响应,可以使用json扩展名,或者获取xml响应,可以使用xml扩展名。

2、url中的id:现在找到设置和或者id的另一个urls
http://localhost:8080/struts2rest-1/employee/111.json
http://localhost:8080/struts2rest-1/employee/111.xml
通过这个输入值,我们必须有一个id属性,并且需要创建id属性的setter和getter方法。

3、add()方法的url:为了调用我们自己的方法,创建一个像add()方法。这个方法将在调用id setter和getter之后调用。URL中的值555将被设置到id属性中。URL显示如下:
http://localhost:8080/struts2rest-1/employee/555/add.json
http://localhost:8080/struts2rest-1/employee/555/add.xml

这个url将调用add()方法,返回关联数据模型。

应用中的web.xml配置
找到struts2中的web.xml
web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Struts 2 REST Web Service</display-name>
   <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>actionPackages</param-name>
            <param-value>com.concretepage.action</param-value>
        </init-param>
    </filter>
  <filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app> 

输出
1、URL http://localhost:8080/struts2rest-1/employee/111.json  响应内容
{"company":"ABC","id":111,"name":"Ram"}
2、XML http://localhost:8080/struts2rest-1/employee/111.xml 响应内容
<com.concretepage.rest.Employee>
<id>111</id>
<name>Ram</name>
<company>ABC</company>
</com.concretepage.rest.Employee>

2、URL http://localhost:8080/struts2rest-1/employee/555/add.json 地址响应
{"company":"PQR","id":555,"name":"Ramesh"}
url  http://localhost:8080/struts2rest-1/employee/555/add.xml xml地址响应
<com.concretepage.rest.Employee>
<id>555</id>
<name>Ramesh</name>
<company>PQR</company>
</com.concretepage.rest.Employee>

到这里就完了。

欢迎访问:www.hongfu951.com博客,查看更多文章

发表评论

全部评论:0条

鸿福951

努力打造一个好用的webui

热评文章

推荐文章