ssm项目第三天记录手稿
1.分页:
1.1.引入分页依赖:
<!--分页依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
1.2.applicationContext.xml:
<!-- 把交给IOC管理 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 传入PageHelper的插件 -->
<property name="plugins">
<array>
<!-- 传入插件的对象 -->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--改为自己用的数据库-->
<prop key="helperDialect">oracle</prop>
<!--reasonable为true为了使页数不会越界,即点首页的上一页和尾页的下一页不会出错跳到别的地方-->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
1.3.应用
OrdersServiceImpl类:
@Autowired
private IOrdersDao ordersDao;
@Override
public List<Orders> findAll(Integer page,Integer pageSize) {
//一点要用在查询所有的方法上面,中间不可有其他代码,page总页数,pageSize每页记录条数
PageHelper.startPage(page,pageSize);
return ordersDao.findAll();
}
1.4.查看哪一页和设置每页多少条记录数是从前端发出的请求,因此在查看订单管理时在aside.jsp中设置默认的首页序号和每页记录条数如下:
<li id="system-setting"><a
href="${pageContext.request.contextPath}/orders/findAll.do?page=1&pageSize=4"> <i
class="fa fa-circle-o"></i> 订单管理
</a></li>
特别注意:page=1&pageSize=4
是有讲究的,page和pageSize是连接controller端的关键,page和pageSize作为参数在前端请求的参数和后端使用的请求参数名称要一致,如下:
controller类:@RequestParam(name = "page",required = true ,defaultValue = "1") Integer page, @RequestParam(name = "pageSize" , required = true , defaultValue = "10") Integer pageSize
中的name的值分别与page=1&pageSize=4
对应且相同,建议书写时复制粘贴。
@Autowired
private IOrdersService ordersService;
@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(name = "page",required = true ,defaultValue = "1") Integer page,
@RequestParam(name = "pageSize" , required = true , defaultValue = "10") Integer pageSize){
System.out.println("测试"+page+""+pageSize);
ModelAndView mv = new ModelAndView();
List<Orders> ps = ordersService.findAll(page,pageSize);
PageInfo pageInfo = new PageInfo(ps);
mv.addObject("pageInfo",pageInfo);
mv.setViewName("orders-page-list1");
return mv;
}
1.5.上示代码中的PageInfo类的了解:
属性介绍:
{pageNum=1,当前页码
pageSize=1,每页个数
size=1,当前页个数
startRow=1,由第几条开始
endRow=1,到第几条结束
total=3,总条数
pages=3,总页数
list=Page{count=true, pageNum=1, pageSize=1, startRow=0, endRow=1, total=3, pages=3, reasonable=false, pageSizeZero=false}[com.zhiyou.zt.bean.Users@6572421],当前页数据
prePage=0,上一页
nextPage=2,下一页
isFirstPage=true,是否为首页
isLastPage=false,是否为尾页
hasPreviousPage=false,是否有上一页
hasNextPage=true,是否有下一页
navigatePages=8,每页显示的页码个数
navigateFirstPage=1,首页
navigateLastPage=3,尾页
navigatepageNums=[1, 2, 3]}页码数
使用心得:由
list=Page{count=true, pageNum=1, pageSize=1, startRow=0, endRow=1, total=3, pages=3, reasonable=false, pageSizeZero=false}[com.zhiyou.zt.bean.Users@6572421],当前页数据
prePage=0,上一页
nextPage=2,下一页
以及上面的其他属性的值以及项目经验,一旦在前端请求了一个诸如查询所有的请求,在controller使用PageInfo对象将page,pageSize
封装后,该PageInfo对象其他属性值就会自动根据page,pageSize
的值生成,同时前端直接通过对象.属性值就可以获得相应的值,后面介绍,代码:
@Autowired
private IOrdersService ordersService;
@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(name = "page",required = true ,defaultValue = "1") Integer page,
@RequestParam(name = "pageSize" , required = true , defaultValue = "10") Integer pageSize){
System.out.println("测试"+page+""+pageSize);
ModelAndView mv = new ModelAndView();
List<Orders> ps = ordersService.findAll(page,pageSize);
PageInfo pageInfo = new PageInfo(ps);
mv.addObject("pageInfo",pageInfo);
mv.setViewName("orders-page-list1");
return mv;
}
主要是:
List<Orders> ps = ordersService.findAll(page,pageSize);
PageInfo pageInfo = new PageInfo(ps);
//下面的"pageInfo"中的值就是pageInfo对应在前端的对象映射,前端直接利用"pageInfo"中的值.就可以获得该对象的属性值。
mv.addObject("pageInfo",pageInfo);
**还有及其重要的一点就是List<Orders> ps = ordersService.findAll(page,pageSize);
中的ps就是pageInfo对象中的属性list。**因此在orders-page-list1.jsp中的遍历:
<c:forEach items="${pageInfo.list}" var="orders">
<tr>
<td><input name="ids" type="checkbox"></td>
<td>${orders.id }</td>
<td>${orders.orderNum }</td>
<td>${orders.product.productName }</td>
<td>${orders.product.productPrice }</td>
<td>${orders.orderTimeStr }</td>
<td class="text-center">${orders.orderStatusStr }</td>
<td class="text-center">
<button type="button" class="btn bg-olive btn-xs">订单</button>
<button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
<button type="button" class="btn bg-olive btn-xs">编辑</button>
</td>
</tr>
1.6.页数跳转:
特别注意参数不能用错
<div class="box-tools pull-right">
<ul class="pagination">
<li>
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&pageSize=${pageInfo.pageSize}" aria-label="Previous">首页</a>
</li>
<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum-1}&pageSize=${pageInfo.pageSize}">上一页</a></li>
<c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&pageSize=${pageInfo.pageSize}">${pageNum}</a></li>
</c:forEach>
<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum+1}&pageSize=${pageInfo.pageSize}">下一页</a></li>
<li>
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&pageSize=${pageInfo.pageSize}" aria-label="Next">尾页</a>
</li>
</ul>
</div>
</div>
1.7.每页记录数的设置:
注意id = "changePageSize"
不可缺,至于缺漏出现的后果我忘了,原因是changePageSize()函数用到这个变量。
<div class="box-footer">
<div class="pull-left">
<div class="form-group form-inline">
总共2 页,共14 条数据。 每页
<select class="form-control" id = "changePageSize" onchange="changePageSize()">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select> 条
</div>
</div>
<script>
function changePageSize() {
//获取下拉框的值,这就是上面说changePageSize不可缺的原因
var pageSize = $("#changePageSize").val();
//向服务器发送请求,改变每页显示条数
location.href = "${pageContext.request.contextPath}/orders/findAll.do?page=1&pageSize="
+ pageSize;
}
$(document).ready(function() {
// 选择框
$(".select2").select2();
// WYSIHTML5编辑器
$(".textarea").wysihtml5({
locale : 'zh-CN'
});
});
</script>
2.订单详情:
2.1.前端请求
点击每个订单的详情,是根据每个订单的id查询其他关联信息的,因此传参${orders.id}
。
orders-page-list1:
<button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
2.2.后端各层代码
controller:
@Autowired
private IOrdersService ordersService;
@RequestMapping("/findById.do")
public ModelAndView findById(@RequestParam(name = "id" , required = true) String ordersID){
ModelAndView mv = new ModelAndView();
Orders orders = ordersService.findById(ordersID);
mv.addObject("orders",orders);
mv.setViewName("orders-show");
return mv;
}
service实现类:
@Autowired
private IOrdersDao ordersDao;
@Override
public Orders findById(String ordersID){
return ordersDao.findById(ordersID);
}
dao类:
@Select("select * from orders where id=#{ordersID}")
@Results({
@Result(id=true,column = "id",property = "id"),//bug,注意此处column = "id"就是最后一个@Result中的column = "id"
@Result(column = "orderNum",property = "orderNum"),
@Result(column = "orderTime",property = "orderTime"),
@Result(column = "orderStatus",property = "orderStatus"),
@Result(column = "peopleCount",property = "peopleCount"),
@Result(column = "payType",property = "payType"),
@Result(column = "orderDesc",property = "orderDesc"),
/*在一对一和一对多中,
在IProductDao的findById方法中要穿String id参数并且方法返回值取决于property的类型值;
方法的返回值与javaType对应;
column填写的内容是查询结果的依据,也就是根据什么查询所得结果;
property填写的是查询的结果在主表中的对应的实体属性名称。*/
@Result(column = "productId",property = "product",javaType = Product.class,one = @One(select = "edu.xlh.ssm.dao.IProductDao.findById")),
@Result(column = "memberId",property = "member",javaType = Member.class,one = @One(select = "edu.xlh.ssm.dao.IMemberDao.findById")),
@Result(column = "id",property = "travellers",javaType = java.util.List.class,many = @Many(select = "edu.xlh.ssm.dao.ITravellerDao.findById"))
})
public Orders findById(String ordersID);
其他相关dao类操作;
IProductDao:
//根据方法中的参数id来查
@Select("select * from product where id = #{id}")
public Product findById(String id);
IMemberDao:
@Select("select * from member where id=#{id}")
public Member findById(String id);
ITravellerDao:
/*在多对多的关联关系中,常常拆解成一对多(使用一个中间表将两个表的主键作为组合主键),此例以订单表为主表,为一,旅客表为副表,为多,在旅客表中没有与订单表关联的关系,因此通过订单表id到中间表中查询对应多个旅客id,再根据旅客id查询对应旅客信息。*/
@Select("select * from traveller where id in(select travellerId from order_traveller where orderId=#{ordersId})")
public List<Traveller> findById(String ordersId);