在完成前面的准备工作之后,开始对业务进行开发了,首先从后台的分类管理开始进行开发,后台的模块可以分为下图几点
当我们访问后台的首页时
是直接去访问admin_category_list,这是请求会被SpringMVC拦截到,由DispatcherServlet去分发请求,这时就会去到CategoryController下并执行list()方法
CategoryController类如下
package com.how2java.tmall.controller;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.how2java.tmall.pojo.Category;
import com.how2java.tmall.service.CategoryService;
import com.how2java.tmall.util.ImageUtil;
import com.how2java.tmall.util.Page;
import com.how2java.tmall.util.UploadedImageFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
@Controller
@RequestMapping("")
public class CategoryController {
@Autowired
CategoryService categoryService;
@RequestMapping("admin_category_list")
public String list(Model model,Page page){
PageHelper.offsetPage(page.getStart(),page.getCount());
List<Category> cs= categoryService.list();
int total=(int) new PageInfo<>(cs).getTotal();
page.setTotal(total);
model.addAttribute("cs", cs);
model.addAttribute("page", page);
return "admin/listCategory";
}
@RequestMapping("admin_category_add")
public String add(Category c, HttpSession session, UploadedImageFile uploadedImageFile) throws IOException {
System.out.println(c.getId());
categoryService.add(c);
System.out.println(c.getId());
File imageFolder= new File(session.getServletContext().getRealPath("img/category"));
File file = new File(imageFolder,c.getId()+".jpg");
if(!file.getParentFile().exists())
file.getParentFile().mkdirs();
System.out.println(uploadedImageFile);
System.out.println(uploadedImageFile.getImage());
System.out.println(file);
uploadedImageFile.getImage().transferTo(file);
BufferedImage img = ImageUtil.change2jpg(file);
ImageIO.write(img, "jpg", file);
return "redirect:/admin_category_list";
}
@RequestMapping("admin_category_delete")
public String delete(int id,HttpSession session)throws IOException{
categoryService.delete(id);
File imageFolder=new File(session.getServletContext().getRealPath("img/category"));
File file=new File(imageFolder,id+".jpg");
file.delete();
return "redirect:/admin_category_list";
}
@RequestMapping("admin_category_edit")
public String edit(int id,Model model){
Category c=categoryService.get(id);
model.addAttribute("c",c);
return "admin/editCategory";
}
@RequestMapping("admin_category_update")
public String update(Category c, HttpSession session, UploadedImageFile uploadedImageFile) throws IOException {
categoryService.update(c);
MultipartFile image = uploadedImageFile.getImage();
if(null!=image &&!image.isEmpty()){
File imageFolder= new File(session.getServletContext().getRealPath("img/category"));
File file = new File(imageFolder,c.getId()+".jpg");
image.transferTo(file);
BufferedImage img = ImageUtil.change2jpg(file);
ImageIO.write(img, "jpg", file);
}
return "redirect:/admin_category_list";
}
}
1.Spring的IOC注入
@Autowired
CategoryService categoryService;
2.用了mybatis逆向工程,DAO层很多工作Mybatis已经帮我们完成了,直接拿到sevice层就可以使用了
CategoryService提供了一套CURD的操作
package com.how2java.tmall.service;
import com.how2java.tmall.pojo.Category;
import java.util.List;
public interface CategoryService{
List<Category> list();
void add(Category category);
void delete(int id);
Category get(int id);
void update(Category category);
}
CategoryServiceImpl类
package com.how2java.tmall.service.impl;
import com.how2java.tmall.mapper.CategoryMapper;
import com.how2java.tmall.pojo.Category;
import com.how2java.tmall.pojo.CategoryExample;
import com.how2java.tmall.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CategoryServiceImpl implements CategoryService {
@Autowired
CategoryMapper categoryMapper;
@Override
public List<Category> list() {
CategoryExample example =new CategoryExample();
example.setOrderByClause("id desc");
return categoryMapper.selectByExample(example);
}
@Override
public void add(Category category) {
categoryMapper.insert(category);
}
@Override
public void delete(int id) {
categoryMapper.deleteByPrimaryKey(id);
}
@Override
public Category get(int id) {
return categoryMapper.selectByPrimaryKey(id);
}
@Override
public void update(Category category) {
categoryMapper.updateByPrimaryKeySelective(category);
}
}
以上就是caegory业务类的实现
回到list()方法中
@RequestMapping("admin_category_list")
public String list(Model model,Page page){
PageHelper.offsetPage(page.getStart(),page.getCount());
List<Category> cs= categoryService.list();
int total=(int) new PageInfo<>(cs).getTotal();
page.setTotal(total);
model.addAttribute("cs", cs);
model.addAttribute("page", page);
return "admin/listCategory";
}
这里用到了一个开源插件PageHelper,用于分页查询,用categoryService.list()将分类查询出来后,还要查询出分类的总数,用于分页操作,将分类和分页信息放入model中,跳转到listCategort.jsp中
这里因为我们在SpringMVC.xml中配置了视图定位
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
prefix意思是前缀,suffix是后缀,那么最后return “admin/listCategory”意思就是
跳转到/WEB-INF/JSP/admin/listCategory.jsp
在listCategory.jsp中用EL表达式将数据去除
listCategory.jsp代码片段
<c:forEach items="${cs}" var="c">
<tr>
<td>${c.id}</td>
<td><img height="40px" src="img/category/${c.id}.jpg"></td>
<td>${c.name}</td>
<td><a href="admin_property_list?cid=${c.id}"><span class="glyphicon glyphicon-th-list"></span></a></td>
<td><a href="admin_product_list?cid=${c.id}"><span class="glyphicon glyphicon-shopping-cart"></span></a></td>
<td><a href="admin_category_edit?id=${c.id}"><span class="glyphicon glyphicon-edit"></span></a></td>
<td><a deleteLink="true" href="admin_category_delete?id=${c.id}"><span class=" glyphicon glyphicon-trash"></span></a></td>
</tr>
</c:forEach>