我回来了一件更复杂的事情。这次我不知道我的逻辑是否正确。
我必须将数据库中的数据作为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调用添加操作。
答案 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。