租书时最重要的功能就是根据类型查找书籍,书籍类型又分为一级分类和二级分类。实现该功能要:
⑴打开主页面时,页面直接跳出分类信息,这就要通过ajax传送Json类型数据。⑵在后台查询分类信息时,myBatis使用到一对多查询。
图下为效果图。
接下来讲述详细过程。
数据库设计:
⑴每一个类别都有一个父类,FATHERCATEGORY字段,是CATEGORYNO的外键,自表相连。
⑵若这个类别为父类,则它的FATHERCATEGORY为null;若为子类,则FATHERCATEGORY为相对应的父类主码。
CREATE TABLE `category` (
`CATEGORYNO` varchar(5) NOT NULL,
`CATEGORYNAME` varchar(10) NOT NULL,
`FATHERCATEGORY` varchar(5) DEFAULT NULL,
PRIMARY KEY (`CATEGORYNO`),
KEY `FK1` (`FATHERCATEGORY`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
实体类 Category.java:
public class Category {
private String categoryNo;
private String categoryName;
private String fathercategoryno;
private List<Category> soncategory;
public String getCategoryNo() {
return categoryNo;
}
public void setCategoryNo(String categoryNo) {
this.categoryNo = categoryNo;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public String getFathercategoryno() {
return fathercategoryno;
}
public void setFathercategoryno(String fathercategoryno) {
this.fathercategoryno = fathercategoryno;
}
public List<Category> getSoncategory() {
return soncategory;
}
public void setSoncategory(List<Category> soncategory) {
this.soncategory = soncategory;
}
}
mybatis数据库查找分类信息:
<resultMap type="Category" id="categoryMap">
<id column="categoryno" property="categoryNo"/>
<result column="categoryname" property="categoryName"/>
<result column="fathercategory" property="fathercategoryno"/>
<collection property="soncategory" ofType="Category" column="fathercategory">
</collection>
</resultMap>
其中子元素表示数据库中主码与实体类中元素的对应关系;表示数据库中普通字段与实体类中元素的对应关系;表示List类型,property表示实体类中对应元素,ofType表示对应元素的类型,column表示两者相关联的外键。
例:实体类中private List soncategory
学习于http://www.cnblogs.com/fsjohnhuang/p/4076592.html
查询:
<!-- 查询所有父分类 -->
<select id="searchAllcategory" resultType="Category">
select * from Category where fathercategory is null
</select>
<!-- 根据父分类查询子分类 -->
<select id="searchByFather" resultMap="categoryMap" parameterType="String">
select * from Category where fathercategory=#{fathercategoryno}
</select>
查询后通过action将数据传送到页面。
先看struts.xml
<package name="main" namespace="/main" extends="struts-default,json-default">
<action name="CategoryAction" class="com.gyt.frame.Action.CategoryAction">
<result name="failure">/Pages/Ables/User/msg.jsp</result>
<result type="json">
<param name="root">result</param>
</result>
</action>
</package>
这里一定要继承json-default,并且要引入struts2-json-plugin-2.3.16.3.jar包。
CategoryAction.java.
@Controller
@Scope("prototype")
public class CategoryAction extends ActionSupport {
@Autowired
private CategoryService categoryservice;
private String result;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public CategoryService getCategoryservice() {
return categoryservice;
}
public void setCategoryservice(CategoryService categoryservice) {
this.categoryservice = categoryservice;
}
public String execute(){
System.out.println("categoryAction执行");
List<Category> list=new ArrayList<Category>();
list=categoryservice.searchAllcategory();
for(int i=0;i<list.size();i++){
List<Category> li=new ArrayList<Category>();
// System.out.println("category:"+list.get(i).getCategoryName());
li=categoryservice.searchByFather(list.get(i).getCategoryNo());
list.get(i).setSoncategory(li);
}
JSONArray jArray = new JSONArray();
for(int i=0;i<list.size();i++){
JSONObject json = new JSONObject();
json=JSONObject.fromObject(list.get(i));
jArray.add(json);
}
result=jArray.toString();
return "success";
}
}
这里需引入Json相关的jar包。不需要通过request向页面传送数据。直接通过struts配置文件即可。
页面ajax:
$.ajax({
type:"POST", //请求方式
url:"/SecondBooks/main/CategoryAction", //请求路径
cache: false,
async:false,
data:{method:"execute"},//传参
dataType: 'json', //返回值类型
success:function(result){
//data为返回的json字符串,这里转对象
var json = eval("(" + result + ")");
//alert(json);
//alert(111);
bar.colorStyle = 4;
bar.config.imgDir = "Pages/Users/img/";
bar.config.radioButton=true;
for(i in json){
//alert(222);
for(j in json[i].soncategory){
//alert(result[i].soncategory[j]);
var categ=json[i].soncategory[j].categoryNo;
bar.add(json[i].categoryName,json[i].soncategory[j].categoryName,"/SecondBooks/main/categorynoBook?currtentPage=1&categoryno="+categ, "body");
//alert(categ);
}
//var me1=msg[i];
}
}
});
这里的重点是将json转为对象才能获取到数据。