我正在尝试基于Spring documentation在我的Spring应用程序中实现文件上传。但是,当我添加SimpleUrlHandlerMapping引用时,我甚至无法路由到我的登录页面。
在我的web.xml中,我将所有.htm文件映射到我的servlet:
<servlet-mapping>
<servlet-name>myapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
然后,在myapp-servlet.xml中,我有这个:
<bean name="/login.htm" class="com.example.web.LoginFormController">
<property name="sessionForm" value="true" />
<property name="commandName" value="loginCommand" />
<property name="commandClass" value="com.example.command.LoginCommand" />
<property name="authenticationService" ref="authenticationService" />
<property name="loginDataAccess" ref="loginDAO" />
<property name="validator" ref="loginValidator" />
<property name="formView" value="login" />
<property name="successView" value="hello.htm" />
</bean>
这允许我进入登录页面并登录。但是,当我根据文档添加以下内容时,我收到此错误:在DispatcherServlet中找不到带有URI [/myapp/login.htm]的HTTP请求的映射,名称为“myapp”
这些是我添加到myapp-servlet.xml文件的行:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>/upload.form=fileUploadController</value>
</property>
</bean>
<bean id="fileUploadController" class="com.example.web.FileUploadController">
<property name="commandClass" value="com.example.domain.FileUploadBean" />
<property name="formView" value="fileuploadform" />
<property name="successView" value="hello.htm" />
</bean>
如果我取出urlMapping部分,我可以导航到上传页面,但后来我得到一个IllegalStateException。如何正常使用Spring路由htm文件并允许我上传文件? urlMapping不应该只调用upload.form吗?
更新
Per SKaffman's answer,我更新了myapp-servlet.xml,如下所示:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/upload.form=fileUploadController
/upload.htm=fileUploadController
/login.htm=loginController
</value>
</property>
</bean>
这允许我导航到上传页面,但是当我点击提交按钮时,我得到404 for upload.form说“(/myapp/upload.form)不可用。”如果我从映射中取出upload.htm,我无法导航到该页面。我不知道用于页面和上传的映射。上传页面已定义此操作:
<form method="post" action="upload.form" enctype="multipart/form-data">
答案 0 :(得分:2)
默认情况下,Spring会自动注册多个HandlerMapping
bean,包括BeanNameUrlHandlerMapping
。此处理程序允许您使用<bean name="/login.htm">
之类的内容而无需任何其他配置。
但是,只要添加显式处理程序映射bean(如SimpleUrlHandlerMapping
),就会不再注册默认值,并且不再映射登录控制器。
最简单的解决方案可能是将您的登录控制器添加到SimpleUrlMappingHandler
:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>/login.htm=loginController</value>
<value>/upload.form=fileUploadController</value>
</property>
</bean>
<bean id=loginController" class="com.example.web.LoginFormController">
...
</bean>