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數據: