赞
踩
在使用eclipse做上传和下载项目测试时,发现一个非常典型的错误。即为:Apache Tomcat version 10.0 implements the Servlet 5.0 and JavaServer Pages 3.0 specifications from Jakarta EE。Tomcat10中解决eclipse内部Jakarta.servlet与javax.servlet不兼容问题
具体情况如下:本人在做项目时,使用的是Tomcat10.0版本,里面的servlet-api.jar中的包名已经改为jakarta.servlet,
而默认的eclipse新建jsp文件,则会自动导入javax.servlet包,详情可见:
[Servlet]eclipse新建Servlet文件时,各种导入包出现红线错误[已导入并配置好Tomcat服务器]:https://blog.csdn.net/mmmm0584/article/details/114839314
基于上述文章的基础上,下载javax.servlet-api-4.0.1.jar包,并导入到项目中,使用方案二解决问题。
项目目录如下:
index.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" method="post" enctype="multipart/form-data"> <title>Insert title here</title> </head> <body> <form action="UpLoadServlet"> 学号:<input name="sname"/><br> 姓名:<input name="sname"/><br> 上传照片:<input type="file" name="spicture"><br> <input type="submit" value="提交"> </form> </body> </html>
UpLoadServlet.java如下:
package student.servlet; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; 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 jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; /*import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;*/ /** * Servlet implementation class UpLoadServlet */ @WebServlet("/UpLoadServlet") public class UpLoadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");//响应编码 response.setContentType("text/html; charset=UTF-8");//展示时的编码 //上传 boolean isMultipart=ServletFileUpload.isMultipartContent( request); if(isMultipart) {//判断前台的form中是否有isMultipart这个字段 FileItemFactory factory=new DiskFileItemFactory(); ServletFileUpload upload=new ServletFileUpload(factory); //通过parseRequst解析form中的所有请求字段,并且保存到items集合中(sno,sname spicture) try { List<FileItem> items=upload.parseRequest(request); //遍历items中的数据(sno sname spicture) Iterator<FileItem> iter=items.iterator(); while(iter.hasNext()) { FileItem item=iter.next(); String itemName=item.getFieldName();//获取属性名称 int sno=-1; String sname=null; //判断前台字段是form表单字段(sno sname),还是文件字段 if(item.isFormField()) { if(itemName.equals("sno")) {//根据name属性,判断item是sno还是sname sno=Integer.parseInt(item.getString("UTF-8")); }else if(itemName.equals("sname")) { sname=item.getString("UTF-8"); }else { System.out.println("其他字段"); } }else {//spicture,处理文件上传 //文件名getFieldName是获取普通表单字段的name值 //getName()是获取文件名 String fileName=item.getName(); //获取文件内容并上传 //定义文件路径:指定上传的位置(服务器路径) //获取服务器路径: //D:\\apache\\apache-tomcat-10.0.2-windows-x64\\apache-tomcat-10.0.2\\wtpwebapps\\UpAndDown\\upload String path=request.getSession().getServletContext().getRealPath("upload");//相当于upload的绝对路径 File file=new File(path,fileName); //上传文件 item.write(file); System.out.println(fileName+"上传成功"); return ; } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
此时UpLoadServlet.java出现错误:
这是因为在导入包时,导入的是import jakarta.servlet.http.HttpServletRequest;而isMultipartContent函数需要的是import javax.servlet.http.HttpServletRequest;下图为isMultipartContent的源码
本人的解决方法是再导入一个包,如下图:
但是,这样的话,便与import jakarta.servlet.http.HttpServletRequest;发生冲突了,他们俩之间只能存在一个。原因是包命名规范问题。
尝试解决方案一:(理论上可行,但本人未成功)
javax.servlet_没有Javax的Jakarta EE:这次世界也不会结束:https://blog.csdn.net/cunfen3485/article/details/112545102?utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-1.control&dist_request_id=1328689.8464.16165516936258507&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-1.control
尝试解决方案二:(不可行)
jar包冲突解决–jarjar工具修改jar包名:https://blog.csdn.net/weixin_42310890/article/details/81261831?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.baidujs&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.baidujs
下载jarjar工具的地址为:https://www.jb51.net/softs/577289.html#downintro2
将修改后的包(javax.servlet.jar)导入并配置,结果还是报错。
尝试解决方案三:https://www.pianshen.com/article/60071856117/
重新安装tomcat9.0,问题完美解决。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。