Strut2 Ajax JSON Demo

一、背景

由于项目的需要重拾Struts,做的时候发现好多东西都忘了,写一个小小的demo,就花了大半天,还好最后终于调通了。

场景描述:前段页面输入用户名,后端将用户名和其他信息通过Ajax以Json的格式回传回来

使用工具:IDE:Myeclipse2014,服务器:Apache-tomcat-7.0.57,Struts-2.3.20及其lib,jQuery:jquery-1.11.2.min.js

需要引入的Struts包:两者需要的包有共同的地方,注意不要重复引入

  Struts所需的包:

    commons-fileupload-x.y.z.jar

    commons-io-x.y.z.jar

    commons-lang.x.y.jar

    commons-lang3.y.jar

    commons-logging-x.y.z.jar

    commons-logging-api-x.y.jar

    freemarker-x.y.z.jar

    javassist-.xy.z.GA

    ognl.jar

    struts2-core.jar

    xwork-core.jar

  JSON需要的包:

    commons-collections.jar

    commons-lang.jar

    commons-beanutils.jar

    commons-logging.jar

    ezmorph.jar

    json-lib.jar

    struts-json-plugin.jar

二、页面代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>Welcome Login</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script type="text/javascript" src="./javascript/jquery-1.11.2.min.js"></script>
<!--此处引用jQuery-->

<!-- 此段为Ajax与后端交互部分--> <script type="text/javascript"> $(document).ready(function(){ $("#usrname").change(function(){ $("logtip").empty(); $.ajax({ url : "login", // 后台处理程序,对应Action type : "post", // 数据发送方式 dataType : "json", // 接受数据格式 data:{ usrname : $("#usrname").val() }, // 要传递的数据 // 回传函数 timeout:20000, // 设置请求超时时间(毫秒)。 error: function () { //请求失败时调用函数。 $("#logtip").html("请求失败!"); }, success:function(dataObj){ //请求成功后回调函数。 //alert(dataObj); str = jQuery.parseJSON(dataObj); $("#echoname").html(str.usrname); $("#echowd").html(str.passwd); } }); }); }); </script> </head> <body> <div> 欢迎进入Struts2.3的世界 </div> <div> <div> <span>账号:</span> <span><input type="text" name="usrname" id="usrname"/></span> <span id="logtip"></span> </div> <div> <span>账号:</span> <span id="echoname"></span> <span>密码: </span> <span id="echowd"></span> </div> </div> </body> </html>

 

三、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.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="Check" namespace="/" extends="json-default">
        <action name="login" class="demo.ajax.login.LoginAction" method="execute">
            <result type="json">
                <param name="root">result</param>
            </result>
        </action>
    </package>


    <!-- Add packages here -->

</struts>

1、result中type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用ajax的callback方法. 返回json数据。

  我的做法是将map转换成了json格式的字符串,使用 root 参数返回的格式为  {"passwd":"success", "usrname":"love"},可以使用 jQuery.parseJSON 解析

2、根对象在JSON中数据添加一个”root”标识。如果要使用它,Action必须遵循以下几点:

   1)返回的页面类型中”content-type”必须是”application/json”;

   2)JSON内容必须是符合格式要求的;

   3)Action中field必须有public的set方法(是不是没有set方法就不会将field添加到JSON数据中,有待验证);

   4)它支持的类型有: 基本类型(int,long...String), Date, List, Map, Primitive Arrays, 其它class, 对象数组;

   5)在JSON中任何的Object会被封装在list或map中,数据会被封装程Long,如果是含有的数据则会被封装程Double,数组会被封装程List。

3、除了root参数,另外还有includeProperties 参数,excludeProperties 参数,具体情况请查看参考文章中的 《struts2学习——struts2与json》

 

四、java代码

package demo.ajax.login;

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

import net.sf.json.JSONObject;

public class LoginAction {
    private String usrname;
    private String result;
    
    
    public String execute(){
        String passwd="success";
        Map map = new HashMap();
        map.put("usrname", usrname);
        map.put("passwd", passwd);
        
        System.out.println(usrname);
        
     /*此处将map转换为json格式的String类型*/ JSONObject jsonObj
= JSONObject.fromObject(map); result = jsonObj.toString(); return "success"; } public String getUsrname() { return usrname; } public void setUsrname(String usrname) { this.usrname = usrname; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } }

 

四、遇到的问题与总结

 

五、参考文章

struts2学习——struts2与json   http://huing.blog.51cto.com/1669631/1286327

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。