Как вернуть значения JSON в качестве объекта базы данных в Hibernate Struts - PullRequest
1 голос
/ 06 марта 2012

Я вернулся с еще одной сложной вещью.На этот раз я не знаю, прав ли я.

Я должен вернуть данные из базы данных как объект json.В этом объекте json я возвращаю некоторые значения, которые являются внешним ключом с другими таблицами в базе данных.Я правильно получил значения из базы данных, и теперь я хочу перебрать значения ключей forien из моего успеха ajax, используя тег iterate struts.Можно выполнить итерацию, если мы можем выполнить итерацию значений 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>

, и этот код, который у меня есть здесь, предназначен для первой страницы, и если пользователь нажимает для второй страницы, я должен перечислить вторую страницудля пользователя, и мы должны сделать это в ajax, заполнив значения JSON.Моя проблема в том, как мне написать такой итератор, как этот, если я получаю ответ как ajax?

Вот мой класс действий

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;
    }

Я не добавил объявление переменной, а также методы установки и полученияВот.А вот моя функция 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 голосов
/ 07 марта 2012

Это будет работа с моей стороны ...

Краткий ответ на ваш вопрос: нет. То есть вы не можете одновременно вернуть 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;
    }
}

Объяснение вышесказанного:

При реализации нашего действия Preparable Struts2 вызовет метод подготовки, использующий набор doctorService doctorProducts. Обратите внимание, насколько чистым является намерение Действие, когда все, что связано с управлением «Доктор», было переведено в его собственный класс обслуживания, включая управление транзакциями.

Далее обратите внимание, что наш класс создает два действия, одно из которых использует тип результата json. Результат json сериализует наш список в JSON для нас.

Здесь использовалась какая-то магия внедрения зависимостей, но вы могли бы так же легко использовать метод prepare и factory.

Кроме того, аннотации охватывают то, что требуется, нет необходимости в каком-либо xml, однако есть необходимость в jar-файле struts2 -tionstions-plugin и фляге struts2-json-plugin.

Итак ... вам нужно откатить и перестроить свое действие, чтобы получить желаемую функциональность, потому что в настоящее время у вас есть список строк json, который вы не хотите записывать в jsps.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...