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数据: