Spring MVC-控制器(Controller)-属性方法名称解析器(Properties Method Name Resolver )示例(转载实践)...

本文介绍如何在SpringMVC中使用多操作控制器(UserController)及属性方法名称解析方法,实现不同URL与控制器内多个方法之间的映射。通过配置文件指定了不同URL与控制器方法之间的对应关系。

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_propertiesmethodnameresolver.htm

说明:示例基于Spring MVC 4.1.6

以下示例显示如何使用Spring Web MVC框架使用多操作控制器的属性方法名称解析方法。MultiActionController类有助于分别在单个控制器中将多个URL与其方法映射。

package com.tutorialspoint;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class UserController extends MultiActionController{
    
   public ModelAndView home(HttpServletRequest request, HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Home");
      return model;
   }

   public ModelAndView add(HttpServletRequest request, HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Add");
      return model;
   }

   public ModelAndView remove(HttpServletRequest request, HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Remove");
      return model;
   }
}
<bean class="com.tutorialspoint.UserController">
   <property name="methodNameResolver">
      <bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
         <property name="mappings">
            <props>
               <prop key="/user/home.htm">home</prop>
               <prop key="/user/add.htm">add</prop>
               <prop key="/user/remove.htm">update</prop>      
            </props>
         </property>
      </bean>
   </property>
</bean>

例如,使用上面的配置,如果是URI

  1. /user/home.htm被请求,DispatcherServlet将请求转发到UserController home()方法。

  2. /user/add.htm被请求,DispatcherServlet将请求转发给UserController add()方法。

  3. /user/remove.htm被请求,DispatcherServlet将请求转发给UserControllerremove()方法。

首先,让我们使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态窗体的Web应用程序:

步骤描述
1创建一个名称的项目TestWeb包下com.tutorialspoint中所解释的Spring MVC - Hello World示例章节。
2在com.tutorialspoint包下创建Java类UserController。
3在jsp子文件夹下创建一个视图文件user.jsp。
4最后一步是创建所有源和配置文件的内容并导出应用程序,如下所述。

UserController.java

package com.tutorialspoint;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class UserController extends MultiActionController{
    
   public ModelAndView home(HttpServletRequest request, HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Home");
      return model;
   }

   public ModelAndView add(HttpServletRequest request, HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Add");
      return model;
   }

   public ModelAndView remove(HttpServletRequest request, HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Remove");
      return model;
   }
}

TestWeb-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/"/>
      <property name="suffix" value=".jsp"/>
   </bean>

   <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
      <property name="caseSensitive" value="true" />
   </bean>
   <bean class="com.tutorialspoint.UserController">
      <property name="methodNameResolver">
      <bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
         <property name="mappings">
            <props>
               <prop key="/user/home.htm">home</prop>
               <prop key="/user/add.htm">add</prop>
               <prop key="/user/remove.htm">update</prop>      
            </props>
         </property>
      </bean>
      </property>
   </bean>  
</beans>

user.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
   <h2>${message}</h2>  
</body>
</html>

完成创建源文件和配置文件后,导出应用程序。右键单击应用程序并使用Export > WAR File选项,并将您的TestWeb.war文件保存在Tomcat的webapps文件夹中。

现在启动您的Tomcat服务器,并确保您可以使用标准浏览器从webapps文件夹访问其他网页。现在尝试URL http://localhost:8080/TestWeb/user/add.htm,如果您的Spring Web应用程序的一切都很好,您应该会看到以下结果:

Maven示例:

https://github.com/easonjim/5_java_example/tree/master/springmvc/tutorialspoint/test20

<think>嗯,用户遇到了Spring框架中的MultipartException,提示“Current request is not a multipart request”。首先,我需要回忆一下这个错误的常见原因。根据引用中的信息,可能的问题点包括请求头不正确、表单未使用multipart/form-data编码、后端未正确配置MultipartResolver,或者前端提交方式不对。 用户可能是在上传文件时遇到了这个问题,比如表单提交或者API调用。我需要一步步分析可能的原因。首先,检查请求的Content-Type是否为multipart/form-data,这是必须的。如果前端没有正确设置enctype,就会导致这个错误。比如,用户可能用的是普通的表单提交,而不是文件上传所需的格式。 然后,查看后端配置。Spring需要配置MultipartResolver来处理多部分请求,比如使用CommonsMultipartResolver或者StandardServletMultipartResolver。如果用户使用的是Spring Boot,可能还需要检查配置文件中的参数,比如spring.servlet.multipart.enabled是否启用,以及文件大小限制是否合适。 另外,请求方法是否正确也很重要。上传文件通常使用POST方法,如果用户误用了GET,也会引发这个错误。同时,检查前端是否有正确的文件输入字段,比如<input type="file" name="file">,并且name属性是否和后端参数一致。 还有可能的问题包括前端框架(如axios)未正确设置请求头,或者后端Controller的参数绑定有问题,比如@RequestParam("file")中的名称是否匹配。此外,服务器配置如Tomcat也可能影响,需要确认是否处理了多部分请求。 接下来,我应该整理这些可能的原因,并提供具体的解决步骤,比如如何检查请求头、配置MultipartResolver、调整前端表单设置等。同时,引用中的案例提到,比如HTML表单的enctype属性、POST方法的使用,这些都是关键点。还要提醒用户注意依赖包是否引入,比如Apache Commons FileUpload库。 最后,确保回答结构清晰,分点说明,并提供示例代码,比如配置MultipartResolver的Bean,或者前端表单的正确写法。可能还需要指导用户如何调试,比如使用浏览器的开发者工具查看请求头,或者检查Spring Boot的配置参数。这样用户能一步步排查问题,找到根本原因并解决。</think>### Spring框架中"Current request is not a multipart request"错误解决方案 #### 一、错误定位 该错误表明HTTP请求未正确声明为多部分请求。常见触发场景: - 未在HTML表单设置`enctype="multipart/form-data"` - 后端未配置`MultipartResolver` - 使用GET方法提交文件(必须用POST) - 请求头`Content-Type`不匹配[^2][^3] #### 二、分步解决方案 1. **前端配置验证** ```html <!-- 正确表单配置 --> <form method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">上传</button> </form> ``` - 确保`enctype`属性存在 - 使用POST方法提交 - 文件字段名称Controller参数一致[^3][^5] 2. **后端配置检查(Spring Boot)** ```yaml # application.yml配置 spring: servlet: multipart: enabled: true max-file-size: 10MB max-request-size: 100MB ``` - 验证是否引入`spring-boot-starter-web`依赖 - 检查配置文件参数有效性[^2][^4] 3. **MultipartResolver配置(非Spring Boot)** ```java @Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10485760); //10MB resolver.setDefaultEncoding("UTF-8"); return resolver; } ``` - 需要`commons-fileupload`依赖 - 配置Bean名称必须为`multipartResolver`[^2] 4. **Controller层验证** ```java @PostMapping("/upload") public String handleUpload(@RequestParam("file") MultipartFile file) { // 处理逻辑 } ``` - 参数注解必须使用`@RequestParam` - 参数名称与前端字段匹配[^4] 5. **网络请求验证** ```http POST /upload HTTP/1.1 Content-Type: multipart/form-data; boundary=WebAppBoundary ``` - 使用Postman等工具验证请求头 - 查看浏览器开发者工具中的请求头信息[^1][^5] #### 三、特殊场景处理 - **AJAX上传**需显式设置ContentType: ```javascript const formData = new FormData(); formData.append('file', file); axios.post('/upload', formData, { headers: {'Content-Type': 'multipart/form-data'} }) ``` - **网关代理问题**: - Nginx需配置`client_max_body_size` - 检查API网关是否修改了Content-Type #### 四、调试建议 1. 使用`curl`命令测试: ```bash curl -F "file=@test.jpg" http://localhost:8080/upload ``` 2. 启用Spring Debug日志: ```properties logging.level.org.springframework.web=DEBUG ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值