Struts 2 注解实现Action返回JSON数据

Struts 2 注解实现返回JSON数据

所需Struts 2依赖:

  • struts2-core
  •  struts2-convention-plugin
  • struts2-json-plugin

    如果你使用Maven,需要引入下列依赖:

   

<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.5.14.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-convention-plugin</artifactId>
			<version>2.5.14.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-json-plugin</artifactId>
			<version>2.5.14.1</version>
		</dependency>

JsonAction

    创建JsonAction类的目的只有一个就是为了简化其子类的注解配置,子类只需继承它即可。代码如下:

 

import java.util.HashMap;
import java.util.Map;

import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

@ParentPackage("json-default")
@Result(type="json")
public abstract class JsonAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	protected Map<Object,Object> resultMap;
	{
		resultMap = new HashMap<>();
	}
	public Map<Object, Object> getResultMap() {
		return resultMap;
	}
	public void setResultMap(Map<Object, Object> resultMap) {
		this.resultMap = resultMap;
	}
	
}

    解释:

  •     @ParentPackage("json-default")

      我在这个类上添加了@ParentPackage("json-default")的注解,它的作用相当于在struts.xml配置文件中配置 <packageextends="json-default">让这个包继承于json-default包,这个是必须的

  • @Result(type="json")

      这个注解是配置Action类返回的结果,相当于在struts.xml中配置action节点下的result

<action >
   <resulttype="json"> </result>
</action>
  • resultMap属性

    这个属性用于封装返回的结果。Struts 2会自动将它转换为JSON字符串返回。

    我在这个类中使用了初始化代码块来初始化这个属性。

{

           resultMap = new HashMap<>();

  }

     这个不是必须的,因为你可以在子类中去初始化它。但是最好还是在这儿去初始化它,可以避免在子类忘记初始化而造成的空指针异常。无论如何你在使用resultMap属性之前都要初始化它。

UserLoginAction

import java.util.Map;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.json.annotations.JSON;

import com.gyb.struts04.action.JsonAction;

@Namespace("/user")
public class UserLoginAction extends JsonAction {
	private static final long serialVersionUID = 1L;
	
	@Action(value="/login")
	@Override
	public String execute() throws Exception {
		resultMap.put("hello", "world");
		resultMap.put("data", new Integer[] {1,2,3});
		return SUCCESS;
	}
	
	@JSON(name="rs")
	public Map<Object, Object> getResultMap() {
		return resultMap;
	}
	
}

    解释:

  • @Namespace(“/user”)

        这个注解相当于在struts.xml中配置package节点的namespace属性,值为/user。

  • @Action(value="/login")

      这个注解相当于在struts.xml中配置action节点的name属性,值为/login。

      我们需要这样访问这个Action类:http://localhost:8080/[项目名]/user/login

  •   更重要的一步:

         我们需要重写父类中的getResultMap()方法。否则无法将json数据返回到前台。

         我们在这个方法上加上了@JSON(name="rs")注解,目的是将其序列化为JSON格式的数据,并由Struts2返回。

         我们在execute()方法中向resultMapput了几个元素。这些数据最终都会返回到前台。任何需要返回到前台的数据都可以放入resultMap对象。

测试运行:

启动项目,在浏览器中访问:http://localhost:8080/[项目名]/user/login,将看到下面的JSON数据:

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章