如何在spring mvc控制器中获取getServletContext()

Posted

技术标签:

【中文标题】如何在spring mvc控制器中获取getServletContext()【英文标题】:how to get getServletContext() in spring mvc Controller 【发布时间】:2015-01-11 11:38:54 【问题描述】:

我需要在我的项目中上传图片。 SpringMVC中如何获取上传路径。 路径是;

/home/cme/project/eclipse/workspace_12_11/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/fileUploadTester/upload

以下错误;

The method getServletContext() is undefined for the type HomePageController

在我使用此代码时出现;

String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;

我的代码是

public ModelAndView UploadPhoto(@ModelAttribute User user, HttpServletRequest request, HttpServletResponse response) throws IOException 
 final String UPLOAD_DIRECTORY = "upload";
 final int THRESHOLD_SIZE = 1024 * 1024 * 3; // 3MB
 final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
 final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB

 String value[] = new String[10];
 int i = 0;

 // checks if the request actually contains upload file
 if (!ServletFileUpload.isMultipartContent(request)) 
  PrintWriter writer = response.getWriter();
  writer.println("Request does not contain upload data");
  writer.flush();
  return; //here is error This method must return a result of type ModelAndView
 

 DiskFileItemFactory factory = new DiskFileItemFactory();
 factory.setSizeThreshold(THRESHOLD_SIZE);
 factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

 ServletFileUpload upload = new ServletFileUpload(factory);
 upload.setFileSizeMax(MAX_FILE_SIZE); //here error The method setFileSizeMax(int) is undefined for the type ServletFileUpload
 upload.setSizeMax(MAX_REQUEST_SIZE);
 String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; // here error The method getServletContext() is undefined for the type Homepage Controller
 // creates the directory if it does not exist
 File uploadDir = new File(uploadPath);
 if (!uploadDir.exists()) 
  uploadDir.mkdir();
 

 try 
  List < FileItem > items = upload.parseRequest(request); // request is HttpServletRequest
  for (FileItem item: items) 
   if (item.isFormField())  // text fields, etc...
    String fieldName = item.getFieldName();
    System.out.print("fieldname" + fieldName);
    value[i] = item.getString();
    System.out.print("from uploader" + value[i]);
    i++;
    else 
    //String fileName=new File(item.getName()).getName();   Use this to use default file name
    String name = value[0];
    System.out.println("file uploader name" + name);
    String filePath = uploadPath + File.separator + name;
    System.out.println(filePath);
    File storeFile = new File(filePath);
    try 
     item.write(storeFile);
     catch (Exception ex) 
    
   
  
  System.out.println("uploaded successfully");
  catch (Exception ex) 
  System.out.println("error not uploaded");
 
 return new ModelAndView("ChangePhoto");

三个错误

    此方法必须返回 ModelAndView 类型的结果 未为 ServletFileUpload 类型定义方法 setFileSizeMax(int) 方法 getServletContext() 未为主页控制器类型定义

【问题讨论】:

【参考方案1】:

    使用下面的代码在 SpringMVC 中自动装配 ServletContext 对象

    @Autowired
    ServletContext context; 
    

    然后尝试像这样执行你的代码

    String uploadPath = context.getRealPath("") + File.separator + UPLOAD_DIRECTORY;
    

    您可以像这样在控制器中获取它;

    private ServletContext context;
    
    public void setServletContext(ServletContext servletContext) 
        this.context = servletContext;
    
    

    但为此,您的控制器必须实现 ServletContextAware 接口

【讨论】:

【参考方案2】:

试试这个:

@Autowired
ServletContext servletContext;

【讨论】:

【参考方案3】:

这只是另一种选择

((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getServletContext()

【讨论】:

【参考方案4】:

您传递或设置给 ServletContext 对象的参数存储在 HttpServletRequest 对象中,您可以通过以下方式在应用程序的任何位置访问它们:

public void method(HttpServletRequest request)
    String email=request.getServletContext().getInitParameter(“email”);

【讨论】:

请解释为什么这段代码应该解决这个问题。

以上是关于如何在spring mvc控制器中获取getServletContext()的主要内容,如果未能解决你的问题,请参考以下文章

Spring mvc 3:如何在拦截器中获取路径变量?

在 Spring MVC 控制器中获取查询字符串值

如何在 Spring MVC 应用程序中实现 Spring 安全性?

在 Spring MVC 中获取根/基 URL

在几秒钟内从 Spring MVC 中的表中获取 400K 数据

过滤,获取控制器前的url(Spring MVC)