Design and Implementation of an Online Course Purchase System(11)

Complete the function of course list search

Posted by Chen Xingxu on June 3, 2020

易课寄在线购课系统开发笔记(十一)–完成课程列表查询的功能

展示后台首页

功能分析

请求的url:/

参数:无

返回值:逻辑视图String

Controller

package cn.ecourses.controller;
//页面跳转Controller
@Controller
public class PageController {

	@RequestMapping("/")
	public String showIndex() {
		return "index";
	}
	
	@RequestMapping("/{page}")
	public String showPage(@PathVariable String page) {
		return page;
	}
}

整合静态页面及分析

整合静态页面

把静态页面添加到 ecourses-bms-web 工程中的 WEB-INF 下。

由于在 web.xml 中定义的 url 拦截形式为 “/” 表示拦截所有的 url 请求,包括静态资源例如 css、js 等。所以需要在 springmvc.xml 中添加资源映射标签:

<!-- 配置资源映射 -->
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>

课程列表页面

对应的 jsp 为:item-list.jsp

请求的url:/item/list

请求的参数:page=1&rows=30

响应的 json 数据格式:

Easyui 中 datagrid 控件要求的数据格式为:{total:”2”,rows:[{“id”:”1”,”name”:”张三”},{“id”:”2”,”name”:”李四”}]}

响应的 json 数据格式 EasyUIResult

package cn.ecourses.common.pojo;
public class EasyUIDataGridResult implements Serializable {

	private long total;
	private List rows;
	public long getTotal() {
		return total;
	}
	public void setTotal(long total) {
		this.total = total;
	}
	public List getRows() {
		return rows;
	}
	public void setRows(List rows) {
		this.rows = rows;
	}
}

分页处理

逆向工程生成的代码是不支持分页处理的,如果想进行分页需要自己编写 mapper,这样就失去逆向工程的意义了。为了提高开发效率可以使用 MyBatis 的分页插件 PageHelper。

分页插件 PageHelper

MyBatis 分页插件 - PageHelper 说明

使用 MyBatis,建议尝试该分页插件,这个一定是最方便使用的分页插件之一。该插件目前支持Oracle, Mysql, MariaDB, SQLite, Hsqldb, PostgreSQL 六种数据库分页。

使用方法

把 PageHelper 依赖的 jar 包添加到工程中。官方提供的代码对逆向工程支持的不好,建议使用 pagehelper-fix。

pagehelper-3.4.2-fix.jar

在 MyBatis 的 xml 中配置拦截器插件:

<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->       
        <property name="dialect" value="mysql"/>
    </plugin>
</plugins>

在代码中使用:

1、设置分页信息:

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List<Country> list = countryMapper.selectIf(1);

2、取分页信息

//分页后,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,
Page<Country> listCountry = (Page<Country>)list;
listCountry.getTotal();

3、取分页信息的第二种方法

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());

Service层

参数:int page ,int rows

业务逻辑:查询所有课程列表,要进行分页处理。

返回值:EasyUIDataGridResult

@Override
public EasyUIDataGridResult getItemList(int page, int rows) {
    //设置分页信息
    PageHelper.startPage(page, rows);
    //执行查询
    EcoursesItemExample example = new EcoursesItemExample();
    List<EcoursesItem> list = itemMapper.selectByExample(example);
    //创建一个返回值对象
    EasyUIDataGridResult result = new EasyUIDataGridResult();
    result.setRows(list);
    //取分页结果
    PageInfo<EcoursesItem> pageInfo = new PageInfo<>(list);
    //取总记录数
    long total = pageInfo.getTotal();
    result.setTotal(total);
    return result;
}

发布服务

在 applicationContext-service.xml 中发布服务

可以设置服务超时时间,服务调用超时时间默认 1 秒。

<dubbo:service interface="cn.ecourses.service.ItemService" ref="itemServiceImpl" timeout="600000"/>

表现层

在 springmvc.xml 中引用服务

<dubbo:reference interface="cn.ecourses.service.ItemService" id="itemService" />
  1. 初始化表格请求的 url:/item/list
  2. Datagrid 默认请求参数:
    1. page:当前的页码,从1开始。
    2. rows:每页显示的记录数。
  3. 响应的数据:json数据。EasyUIDataGridResult
@RequestMapping("/item/list")
@ResponseBody
public EasyUIDataGridResult getItemList(Integer page, Integer rows) {
    //调用服务查询商品列表
    EasyUIDataGridResult result = itemService.getItemList(page, rows);
    return result;
}