java web练习项目
这是2018年在学校学习做出来的项目,现在放出来,仅仅是回顾一下,内容比较一般,我水平比较差,就是跟老师打出来(当然我有根据自己的理解写一些代码)。先来看一下效果图。
展示页面涉及的分类,页面定位,及后台对前端的增删改都是亲测有效的。有任何想问的,别问(反正我不是大牛)。
环境配置
环境的配置是比较麻烦的,小白要下载很多东西:
- apache-tomcat-8.5.61,记得下8的,这个老师说是好用。
- JDK1.8.
- Dom4j-2.1到2.5, jQuery,Ajax依赖包
- eclipse java jee。
注意安装的是这个,版本号新旧都无所谓吧idea用户也没问题的。
5.还有注意将eclipse 和tomcat整合,这样就方便多了。
实际上依赖包我都下好了放这里,你们下载就可以了
所有文件的位置我都截图了。
xml文件存放信息。
(painting.xml)
获取文档信息及增删改
(XmlDataSource.java)
package com.MOBA.utils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* 数据源类,用于讲XML文件解析为Java对象
*/
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import com.MOBA.entity.Painting;
import com.sun.corba.se.spi.ior.Writeable;
/*数据源类,用于将XML解析为java对象*/
public class XmlDataSource {
// static静态关键字保证数据全局唯一
private static List<Painting> data = new ArrayList();// 这个泛型用来装Painting里面传来的数据。
private static String dataFile;// 这个用来读取文件路径
static {
// painting.xml文件完整物理地址
dataFile = XmlDataSource.class.getResource("/painting.xml").getPath();// 这里就需要dom4j依赖的支持了,我偶尔也会选错支持。
reload();// 重载,每次打开网页就刷新一次的意思
}
private static void reload() {
URLDecoder decoder = new URLDecoder();// 对中文字符进行编码
try {
decoder.decode(dataFile, "UTF-8");// 编码对象正是datafile存着的路径对应的文件
/* System.out.println(dataFile); */// 用来测试输出路径是否正确,实际上一般都不会有错。
// 利用Dom4j对XML进行解析
SAXReader reader = new SAXReader();
// 1. 获取Document文档对象
Document document = reader.read(dataFile);// 读取文件的内容,存进document里面
// 2.Xpath得到XML节点集合
List<Node> nodes = document.selectNodes("/root/painting");// 添加在一个泛型里面,里面有string和integer
data.clear();// 每次重载就清空一次内存。
for (Node node : nodes) {// 对皮肤的内容进行设置然后添加进data里面
Element element = (Element) node;
String id = element.attributeValue("id");
String pname = element.elementText("pname");
Painting painting = new Painting();// 这个页面里的东西都是大一大二学java的那些。相信不看你都猜得出该写啥。
painting.setId(Integer.parseInt(id));
painting.setPname(pname);
painting.setCategory(Integer.parseInt(element.elementText("category")));// 需要强制转换才能得到integer,因为实际需要读取的不是string
painting.setPrice(Integer.parseInt(element.elementText("price")));
painting.setPreview(element.elementText("preview"));
painting.setDescription(element.elementText("description"));
data.add(painting);// 清空后自然就要重新装进去。
// System.out.println(id+":" + pname);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取所有油画Painting对象
*
* @return Painting List
*/
public static List<Painting> getRawData() {
return data;// 返回装在data里面的内容
}
/**
* 追加新的油画数据
*
* @param painting Painting实体对象
*/
public static void append(Painting painting) {
// 1.读取XML文档,得到Document对象
SAXReader reader = new SAXReader();
Writer writer = null;
try {
Document document = reader.read(dataFile);// 将读取到的文件路径放read读取,注意这里是将painting的结点读进去,数据存放 。
Element root = document.getRootElement();// 获得xml文件中的根节点<root>
Element p = root.addElement("painting");// 2.在<root>节点下,创建新的<painting>节点
// 3.创建painting节点的各个子节点
p.addAttribute("id", String.valueOf(data.size() + 1));//属性设置后就可以对<painting>节点下的内容进行添加了
p.addElement("pname").setText(painting.getPname());
p.addElement("category").setText(painting.getCategory().toString());
p.addElement("price").setText(painting.getPrice().toString());
p.addElement("preview").setText(painting.getPreview());
p.addElement("description").setText(painting.getDescription());
// 4.写入XML,完成追加操作
writer = new OutputStreamWriter(new FileOutputStream(dataFile), "UTF-8");// 件文件写入的同时,utf-8解决中文乱码的问题
document.write(writer);// 写进文件里。
// System.out.println(dataFile);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
reload();// 内存与文件数据一致
}
}
/**
* 更新对应id的XML皮肤数据
*
* @param painting 要更新的皮肤数据
* @throws IOException
*/
public static void update(Painting painting) {
SAXReader reader = new SAXReader();
Writer writer = null;
try {
Document document = reader.read(dataFile);
// 节点路径[@属性名=属性值]
// /root/painting[@id=x]
List<Node> nodes = document.selectNodes("/root/painting[@id=" + painting.getId() + "]");//找到对应的id
if (nodes.size() == 0) {
throw new RuntimeException("id=" + painting.getId() + "编号油画不存在");
}
Element p = (Element) nodes.get(0);//获得这个id里面的内容
p.selectSingleNode("pname").setText(painting.getPname());
p.selectSingleNode("category").setText(painting.getCategory().toString());
p.selectSingleNode("price").setText(painting.getPrice().toString());
p.selectSingleNode("preview").setText(painting.getPreview());
p.selectSingleNode("description").setText(painting.getDescription());
writer = new OutputStreamWriter(new FileOutputStream(dataFile), "UTF-8");
document.write(writer);
System.out.println(dataFile);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();//写完后自然是关闭这个功能接口
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
reload();//写完后也需要重新载入
}
}
/**
* 按id号删除XML皮肤数据
*
* @param id 皮肤id
* @throws IOException
*/
public static void delete(Integer id) {
SAXReader reader = new SAXReader();
Writer writer = null;
try {
Document document = reader.read(dataFile);
List<Node> nodes = document.selectNodes("/root/painting[@id=" + id + "]");
if (nodes.size() == 0) {
throw new RuntimeException("id=" + id + "编号油画不存在");
}
Element p = (Element) nodes.get(0);
p.getParent().remove(p);
writer = new OutputStreamWriter(new FileOutputStream(dataFile), "UTF-8");
document.write(writer);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
reload();
}
}
/*
* public static void main(String[] args) { new XmlDataSource();
*
* List<Painting> ps = XmlDataSource.getRawData(); System.out.println(ps);
*
*
*
* Painting p = new Painting(); p.setPname("测试画面"); p.setCategory(1);
* p.setPrice(4000); p.setPreview("/upload/10.jpg"); p.setDescription("测试画面描述");
* XmlDataSource.append(p);
*
*
* }
*/
}
Painting的类加载
package com.MOBA.entity;
public class Painting {//javaBean
private Integer id;//油画编号
private String pname;//名称
private Integer category;//分类 1-现实主义 2-抽象主义
private Integer price; //价格
private String preview;//油画图片地址
private String description;//描述
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Integer getCategory() {
return category;
}
public void setCategory(Integer category) {
this.category = category;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public String getPreview() {
return preview;
}
public void setPreview(String preview) {
this.preview = preview;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
对于页面的处理
package com.MOBA.utils;
import java.util.ArrayList;
import java.util.List;
public class PageModel {
private int page;//页号
private int totalPages;//总页数
private int rows;//每页记录数
private int totalRows;//总记录数
private int pageStartRow;//当前页从第n行开始
private int pageEndRow;//当前页到n行结束
private boolean hasNextPage;//是否存在下一页
private boolean hasPreviousPage;//是否存在上一页
private List pageData;//当前页面数据
public PageModel() {
}
/**
* 初始化PageModel对象,计算分页属性
* @param data 原始数据集合
* @param page 页号
* @param rows 每页记录数
*/
public PageModel(List data,int page,int rows) {
this.page = page;
this.rows = rows;
totalRows = data.size();
//总页数计算规则: 总行数/每页记录数,能整除页数取整,不能整除向上取整
//例如: 18/6=3 | 20/6≈3.33 向上取整=4
//Math.ceil 浮点数向上取整 Math.floor 浮点数向下取整
//20/6≈3.33 20/6=3 ,注意事项:Java中两个整数相除只会得到结果整数部分,需转为浮点数运算
totalPages = new Double(Math.ceil(totalRows/(rows * 1f))).intValue();
pageStartRow = (page-1) * rows;//0
pageEndRow = page * rows;//6
//totalRows:20 | totalPage:4 | rows:6
//pageEndRow=4*6=24>20 执行subList()抛出下标越界异常
if(pageEndRow>totalRows) {//避免下标越界异常
pageEndRow=totalRows;
}
pageData = data.subList(pageStartRow, pageEndRow);//得到分页数据
if(page>1) {//判断是否存在上一页
hasPreviousPage = true;
}else {
hasPreviousPage = false;
}
if(page<totalPages) {//判断是否存在下一页
hasNextPage = true;
}else {
hasNextPage = false;
}
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getPageStartRow() {
return pageStartRow;
}
public void setPageStartRow(int pageStartRow) {
this.pageStartRow = pageStartRow;
}
public int getPageEndRow() {
return pageEndRow;
}
public void setPageEndRow(int pageEndRow) {
this.pageEndRow = pageEndRow;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public List getPageData() {
return pageData;
}
public void setPageData(List pageData) {
this.pageData = pageData;
}
public static void main(String[] args) {
List sample = new ArrayList();
for(int i = 1 ; i<= 100 ; i++) {
sample.add(i);
}
PageModel pageModel = new PageModel(sample, 6, 8);
System.out.println(pageModel.getPageData());
System.out.println(pageModel.getTotalPages());
System.out.println(pageModel.getPageStartRow() + ":" + pageModel.getPageEndRow());
}
}
页面的处理
package com.MOBA.controller;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.MOBA.entity.Painting;
import com.MOBA.service.PaintingService;
import com.MOBA.utils.PageModel;
/**
* Servlet implementation class ManagementController
*/
@WebServlet("/management")
public class ManagementController extends HttpServlet {
private PaintingService paintingService = new PaintingService();//获取页面信息
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ManagementController() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//通过method参数区分不同的操作
String method = request.getParameter("method");
if(method.equals("list")) {//分页查询列表
this.list(request,response);
}else if(method.equals("delete")) {
this.delete(request,response);
}else if(method.equals("show_create")) {//显示新增页面
this.showCreatePage(request,response);
}else if(method.equals("create")) {
this.create(request, response);
}else if(method.equals("show_update")) {
this.showUpdatePage(request,response);
}else if(method.equals("update")) {
this.update(request,response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
//分页查询列表
private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String p = request.getParameter("p");
String r = request.getParameter("r");
if(p==null) {
p = "1";
}
if(r==null) {
r = "6";
}
PageModel pageModel = paintingService.pagination(Integer.parseInt(p),Integer.parseInt(r));
request.setAttribute("pageModel", pageModel);
request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);
}
//显示新增页面
private void showCreatePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/create.jsp").forward(request, response);
}
//新增油画方法
private void create(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//文件上传时的数据处理与标准表单完全不同
/*
String pname = request.getParameter("pname");
System.out.println(pname);
*/
//1. 初始化FileUpload组件
FileItemFactory factory = new DiskFileItemFactory();
/**
* FileItemFactory 用于将前端表单的数据转换为一个个FileItem对象
* ServletFileUpload 则是为FileUpload组件提供Java web的Http请求解析
*/
ServletFileUpload sf = new ServletFileUpload(factory);
//2. 遍历所有FileItem
try {
List<FileItem> formData = sf.parseRequest(request);
Painting painting = new Painting();
for(FileItem fi:formData) {
if(fi.isFormField()) {
System.out.println("普通输入项:" + fi.getFieldName() + ":" + fi.getString("UTF-8"));
switch (fi.getFieldName()) {
case "pname":
painting.setPname(fi.getString("UTF-8"));
break;
case "category":
painting.setCategory(Integer.parseInt(fi.getString("UTF-8")));
break;
case "price":
painting.setPrice(Integer.parseInt(fi.getString("UTF-8")));
break;
case "description":
painting.setDescription(fi.getString("UTF-8"));
break;
default:
break;
}
}else {
System.out.println("文件上传项:" + fi.getFieldName());
//3.文件保存到服务器目录
String path = request.getServletContext().getRealPath("/upload");
System.out.println("上传文件目录:" + path);
//String fileName = "test.jpg";
String fileName = UUID.randomUUID().toString();
//fi.getName()得到原始文件名,截取最后一个.后所有字符串,例如:wxml.jpg->.jpg
String suffix = fi.getName().substring(fi.getName().lastIndexOf("."));
//fi.write()写入目标文件
fi.write(new File(path,fileName + suffix));
painting.setPreview("/upload/" + fileName + suffix);
}
}
paintingService.create(painting);//新增功能
response.sendRedirect("/management?method=list");//返回列表页
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 显示更新页面
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void showUpdatePage(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
Painting painting = paintingService.findById(Integer.parseInt(id));
request.setAttribute("painting", painting);
request.getRequestDispatcher("/WEB-INF/jsp/update.jsp").forward(request, response);
}
/**
* 实现油画更新
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void update(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
int isPreviewModified = 0;
//文件上传时的数据处理与标准表单完全不同
/*
String pname = request.getParameter("pname");
System.out.println(pname);
*/
//1. 初始化FileUpload组件
FileItemFactory factory = new DiskFileItemFactory();
/**
* FileItemFactory 用于将前端表单的数据转换为一个个FileItem对象
* ServletFileUpload 则是为FileUpload组件提供Java web的Http请求解析
*/
ServletFileUpload sf = new ServletFileUpload(factory);
//2. 遍历所有FileItem
try {
List<FileItem> formData = sf.parseRequest(request);
Painting painting = new Painting();
for(FileItem fi:formData) {
if(fi.isFormField()) {
System.out.println("普通输入项:" + fi.getFieldName() + ":" + fi.getString("UTF-8"));
switch (fi.getFieldName()) {
case "pname":
painting.setPname(fi.getString("UTF-8"));
break;
case "category":
painting.setCategory(Integer.parseInt(fi.getString("UTF-8")));
break;
case "price":
painting.setPrice(Integer.parseInt(fi.getString("UTF-8")));
break;
case "description":
painting.setDescription(fi.getString("UTF-8"));
break;
case "id":
painting.setId(Integer.parseInt(fi.getString("UTF-8")));
break;
case "isPreviewModified":
isPreviewModified = Integer.parseInt(fi.getString("UTF-8"));
break;
default:
break;
}
}else {
if(isPreviewModified == 1) {
System.out.println("文件上传项:" + fi.getFieldName());
//3.文件保存到服务器目录
String path = request.getServletContext().getRealPath("/upload");
System.out.println("上传文件目录:" + path);
//String fileName = "test.jpg";
String fileName = UUID.randomUUID().toString();
//fi.getName()得到原始文件名,截取最后一个.后所有字符串,例如:wxml.jpg->.jpg
String suffix = fi.getName().substring(fi.getName().lastIndexOf("."));
//fi.write()写入目标文件
fi.write(new File(path,fileName + suffix));
painting.setPreview("/upload/" + fileName + suffix);
}
}
}
//更新数据的核心方法
paintingService.update(painting, isPreviewModified);
response.sendRedirect("/management?method=list");//返回列表页
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 客户端采用Ajax方式提交Http请求
* Controller方法处理后不再跳转任何jsp,而是通过响应输出JSON格式字符串
* Tips:作为Ajax与服务器交互后,得到的不是整页HTML,而是服务器处理后的数据
* @throws IOException
*/
public void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
String id = request.getParameter("id");
PrintWriter out = response.getWriter();
try {
paintingService.delete(Integer.parseInt(id));
//{"result":"ok"}
out.println("{\"result\":\"ok\"}");
}catch(Exception e) {
e.printStackTrace();
out.println("{\"result\":\"" + e.getMessage() + "\"}");
}
}
}
package com.MOBA.service;
import java.util.List;
import com.MOBA.dao.PaintingDao;
import com.MOBA.entity.Painting;
import com.MOBA.utils.PageModel;
/**
* PaintingService皮肤类别
*/
public class PaintingService {
private PaintingDao paintingDao = new PaintingDao();
/**
* pagination数据分页查询
* @param pageNo 页号
* @param rows 每页记录数
* @param category 可选参数,分类编号
* @return 分页对象
*/
public PageModel pagination(int page,int rows , String...category) {
if(rows == 0) {
throw new RuntimeException("无效的rows参数");
}
if(category.length==0 || category[0] == null) {
return paintingDao.pagination(page, rows);
}else {
return paintingDao.pagination(Integer.parseInt(category[0]), page, rows);
}
}
/**
* 新增皮肤
* @param painting 准备新增的Painting数据
*/
public void create(Painting painting) {
paintingDao.create(painting);
}
/**
* 按编号查询皮肤
* @param id 皮肤编号
* @return 皮肤对象
*/
public Painting findById(Integer id) {
Painting p = paintingDao.findById(id);
if(p==null) {
throw new RuntimeException("[id=" + id +"]皮肤不存在");
}
return p;
}
/**
* 更新业务逻辑
* @param newPainting 新的皮肤数据
* @param isPreviewModified 是否修改Preview属性
*/
public void update(Painting newPainting,Integer isPreviewModified) {
//createtime:
//在原始数据基础上覆盖更新
Painting oldPainting = this.findById(newPainting.getId());
oldPainting.setPname(newPainting.getPname());
oldPainting.setCategory(newPainting.getCategory());
oldPainting.setPrice(newPainting.getPrice());
oldPainting.setDescription(newPainting.getDescription());
if(isPreviewModified == 1) {
oldPainting.setPreview(newPainting.getPreview());
}
paintingDao.update(oldPainting);
}
/**上
* 按id号删除数据
* @param id
*/
public void delete(Integer id) {
paintingDao.delete(id);
}
/*
* public static void main(String[] args) { PaintingService paintingService =
* new PaintingService(); PageModel pageModel = paintingService.pagination(2,
* 6); List<Painting> paintingList = pageModel.getPageData(); for(Painting
* painting : paintingList) { System.out.println(painting.getPname()); }
* System.out.println(pageModel.getPageStartRow() + ":" +
* pageModel.getPageEndRow()); }
*/
}
package com.MOBA.dao;
import java.util.ArrayList;
import java.util.List;
import com.MOBA.entity.Painting;
import com.MOBA.utils.XmlDataSource;
import com.MOBA.utils.PageModel;
public class PaintingDao {
public PageModel pagination(int page, int rows) {
//Painting 皮肤对象集合
List<Painting> list = XmlDataSource.getRawData();
//pageModel分页处理得到分页数据及分页
PageModel pageModel = new PageModel(list,page,rows);
return pageModel;
}
/**
* 按类别分页查询
* @param category 分类编号
* @param page 页号
* @param rows 每页记录数
* @return 分页对象
*/
public PageModel pagination(int category, int page, int rows) {
List<Painting> list = XmlDataSource.getRawData();//从源文件拿到全部信息
List<Painting> categoryList = new ArrayList<Painting>();//建立新的painting列表用于存储需要的内容
for (Painting painting : list) {
if (painting.getCategory()==category) {
categoryList.add(painting);//如果找到了对应的分类就装进这个新的列表中。
}
}
PageModel pageModel = new PageModel(categoryList,page,rows);//再将页面信息放进页面处理模块,这里只是对数量进行处理。
return pageModel;
}
public void create(Painting painting) {//新增新皮肤
XmlDataSource.append(painting);
}
public Painting findById(Integer id) {//找到对应的id就是找了需要删除或者修改的对象
List<Painting> data = XmlDataSource.getRawData();
Painting painting = null;
for(Painting p : data) {
if(p.getId() == id) {
painting = p;
break;
}
}
return painting;
}
public void update(Painting painting) {
XmlDataSource.update(painting);
}
public void delete(Integer id) {
XmlDataSource.delete(id);
}
}
后台管理的重点代码
package com.MOBA.controller;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.MOBA.entity.Painting;
import com.MOBA.service.PaintingService;
import com.MOBA.utils.PageModel;
/**
* Servlet implementation class ManagementController
*/
@WebServlet("/management")
public class ManagementController extends HttpServlet {
private PaintingService paintingService = new PaintingService();//获取页面信息
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ManagementController() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//通过method参数区分不同的操作
String method = request.getParameter("method");
if(method.equals("list")) {//分页查询列表
this.list(request,response);
}else if(method.equals("delete")) {
this.delete(request,response);
}else if(method.equals("show_create")) {//显示新增页面
this.showCreatePage(request,response);
}else if(method.equals("create")) {
this.create(request, response);
}else if(method.equals("show_update")) {
this.showUpdatePage(request,response);
}else if(method.equals("update")) {
this.update(request,response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
//分页查询列表
private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String p = request.getParameter("p");
String r = request.getParameter("r");
if(p==null) {
p = "1";
}
if(r==null) {
r = "6";
}
PageModel pageModel = paintingService.pagination(Integer.parseInt(p),Integer.parseInt(r));
request.setAttribute("pageModel", pageModel);
request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);
}
//显示新增页面
private void showCreatePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/create.jsp").forward(request, response);
}
//新增油画方法
private void create(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//文件上传时的数据处理与标准表单完全不同
/*
String pname = request.getParameter("pname");
System.out.println(pname);
*/
//1. 初始化FileUpload组件
FileItemFactory factory = new DiskFileItemFactory();
/**
* FileItemFactory 用于将前端表单的数据转换为一个个FileItem对象
* ServletFileUpload 则是为FileUpload组件提供Java web的Http请求解析
*/
ServletFileUpload sf = new ServletFileUpload(factory);
//2. 遍历所有FileItem
try {
List<FileItem> formData = sf.parseRequest(request);
Painting painting = new Painting();
for(FileItem fi:formData) {
if(fi.isFormField()) {
System.out.println("普通输入项:" + fi.getFieldName() + ":" + fi.getString("UTF-8"));
switch (fi.getFieldName()) {
case "pname":
painting.setPname(fi.getString("UTF-8"));
break;
case "category":
painting.setCategory(Integer.parseInt(fi.getString("UTF-8")));
break;
case "price":
painting.setPrice(Integer.parseInt(fi.getString("UTF-8")));
break;
case "description":
painting.setDescription(fi.getString("UTF-8"));
break;
default:
break;
}
}else {
System.out.println("文件上传项:" + fi.getFieldName());
//3.文件保存到服务器目录
String path = request.getServletContext().getRealPath("/upload");
System.out.println("上传文件目录:" + path);
//String fileName = "test.jpg";
String fileName = UUID.randomUUID().toString();
//fi.getName()得到原始文件名,截取最后一个.后所有字符串,例如:wxml.jpg->.jpg
String suffix = fi.getName().substring(fi.getName().lastIndexOf("."));
//fi.write()写入目标文件
fi.write(new File(path,fileName + suffix));
painting.setPreview("/upload/" + fileName + suffix);
}
}
paintingService.create(painting);//新增功能
response.sendRedirect("/management?method=list");//返回列表页
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 显示更新页面
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void showUpdatePage(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
Painting painting = paintingService.findById(Integer.parseInt(id));
request.setAttribute("painting", painting);
request.getRequestDispatcher("/WEB-INF/jsp/update.jsp").forward(request, response);
}
/**
* 实现油画更新
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void update(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
int isPreviewModified = 0;
//文件上传时的数据处理与标准表单完全不同
/*
String pname = request.getParameter("pname");
System.out.println(pname);
*/
//1. 初始化FileUpload组件
FileItemFactory factory = new DiskFileItemFactory();
/**
* FileItemFactory 用于将前端表单的数据转换为一个个FileItem对象
* ServletFileUpload 则是为FileUpload组件提供Java web的Http请求解析
*/
ServletFileUpload sf = new ServletFileUpload(factory);
//2. 遍历所有FileItem
try {
List<FileItem> formData = sf.parseRequest(request);
Painting painting = new Painting();
for(FileItem fi:formData) {
if(fi.isFormField()) {
System.out.println("普通输入项:" + fi.getFieldName() + ":" + fi.getString("UTF-8"));
switch (fi.getFieldName()) {
case "pname":
painting.setPname(fi.getString("UTF-8"));
break;
case "category":
painting.setCategory(Integer.parseInt(fi.getString("UTF-8")));
break;
case "price":
painting.setPrice(Integer.parseInt(fi.getString("UTF-8")));
break;
case "description":
painting.setDescription(fi.getString("UTF-8"));
break;
case "id":
painting.setId(Integer.parseInt(fi.getString("UTF-8")));
break;
case "isPreviewModified":
isPreviewModified = Integer.parseInt(fi.getString("UTF-8"));
break;
default:
break;
}
}else {
if(isPreviewModified == 1) {
System.out.println("文件上传项:" + fi.getFieldName());
//3.文件保存到服务器目录
String path = request.getServletContext().getRealPath("/upload");
System.out.println("上传文件目录:" + path);
//String fileName = "test.jpg";
String fileName = UUID.randomUUID().toString();
//fi.getName()得到原始文件名,截取最后一个.后所有字符串,例如:wxml.jpg->.jpg
String suffix = fi.getName().substring(fi.getName().lastIndexOf("."));
//fi.write()写入目标文件
fi.write(new File(path,fileName + suffix));
painting.setPreview("/upload/" + fileName + suffix);
}
}
}
//更新数据的核心方法
paintingService.update(painting, isPreviewModified);
response.sendRedirect("/management?method=list");//返回列表页
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 客户端采用Ajax方式提交Http请求
* Controller方法处理后不再跳转任何jsp,而是通过响应输出JSON格式字符串
* Tips:作为Ajax与服务器交互后,得到的不是整页HTML,而是服务器处理后的数据
* @throws IOException
*/
public void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
String id = request.getParameter("id");
PrintWriter out = response.getWriter();
try {
paintingService.delete(Integer.parseInt(id));
//{"result":"ok"}
out.println("{\"result\":\"ok\"}");
}catch(Exception e) {
e.printStackTrace();
out.println("{\"result\":\"" + e.getMessage() + "\"}");
}
}
}