【问题标题】:Struts 2 get Json from DAO into the action classStruts 2 从 DAO 获取 Json 进入动作类
【发布时间】:2015-08-12 12:44:58
【问题描述】:

我有一些独特的可能理解问题。我有 jQuery Ajax 调用,它调用 Struts2 动作类,后者又调用 DAO 来获取一些数据。但是由于某种原因,当我在操作类中添加 DAO 操作时,我没有得到任何数据或任何错误,只是一个空白响应。出了点问题,我需要一些眼睛来告诉我出了什么问题,

这是我的 ajax 调用,

 $.ajax({
            url: "S2",
            //force to handle it as text
            dataType: 'json',
            type: 'GET',
            cache: false,
            contentType: "application/json;charset=utf-8",
            data:{state_code:state_code },
            beforeSend: function (xhr, setting) {
                var url = setting.url;
                url = url.replace("&_=", "&t=");
                setting.url = url;
                },
            success: function (data) {              
                console.log(JSON.stringify(data));
            }
        });

这是我的 DAO 类,

public List<BnGetCitiesbyStateCodeBn> GetCitiesbyStateCode(String state_code) throws SQLException {
        List<BnGetCitiesbyStateCodeBn> cities = new LinkedList<>();
        if (dbConnection != null) {
            Statement stmt = dbConnection.createStatement();

            try {
                rs = stmt.executeQuery("select Distinct(city) from cities_extended WHERE state_code = '" + state_code + "'");
                while (rs.next()) {
                    BnGetCitiesbyStateCodeBn city = null;
                    city = new BnGetCitiesbyStateCodeBn();
                    city.setState_code(rs.getString("state_code"));
                    city.setCity(rs.getString("city"));
                    cities.add(city);
                    logger.info("Cities retreived are " + cities);
                    System.out.println(cities);
                }
            } catch (Exception e) {
                logger.info("Error retreving Cities " + e);
            } finally {
                dbConnection.close();
            }
        }
        return cities;

    }

这是我的动作类,

public class S2 extends ActionSupport {

    private static final long serialVersionUID = 5686197289029560661L;
    private static final Logger logger = LogManager.getLogger(S2.class);
    private String state_code;
    private String t;
    private List<BnGetCitiesbyStateCodeBn> cities;

    public S2() {
    }

    public void setState_code(String state_code) {
        this.state_code = state_code;
    }

    public String getT() {
        return t;
    }

    public void setT(String t) {
        this.t = t;
    }

    public List<BnGetCitiesbyStateCodeBn> getCities() {
        return cities;
    }

    public void setCities(List<BnGetCitiesbyStateCodeBn> cities) {
        this.cities = cities;
    }

    public String getState_code() {
        logger.info("State code is " + state_code);
        return state_code;
    }

    @Override
    public String execute() {
        try {
            GetCitiesbyStateCode citydao = new GetCitiesbyStateCode();
            cities = citydao.GetCitiesbyStateCode(state_code);
            System.out.println(cities);
        } catch (SQLException ex) {
            logger.error(ex);
            System.out.println(ex);
        }
        logger.info("log4j2 works for Struts Method.Inside Execute Method of S2 Action Class");
         System.out.println("Inside action class");
        return "success";
    }
}

这是我的 struts xml,

 <package name="json" namespace="/" extends="json-default">  
     <action name="S2" class="json.S2" method="execute">
            <result type="json"></result>
        </action>
    </package>

这是我的豆子,

public class BnGetCitiesbyStateCodeBn {
    private String city;
    private String state_code;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState_code() {
        return state_code;
    }

    public void setState_code(String state_code) {
        this.state_code = state_code;
    }
}

每当我注释掉对我的 DAO 的调用时,我都会收到 json 响应,并且一切都像 log4j2 等一样工作,但是当我取消注释该部分时,我得到空白响应。所以我猜测我的 json 配置可能缺少一些东西.

如果有人可以看一下并告诉我,不胜感激。

好的,我想我找到了原因,

logger.info("state code in dao class is " + state_code);
                try {
                    rs = stmt.executeQuery("select Distinct city,state_code from cities_extended WHERE state_code = 'AL'");
                } catch (SQLException ex) {
                    logger.error("SQL Exception executing query" +ex);
                }

当我从 ui 传递 state_code 时,它会变得一团糟,当我硬编码像 AL 这样的值时,它给我的结果非常好。参数名称中的下划线有什么害处吗?

【问题讨论】:

  • 我没有在我和 Andrea 的这篇文章中看到我之前的 cmets。有人删除了 cmets 吗?。
  • 你确定你的dao返回的不是空列表吗?
  • 检查亚历山大。很快就会通知你。上次我检查它工作正常。但让我再检查一次。

标签: java jquery sql json struts2


【解决方案1】:

您应该在该行得到 SQL 异常

rs = stmt.executeQuery("select Distinct(city) from cities_extended WHERE state_code = '" + state_code + "'");

distinct 不是一个函数,它是一个语句,参见定义和示例用法here。您需要修改查询

rs = stmt.executeQuery("select Distinct city from cities_extended WHERE state_code = '" + state_code + "'");

在此更改之后,一切都应该像 log4j2 等一样工作。

【讨论】:

  • 是的,我确实得到了 SQL 异常。我正在修复它并重试。
  • 感谢 Roman,我认为是由于错误的 sql 或参数命名问题,刚刚进行了一些更新。请在帖子顶部查看。
  • 尤里卡,我终于在 Json 中得到了所有的回复......糟糕的查询花了将近一天的时间。谢谢罗曼。欣赏它。下一个任务现在在 jquery 对话框中进行布局。
  • 这是另一个错误,但为了玩得开心,您说 我得到了 json 响应,一切正常。错误出现在 beforeSend 函数中,您可以在其中更改参数名称。这些名称应绑定到操作类以填充参数值。我不确定参数名称的问题,但它们应该遵循 JavaBeans 约定,并且为了便于阅读和使用 Java 代码约定,请使用驼峰式。
  • 我在 action 类 state_code 和 t 中也有这个,如果你查看 query 和 dao 类,有一个列我没有获取结果并将其添加到列表中。也解决了这个问题。有时在 myphp 和 netbeans 之间来回切换会产生混乱的体验。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多