u4 day03

u4 day03

index.jsp页面

  1. 访问地址中若不想输入项目名称,在web工程中pom.xml端口号下方加path

    [TOC]

    1.分页查询

    1.1 接口

/**
	 * 分页查询商品信息
	 * @param pageNow		当前页码
	 * @param pageSize		每页显示的信息条数
	 * @return				一页信息
	 * 注意导入pageHelper依赖
	 */
	PageInfo<EasybuyProduct> getProductPages(Integer pageNow,Integer pageSize);

1.2 common工程中,pager类

<!--实现serializable接口-->
属性:	private Integer pageCount;		//总的页数
	private Long count;			//总的信息条数
	private String url;				//当前要跳转的url地址
	private Integer currentPage;	//当前页码
	private Integer pageSize;		//每页显示的信息条数
	
	
方法:public Integer getPageCount() {
		//直接将计算的结果返回
		this.pageCount =  (int)(count / pageSize);
		if(count % pageSize != 0){
			pageCount++;
		}
		return pageCount;
	}
	...省略getter setter

1.3 接口实现类

@Override
	public PageInfo<EasybuyProduct> getProductPages(Integer pageNow, Integer pageSize) {
		if(pageNow == null){
			pageNow = 1;		//默认是显示第一页
		}
		if(pageSize == null){
			pageSize = 8;		//默认每页展示8条信息
		}
		//开始分页
		PageHelper.startPage(pageNow, pageSize);
		//查询所有的商品
		EasybuyProductExample example = new EasybuyProductExample();
		//id进行降序排序
		example.setOrderByClause("id desc");
		List<EasybuyProduct> list = easybuyProductMapper.selectByExample(example);
		//转换成pageInfo对象
		PageInfo<EasybuyProduct> pageInfo = new PageInfo<>(list);
		return pageInfo;
	}

1.4控制层 controller


	/**
	 * 进入到商品管理页面
	 */
	@RequestMapping(value="/product/list",method=RequestMethod.GET)
	public String productList(@RequestParam(name="currentPage",required=false,defaultValue="1") Integer pageNow,
			@RequestParam(name="pageSize",required=false,defaultValue="8")Integer pageSize,
			Model model){
		//获取到商品列表
		PageInfo<EasybuyProduct> pageInfo = productService.getProductPages(pageNow, pageSize);
		model.addAttribute("productList", pageInfo.getList());
		Pager pager = new Pager();
		pager.setCurrentPage(pageNow);
		pager.setCount(pageInfo.getTotal());
		pager.setPageSize(pageSize);
		pager.setUrl("product/list?1=1");
		model.addAttribute("pager", pager);
		model.addAttribute("menu", 5);
		return "productList";
	}

2.新增

由jsp页面的需求–>controller需要传入的对象–>在接口中编写方法得到需要的对象–>相应的实现类

2.1 接口

public interface ProductCategoryService {
	/**
	 * 根据父id查询分类列表
	 * @param parentId
	 * @return
	 */
	List<EasybuyProductCategory> getByParentId(Integer parentId);
    	/*
	 * 上架商品
	 */
	EasyBuyResult saveProduct(EasybuyProduct product);
}

2.2 接口实现类

//显示分级目录
@Service
public class ProductCategoryServiceImpl implements ProductCategoryService{
	@Autowired
	private EasybuyProductCategoryMapper easybuyProductCategoryMapper;
	@Override
	public List<EasybuyProductCategory> getByParentId(Integer parentId) {
		EasybuyProductCategoryExample example = new EasybuyProductCategoryExample();
		Criteria criteria = example.createCriteria();
		criteria.andParentidEqualTo(parentId);
		List<EasybuyProductCategory> list = easybuyProductCategoryMapper.selectByExample(example);
		return list;
	}

}
//productServiceImpl.java
@Service
public class ProductCategoryServiceImpl implements
ProductServic{
	@Override
	public EasyBuyResult saveProduct(EasybuyProduct product) {
		try {
			if(product.getId() == null){
				//做的是上架操作
				//新添加的商品默认是上架的
				product.setIsdelete(0);
				easybuyProductMapper.insert(product);
			} else {
				//做的是修改操作
				easybuyProductMapper.updateByPrimaryKey(product);
			}
			
			return EasyBuyResult.ok();
		} catch (Exception e) {
			e.printStackTrace();
			return EasyBuyResult.build(500, "商品上架是失败");
		}
		
	}
}

2.3 dubbo服务 ProductCategoryService接口的暴露

<dubbo:service interface="com.kgc.service.ProductCategoryService" ref="productCategoryServiceImpl"></dubbo:service>

2.4 springmvc.xml dubbo服务的引用

<dubbo:reference interface="com.kgc.service.ProductCategoryService" id="productCategoryService"></dubbo:reference>

2.5 common工程中添加 EasyBuyResult.java

package com.kgc.common.pojo;

import java.io.Serializable;
import java.util.List;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class EasyBuyResult implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	// 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    // 响应业务状态
    private Integer status;

    // 响应消息
    private String msg;

    // 响应中的数据
    private Object data;

    public static EasyBuyResult build(Integer status, String msg, Object data) {
        return new EasyBuyResult(status, msg, data);
    }

    public static EasyBuyResult ok(Object data) {
        return new EasyBuyResult(data);
    }

    public static EasyBuyResult ok() {
        return new EasyBuyResult(null);
    }

    public EasyBuyResult() {

    }

    public static EasyBuyResult build(Integer status, String msg) {
        return new EasyBuyResult(status, msg, null);
    }

    public EasyBuyResult(Integer status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public EasyBuyResult(Object data) {
        this.status = 200;
        this.msg = "OK";
        this.data = data;
    }

//    public Boolean isOK() {
//        return this.status == 200;
//    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    /**
     * 将json结果集转化为EasyBuyResult对象
     * 
     * @param jsonData json数据
     * @param clazz EasyBuyResult中的object类型
     * @return
     */
    public static EasyBuyResult formatToPojo(String jsonData, Class<?> clazz) {
        try {
            if (clazz == null) {
                return MAPPER.readValue(jsonData, EasyBuyResult.class);
            }
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (clazz != null) {
                if (data.isObject()) {
                    obj = MAPPER.readValue(data.traverse(), clazz);
                } else if (data.isTextual()) {
                    obj = MAPPER.readValue(data.asText(), clazz);
                }
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 没有object对象的转化
     * 
     * @param json
     * @return
     */
    public static EasyBuyResult format(String json) {
        try {
            return MAPPER.readValue(json, EasyBuyResult.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Object是集合转化
     * 
     * @param jsonData json数据
     * @param clazz 集合中的类型
     * @return
     */
    public static EasyBuyResult formatToList(String jsonData, Class<?> clazz) {
        try {
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (data.isArray() && data.size() > 0) {
                obj = MAPPER.readValue(data.traverse(),
                        MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }
}

2.6 控制层 controller

@Autowired
	private ProductCategoryService productCategoryService;

/**
	 * 进入到商品上架,显示一级分类
	 */
	@RequestMapping(value="/product/toadd",method=RequestMethod.GET)
	public String toadd(Model model){
		//查询一级分类
		List<EasybuyProductCategory> productCategoryList1 = productCategoryService.getByParentId(0);
		//传递一级分类到商品添加页面
		model.addAttribute("productCategoryList1",productCategoryList1);
		model.addAttribute("menu", 6);
		return "toAddProduct";
	}
	
	/**
	 * 进入到商品上架,通过父级分类,查得当前分类
	 */
	                             @RequestMapping(value="/queryProductCategoryList",method=RequestMethod.POST)
	@ResponseBody
	public EasyBuyResult queryProductCategoryList(@RequestParam("parentId")Integer parentId){
		try {
			//查询下级分类
			List<EasybuyProductCategory> productCategoryList2 = productCategoryService.getByParentId(parentId);
			//传递下级分类到商品添加页面
			return new EasyBuyResult(productCategoryList2);
		} catch (Exception e) {
			e.printStackTrace();
			return EasyBuyResult.build(400, "查询分类失败");
		}
		
	}
/**
	 * 将商品添加到数据库中
	 */
	@RequestMapping("/product/add")
	public String add(EasybuyProduct easybuyProduct,Model model){
		//添加到数据库中
		EasyBuyResult result = productService.saveProduct(easybuyProduct);
		if(result.getStatus() == 200){
			//成功
		} else {
			//失败
		}
		model.addAttribute("menu", 6);
		//我就不做处理了,直接成功后返回到添加页面
		return "toAddProduct";
	}

3. 图片上传(采用fastDFS分布式文件系统)

见doc文档

3.1 安装图片服务器虚拟机

3.2 将fastdfs_client war包导入工作空间

3.3 web工程中导入dfs依赖

3 .4 web工程中添加properties/fdfs_conf.conf文件 写入tracker服务器的地址

3.5 封装后的图片上传

3.5.1 将FastDFSClient.java放入common工程中
3.5.2 导入fastDFS依赖

3.6 封装前后变化

<!--封装前测试图片上传-->
@Test
	public void testUpload() throws Exception{
		//1.导入fastDFS的jar包依赖
		//2.加载配置文件,配置文件的内容就是tracker服务器的地址
		ClientGlobal.init("E:\\k8507WorkSpace\\easybuy-manager-web\\src\\main\\resources\\properties\\fdfs_conf.conf");
		//3.创建TrackerClient对象
		TrackerClient trackerClient = new TrackerClient();
		//4.创建tackerService对象
		TrackerServer trackerServer = trackerClient.getConnection();
		//5.创建StrageServer对象
		StorageServer storageServer = null;
		//6.创建StroageClient对象
		StorageClient storageClient = new StorageClient(trackerServer, storageServer);
		//7.使用storageClient实现图片的上传
		String[] strings = storageClient.upload_file("D:/img.jpg", "jpg", null);
		//8.遍历字符串数组,得到group和文件名
		for (String string : strings) {
			System.out.println(string);
		}
	}
	<!--封装后测试图片上传-->
	@Test
	public void testFastDFSUp2() throws Exception{
		FastDFSClient client = new FastDFSClient("E:\\k8507WorkSpace\\easybuy-manager-web\\src\\main\\resources\\properties\\fdfs_conf.conf");
		String str = client.uploadFile("D:/img.jpg");
		System.out.println("封装后文件上传" + str);
	}

4 富文本编辑器(kindeditor)使用

1.将kindeditor资源文件放入webapp

2.在新增页面(toAddProduct.jsp)引入kindeditor.js文件

<!--toAddProduct.jsp-->
<script charset="utf-8" src="/kindeditor-4.1.10/kindeditor.js"></script>

3.在textarea标签中增加属性,将其升级为富文本编辑器

<!--toAddProduct.jsp-->
<textarea name="description"  id="editor_id">${product.description}</textarea>

4. 加载kindeditor

<!--toAddProduct.jsp-->
<script>
KindEditor.ready(function(K) {
			var editor1 = K.create('textarea[name="description"]', {
				allowFileManager : true, //允许文件编辑
				height : "200px", //编辑器的高度为100px
				allowImageUpload:true,		//允许上传图片
				uploadJson:'/pic/upload',	//定义了上传图片的url地址
				filePostName  : "uploadFile",  //指定上传文件参数名称
				afterUpload:function(){this.sync();},	//图片上传成功后同步到textarea中
			});
		});
</script>

5. 图片上传按钮

5.1 jsp页面
<!--toAddProduct.jsp-->
<script>
	$(function(){
			$("#onPicUpload").click(function(){
				var _self = $(this);
				KindEditor.editor({
					//指定上传文件参数名称
					filePostName  : "uploadFile",
					//指定上传文件请求的url。
					uploadJson : '/pic/upload',
					//上传类型,分别为image、flash、media、file
					dir : "image"
				}).loadPlugin('image', function() {
					this.plugin.imageDialog({
						showRemote : false,
						clickFn : function(url, title, width, height, border, align) {
							//var input = _self.siblings("input");
							//input.parent().find("img").remove();
							$("input[name=filename]").val(url);
							$("#onPicUpload").after("<a href='"+url+"' target='_blank'><img src='"+url+"' width='80' height='50'/></a>");
							this.hideDialog();
						}
					});
				});
			});
		})
</script>    
5.2 PictureController.java
//PictureController.java
package org.java.controller;

import java.util.HashMap;
import java.util.Map;

import org.java.common.utils.FastDFSClient;
import org.springframework.stereotype.Controller;
/**
 * 专用图片上传到fastDFS服务器
 * @author yan
 *
 */
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class PictureController {
	@RequestMapping("/pic/upload")
	@ResponseBody
	public Map<String, Object> upload(MultipartFile uploadFile){
		Map<String, Object> map = new HashMap<>();
		try {
			FastDFSClient client = new FastDFSClient("classpath:properties/fdfs_conf.conf");
			//获取到原始的文件名
			String oldName = uploadFile.getOriginalFilename();
			//获取到扩展名(a.b.jpg)
			String extName = oldName.substring(oldName.lastIndexOf(".") + 1);
			//上传到fastDFS服务器
			String url = client.uploadFile(uploadFile.getBytes(), extName);
			//在url的前面添加服务器的地址
			url = "http://192.168.25.133/" + url;
			map.put("url", url);
			map.put("error", 0);
			return map;
		} catch (Exception e) {
			e.printStackTrace();
			map.put("error", 1);
			map.put("message", "图片上传失败");
			return map;
		}
	}
}

5.3 web/pom.xml文件中添加文件上传组件 commons-fileupload 和commons-io
5.4 springmvc.xml中 配置附件解析器
<!--springmvc.xml-->
</bean>
	<!-- 配置附件解析器 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 允许上传文件的最大值:1G -->
		<property name="maxUploadSize" value="1073741824"></property>
	</bean>

6.进入修改页面

//PictureController.java
/**
	 * 进入到修改商品界面
	 */
	@RequestMapping(value="/product/toupdate",method=RequestMethod.GET)
	public String toupdate(Model model,@RequestParam("id") Integer id){
		//实现左边栏选中项目变红的效果
		model.addAttribute("menu", 6);
		//根据id查询商品对象
		EasybuyProduct product = productService.getById(id);
		model.addAttribute("product", product);
		
		//查询当前商品的一级分类
		List<EasybuyProductCategory> productCategoryList1 = productCategoryService.getByParentId(0);
		//查询当前商品的二级分类列表
		List<EasybuyProductCategory> productCategoryList2 = productCategoryService.getByParentId(product.getCategorylevel1id());
		//查询当前商品的三级分类列表
		List<EasybuyProductCategory> productCategoryList3 = productCategoryService.getByParentId(product.getCategorylevel2id());
		//传递一级分类到商品添加页面
		model.addAttribute("productCategoryList1",productCategoryList1);
		model.addAttribute("productCategoryList2",productCategoryList2);
		model.addAttribute("productCategoryList3",productCategoryList3);
		//进入修改商品的界面
		return "toAddProduct";
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值