1. 程式人生 > >Struts2中通過Ajax傳遞json數據

Struts2中通過Ajax傳遞json數據

conf status port fault catch struts-2 execute 3.6 轉換

1、導入Struts2所需要的jar包

下載Struts2的jar包時,可以下載struts-2.5.13-min-lib.zip,然後放到項目的/WebContent/WEB-INF/lib路徑下
struts-2.5.13-min-lib只包含以下jar包:
  commons-fileupload-1.3.3.jar

  commons-io-2.5.jar

  commons-lang3-3.6.jar

  freemarker-2.3.23.jar

  javassist-3.20.0-GA.jar

  ognl-3.1.15.jar

  struts2-core-2.5.13.jar

2、導入操作json數據所需要的jar包

  commons-collections-3.2.2.jar

  commons-lang-2.4.jar

  ezmorph-1.0.6.jar

  json-lib-2.3-jdk15.jar

  struts2-json-plugin-2.5.13.jar

  commons-benautils-1.8.3.jar

3、在web.xml文件中添加filter

(配置文件內容可以在下載的struts2文件的\struts-2.5.13-all\struts-2.5.13-all-lib\src\apps\showcase\src\main\webapp\WEB-INF路徑下找到示例文件web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">

    <filter
> <filter-name>struts-prepare</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareFilter</filter-class> </filter> <filter> <filter-name>struts-execute</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsExecuteFilter</filter-class> </filter>
<filter-mapping> <filter-name>struts-prepare</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts-execute</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

4、在src目錄下創建struts.xml文件

(配置文件內容可以在下載的struts文件的\struts-2.5.13-all\struts-2.5.13-all-lib\src\apps\showcase\src\main\resources下找到示例文件struts.xml)

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="Login" extends="struts-default,json-default"> <!-- 需要繼承struts-default和json-default -->
        <action name="login">
            <result>/login.jsp</result>
        </action>
        <action name="loginaction" class="com.hpe.struts.LoginAction">
            <result type="json"><!-- 返回的數據類型為json -->
                <param name="res">data</param><!-- 這個地方的data就是在LoginAction中定義的data,它必須要有getter、setter,這樣就可以將data傳遞到前臺頁面上,LoginAction類中所有具有getter的字段都會被封裝到一個類中,傳遞到前臺  {"data":"{\"msg\":\"登錄成功!\",\"status\":\"1\"}","mmp":2000} -->
            </result>
        </action>
    </package>
</struts> 

5、LoginAction類

public class LoginAction extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;
    private Map<String, String> map = new HashMap<String, String>();
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    UserService service = new UserService();

    public String execute() throws IOException {
     // 獲取HttpSession對象 HttpSession session
= ServletActionContext.getRequest().getSession();
     // 獲取用戶輸入的驗證碼 
String veryCode = request.getParameter("veryCode").toString(); try { // 判斷驗證碼
       // 獲取session中的驗證碼
Object code = session.getAttribute("verycode"); if (code == null || !veryCode.toLowerCase().equals(code.toString().toLowerCase())) {
          // 保存狀態碼和狀態信息 map.put(
"status", "0"); map.put("msg", "驗證碼錯誤!");
          // 將Map對象裝換為JSONObject對象,然後轉換為String類型,保存,並傳遞至前臺頁面 data
= JSONObject.fromObject(map).toString();
          return SUCCESS; }
// 判斷用戶名和密碼
       String name = request.getParameter("name").toString();
       String pwd = request.getParameter("pwd").toString();
       User u = service.login(name, pwd);
if (u != null) { session.setAttribute("user", u); map.put("status", "1"); map.put("msg", "登錄成功!"); data = JSONObject.fromObject(map).toString(); } else { map.put("status", "-1"); map.put("msg", "用戶名或密碼錯誤!"); data = JSONObject.fromObject(map).toString(); } } catch (SQLException e) { map.put("status", "-2"); map.put("msg", "登錄異常:" + e.getMessage()); data = JSONObject.fromObject(map).toString(); } return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }

6、通過JQuery實現異步訪問

function login() {
        var name = $(‘#name‘).val();
        var pwd = $(‘#pwd‘).val();
        var vcode = $(‘#vcode‘).val();
        $.ajax({
            url : "/MyEasyBuy/loginaction",
            type : "post",
            data : {
                "name" : name,
                "pwd" : pwd,
                "veryCode" : vcode
            },
            dataType : "json",
            success : function(res) {// 此時獲取到的res是一個Object類型的對象

                // 將對象轉化為json字符串
                alert(JSON.stringify(res));// {"data":"{\"msg\":\"登錄成功!\",\"status\":\"1\"}"}
                // res對象的data屬性
                alert(res.data);// {"msg":"登錄成功!","status":"1"}
                // 將res對象的data屬性轉化為json對象
                var obj = eval("(" + res.data + ")");
                alert(obj.msg);// 登錄成功!

                // 錯誤
                // var obj2 = eval("{" + res.data + "}");
                // alert(obj2.msg);
                // alert(res.data.msg); // undefined
                // alert(JSON.parse(res.data).msg);// 登錄成功!
                // res已經是一個對象,不能再次將其轉換為json對象
                // alert(JSON.parse(res)); // 將json字符串轉換為json對象
            },
            err : function() {
                alert("error");
            }
        });
    }

在調試過程中,一直提示一些錯誤,如下圖所示:

技術分享

當struts.devMode設置為true時,html表單數據中出現和action中屬性名不匹配的參數名時就會提示錯誤,這個沒有什麽影響,只是為了便於使用者調試。

可以在strust.xml文件中將struts.devMode屬性設置為false就可以了。

Struts2中通過Ajax傳遞json數據