painting中category的值为null

painting中category的值为null

package com.imooc.mgallery.controller;


import java.io.File;

import java.io.IOException;

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 javax.sound.midi.Patch;


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.imooc.mgallery.entity.Painting;

import com.imooc.mgallery.service.PaintingService;

import com.imooc.mgallery.utils.PageModel;


import javafx.scene.control.Alert;


/**

 * Servlet implementation class ManageController

 */

@WebServlet("/manage")

public class ManageController extends HttpServlet {

private PaintingService paintingService =new PaintingService();

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public ManageController() {

        super();

        // TODO Auto-generated constructor stub

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

          //修改默认的post方式提交的字符集乱码问题  因为post调用了doget方法

  request.setCharacterEncoding("utf-8");

  //解决输出代码中文乱码问题

          response.setContentType("text/html;charset=utf-8");

          //如果实现一个servlet处理不同的功能呢   增删改查操作呢

          //每次访问servlet的时候携带一个method参数来判定你是什么请求

          String method =request.getParameter("method");

          //代表这还是list展示列表的请求

          //首先判断进来的list的参数是否为空

          if (method==null) {

System.out.println("输入method参数" );

  }

          

          if (method.equals("list")) {

this.list(request,response);

  }

          

          if (method.equals("delete")) {

  this.delete(request, response);

  }

          if (method.equals("update")) {

   

  }if (method.equals("show_create")) {

  this.showCreatePage(request,response);

}if (method.equals("create")) {

this.create(request,response);

}

                    

}


private void create(HttpServletRequest request, HttpServletResponse response) {

    //因为这个新增是关于文件的提交 所以不能用传统的方式 request.getparam("param");

//因为默认entype是url字符串格式存储 而文件是二进制数据所以不能这样获取

//String  pname =request.getParameter("pname");  这里不行了 因为涉及文件的读取

   //System.out.println(pname);

//1初始化fileupload组件

//FileItemFactory用于将前端表单的数据转换为一个个fileItem对象

//servletFileUpload 则是 为FileUpload提供Java web的http请求解析

FileItemFactory  factory =new  DiskFileItemFactory(); //这是一个工厂 这里每一个涉及文件提交的表单数据都是一个FileItem文件对象

    ServletFileUpload sf =new ServletFileUpload(factory);

//2遍历所有FileItem文件

    try {

List<FileItem> list =sf.parseRequest(request);

Painting painting =new Painting();

for (FileItem fileItem : list) {

if (fileItem.isFormField()) {

System.out.println(fileItem.getFieldName()+":"+fileItem.getString());

switch (fileItem.getFieldName()) {

case "pname":

painting.setPname(fileItem.getString("utf-8"));

break;

case "category":

   painting.setCategroy(Integer.parseInt(fileItem.getString("utf-8")));

break;

case "price":

painting.setPrice(Integer.parseInt(fileItem.getString("utf-8")));

break;

case "description":

painting.setDescription(fileItem.getString("utf-8"));

break;

default:

break;

}

}else {

//3文件保存到服务器目录   确定这里是文件

String path =request.getServletContext().getRealPath("/upload");

System.out.println(path);

//避免文件名  写一个方法些不同的名字 使用随机数 或者当前时间作为文件名UUID

//扩展名也不是唯一的 通过获取原始文件的名字截取最后三位

//fileItem.getName()为了获取原始文件名字 只为了获取后三位文件扩展名

String suffix=fileItem.getName().substring(fileItem.getName().lastIndexOf("."));

String fileName=UUID.randomUUID().toString()+suffix;

fileItem.write(new File(path,fileName));

painting.setPriview("/upload"+fileName);

}

}

paintingService.create(painting);//新增功能处理

response.sendRedirect("/manage?method=list");//返回列表页展示 因为关联比较紧密 可以用重定向

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}  //对原有表单数据对象进行转换

}


private void showCreatePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.getRequestDispatcher("WEB-INF/jsp/create.jsp").forward(request, response);

                            

}


private void delete(HttpServletRequest request, HttpServletResponse response) {

// TODO Auto-generated method stub

}


/**

* 这里就是分页的代码

* @param request

* @param response

* @throws IOException 

* @throws ServletException 

*/

private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String page =request.getParameter("p");

        String rows=request.getParameter("r");

        if (page ==  null) {

page="1";

}

        if (rows==null) {

rows="6";

}

       PageModel pageModel=  paintingService.getRawData(Integer.parseInt(page), Integer.parseInt(rows));

       request.setAttribute("pageModel", pageModel);

       List<Painting> list=pageModel.getPageData();

   request.getRequestDispatcher("WEB-INF/jsp/list.jsp").forward(request, response);

}




}


我获取的方式全部是一样的 打印出来categroy里面也有值 已提交就报错 说categroy为null 空指针异常


java.lang.NumberFormatException: null

at java.lang.Integer.parseInt(Integer.java:542)

at java.lang.Integer.parseInt(Integer.java:615)

at com.imooc.mgallery.utils.XmlDataSource.reload(XmlDataSource.java:77)

at com.imooc.mgallery.utils.XmlDataSource.append(XmlDataSource.java:129)

at com.imooc.mgallery.dao.PaintingDAO.create(PaintingDAO.java:32)

at com.imooc.mgallery.service.PaintingService.create(PaintingService.java:27)

at com.imooc.mgallery.controller.ManageController.create(ManageController.java:127)

at com.imooc.mgallery.controller.ManageController.doGet(ManageController.java:73)

at com.imooc.mgallery.controller.ManageController.doPost(ManageController.java:177)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)




正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿满 2020-11-27 18:07:31

同学你好,reload()方法并没有什么问题,建议同学检查一下painting.xml中,子节点名称是否为<category>,并且节点中是否有数值,如:

http://img1.sycdn.imooc.com//climg/5fc0cf850955dd6a07350551.jpg

建议同学检查一下。

祝学习愉快!

  • 提问者 winner_T #1

    检查了本身的xml肯定是没有问题  都有值 但是新增的时候一直获取不到category

    2020-11-27 18:26:19
  • 好帮手慕阿满 回复 提问者 winner_T #2

    同学你好,建议同学在Painting类中增加toString()方法。如:

    http://img1.sycdn.imooc.com//climg/5fc0dd9909cc8ba907780359.jpg

    然后在XmlDataSource类的reload()中输出一下获取的painting,如:

    http://img1.sycdn.imooc.com//climg/5fc0ddfb096ec90b10880681.jpg

    新建一个主方法,调用reload(),如:

    http://img1.sycdn.imooc.com//climg/5fc0de3c09db7ca506050134.jpg

    查看是否有如下输出,如:

    http://img1.sycdn.imooc.com//climg/5fc0de5d0971a0df13420195.jpg

    如果还是报错,请将painting.xml文件贴一下。

    祝学习愉快~

    2020-11-27 19:09:51
  • 好帮手慕阿满 回复 提问者 winner_T #3

    另外建议同学append()方法中,设置category时,使用toString()方法,而不是String.valueOf()再试试。如:

    http://img1.sycdn.imooc.com//climg/5fc0df2a09ebd6f311030175.jpg

    祝学习愉快!

    2020-11-27 19:18:27
好帮手慕阿满 2020-11-27 15:26:34

同学你好,如下是数字格式异常,并不是空指针异常。这里应该获取数值,但是获取为null,所以报错了。错误具体出现在XmlDataSource类的reload()方法中,第77行,如:

http://img1.sycdn.imooc.com//climg/5fc0a8fa0924b32906910290.jpg

建议同学将XmlDataSource类的代码贴一下,并指明77行是哪段代码。

祝学习愉快!

  • 提问者 winner_T #1


    public class XmlDataSource {

    // 为了保证全局的唯一性 使用static

    // (描述对象 类初始化就会初始化操作 类全局只有唯一所以类对象也是唯一的)关键字保证数据全局唯一

    // (单例模式也是可以的) 保证全局唯一 这里是使用static关键字


    // 创建静态data对象 用于保存解析xml对象 因为这里xml也是以列表形式存在的 所以用List

    private static List<Painting> data = new ArrayList();

    // 用于保存paintingxml文件的地址

    private static String dataFile;

    // 对静态的data进行初始化 因为data是静态的 所以初始化需要用静态块初始化

    static {

    // 首先确定读取哪个文件 这句话就是程序运行之后得到类路劲下的patingxml的路劲地址

    // 因为程序运行后 编译过后是生成class文件夹下的文件 所以读取class根目录下的xml文件

    // 使用getpath获取物理地址

    dataFile = XmlDataSource.class.getResource("/painting.xml").getPath();

    // 这里得到的dataFile如果原始的xml存放路劲存在特殊字符

    // 例如 c:\new file\A.xml --> dataFile =c:\new%20file\A.xml

    // 因为空格是特殊字符 所以之后读取这个地址会报错说路劲找不到 这里需要使用一个方法转换

    reload();

    }

    public static void  reload() {

    URLDecoder decoder = new URLDecoder();

    try {

    dataFile = decoder.decode(dataFile, "utf-8");

    // 利用Dom4j对xml文件进行解析

    SAXReader reader = new SAXReader();

    // 1:获取document文档对象

    Document document = reader.read(dataFile);

    // 2:利用xpath得到xml节点 Element

    List<Node> nodes = document.selectNodes("/root/painting");

    data.clear();

    for (Node node : nodes) {

    // 首先将node转换为Element对象

    Element element = (Element) node;

    // 通过Element进行属性的提取

    String id = element.attributeValue("id");

    String pname = element.elementText("pname");

    // 需要创建一个javaBean来装载这些数据转换为java对象 所以创建entity

    Painting painting = new Painting();

    // 这里获取到的对象默认都是String 如果是整形需要强转

    painting.setId(Integer.parseInt(id));

    painting.setPname(pname);

    painting.setCategory(Integer.parseInt(element.elementText("category")));

    painting.setPrice(Integer.parseInt(element.elementText("price")));

    painting.setPreview(element.elementText("preview"));

    painting.setDescription(element.elementText("description"));

    data.add(painting);

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }


    /**

    * 为data数据提供一个出口 获取所有油画对象

    * @return List<Painting>

    */

    public static List<Painting> getRawData() {

    return data;

    }

    public static void append(Painting painting) {

    //四步走

    //1:读取xml对象 得到document对象

    SAXReader reader = new SAXReader();

    Writer writer=null;

    try {

    Document  document =reader.read(dataFile);

    //2创建新的painting节点

    Element root=document.getRootElement();

    Element p=root.addElement("painting");

    //创建各个子节点

    p.addAttribute("id",String.valueOf(data.size()+1) );

    p.addElement("pname").setText(painting.getPname());

    p.addElement("category").setText(String.valueOf(painting.getCategory()));

    p.addElement("price").setText(painting.getPrice().toString());

    p.addElement("priview").setText(painting.getPreview());

    p.addElement("description").setText(painting.getDescription());

    //写入到xml中

    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 (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

           }

    reload();

    }

    }


    }


    辛苦老师看下还是一样的categroy为null

    2020-11-27 16:28:36
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师