如何在struts hibernate中将json值作为数据库对象返回

时间:2012-03-06 14:39:43

标签: json hibernate struts2

我回来了一件更复杂的事情。这次我不知道我的逻辑是否正确。

我必须将数据库中的数据作为json对象返回。在这个json对象中,我返回了一些值,这些值是数据库中其他表的外键。我从数据库中正确获取了值,现在我想使用struts iterate标记从我的ajax成功迭代forien键值。如果我们可以迭代一个对象的json值,可以迭代,如果我是正确的,请分享这个想法。

<s:iterator value="listdoctorProducts" status="st" >
            <div class="productListing">
                <h3><span><s:property value="inventory.name" /></span> - <s:property value="inventory.description" /> </h3>
                    <div class="productDtlLeft">
                        <s:iterator value="inventory.pronovaInventories" >
                            <img src="images/pronova/products/<s:property value="image" />" width="31" height="94" alt="" />
                        </s:iterator>                        
                    </div>     
                    <s:iterator value="inventory.productRatings" status="st">
                        <s:if test="(#st.index+1)==1">
                            <s:set var="no2" value="rating" /> 
                        </s:if>
                        <s:else>
                            <s:set var="no2" value="#no2+rating" /> 
                        </s:else>
                        <s:set var="count" value="#st.index+1" /> 
                    </s:iterator>
                     <s:set var="aver" value="%{#no2*10/#count}"/>
                     <s:set var="result" value="#aver*1.0/10"/>
                    <div class="productDtlRight">
                        <div class="ratting">
                            <div class="rattingStar">bg</div>
                            <div class="rattingOrange" style="width:<s:property value="(#result/5)*100"/>%;">bg</div>
                        </div>

                        <span>(<s:property value="#aver*1.0/10"/>)</span>
                        <div class="clear"></div>
                        <s:set var="no2" value="0" /> 
                        <s:bean name="com.zoondia.common.calculationBean" var="decCalBeansuggestedPrice">
                            <s:param name="valueOne" value="retailPrice"/>                                                             
                            <s:param name="decimalPlace">#.##</s:param>
                        </s:bean>
                        <h4>$<s:property value="#decCalBeansuggestedPrice.decimalPointConversionResult" /></h4>
                        <a class="addtoCart" href="javaScript:void(0)">View All</a>
                   </div>
                   <div class="clear"></div>
                </div>
        </s:iterator> 

在这个jsp页面中你可以看到我在listdoctorProducts中有一个数据库对象列表,我可以通过访问这个来获取productRating表的值

<s:iterator value="inventory.productRatings" status="st">
                            <s:if test="(#st.index+1)==1">
                                <s:set var="no2" value="rating" /> 
                            </s:if>

这个我列出的代码是第一页,如果用户点击第二页,我必须列出用户的第二页,我们需要通过填充json值在ajax中执行此操作。我的问题是,如果我将响应检索为ajax,我怎么能写这样的迭代器?

这是我的Action类

public String getEcommerceWidgetFourJson(){
        try{            
            Doctor DtObj = null;
            Map sessionSingleDoctor = ActionContext.getContext().getSession();
            Object Obj = null;
            Obj = sessionSingleDoctor.get("Doctor");
            DtObj = (Doctor) Obj;
            int totalCount = DoctorDao.getInstance().totalNumberOfdoctorToProductsForJson(DtObj.getId());
            numberOfRowsPerPage = Integer.parseInt(getText("ecommerce.widget.product.list.four"));
            totalNumberOfRows = (int)Math.ceil((float)totalCount/numberOfRowsPerPage);
            if(pageNum < 1){
                pageNum = 1;
            }else if(pageNum > lastRows){
                pageNum = lastRows;
            }
            listdoctorProducts = DoctorDao.getInstance().getDoctorProductsAsJson(DtObj.getId(),numberOfRowsPerPage,pageNum);



        }catch(Exception e){
            e.printStackTrace();
        }
        return SUCCESS;
    }

我没有在这里添加变量声明和setter以及getter。这是我的Dao函数,我从中访问数据库中的数据

public List<DoctorToProducts> getDoctorProductsAsJson(int DocId,int numberOfRowsPerPage, int pageNum){
        List<DoctorToProducts> dp = null;
        DoctorToProducts ldp = null;
        SessionFactory sessionFactory =
                    (SessionFactory) ServletActionContext.getServletContext().getAttribute(HibernateListener.KEY_NAME);
        Session Hibernatesession = sessionFactory.openSession();
        Hibernatesession.beginTransaction(); 
        Query  q = (Query) Hibernatesession.createQuery("select id,inventory.id,doctor.id,inventory.pronovaInventories,retailPrice,unitCreditValue from DoctorToProducts where doctor.id="+DocId);
        q.setFirstResult((pageNum-1)*numberOfRowsPerPage);
        q.setMaxResults(numberOfRowsPerPage);
        dp = q.list();
        Hibernatesession.getTransaction().commit();
        Hibernatesession.flush();
        return dp;
    }

我的struts.xml是

<action name="frPdtListPagination" class="com.zoondia.action.DoctorPdtsPagination" method="getEcommerceWidgetFourJson">
            <result  type="json">                

            </result>
        </action>

只需为此json调用添加操作。

1 个答案:

答案 0 :(得分:0)

这对我来说是猜测工作......

你的问题的简短回答是:不。那就是不能同时返回json并迭代你动作中的对象,因为它的设置方式会产生有意义的结果。

让我们改变设置,这样答案就变成了答案。这是未经测试的快速版本:

//Not tested, this is just an example of what you can do
package com.quaternion.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;

public class DoctorActions extends ActionSupport implements Preparable {
    @Autowired DoctorService doctorService; //injected from spring
    List<String> doctorProducts;

    @Override
    public void prepare() {
        doctorProducts = doctorService.getProducts();
    }

    @Action(results = {
        @Result(type = "json", params = {
            "includeProperties",
            "doctorProducts"})
    })
    public String DoctorJsonProducts() {
        return SUCCESS;
    }

    @Action
    public String DoctorProducts(){
        return SUCCESS;
    }
}

以上解释:

通过我们的Action实现Preparable struts2将调用使用doctorService设置的doctorProducts的prepare方法。请注意,当与Doctor管理有关的所有内容都已移入其自己的服务类(包括事务管理)时,Action的意图变得多么干净。

接下来请注意,我们的类会创建两个动作,其中一个动作使用json结果类型。 json结果将我们的列表序列化为JSON。

这里使用了某种依赖注入魔法,但你可以轻松地使用prepare方法和工厂。

此外,注释涵盖了不需要任何xml所需的内容,但是需要struts2-conventions-plugin jar和struts2-json-plugin jar。

所以......你需要回溯并重建你的动作以获得你想要的功能,因为你现在有一个json字符串列表,而不是你想写入你的jsps。