【发布时间】:2023-04-01 21:53:02
【问题描述】:
我知道有很多关于这个问题的问题,但我的问题不同,我无法根据之前的问题找到任何解决方案。我正在使用 spring MVC 并且一切正常,直到我发现我的浏览器没有呈现图像。然后我尝试为我的浏览器提供我的图片的完整网址,它返回 404。我尝试了
<mvc:default-servlet-handler/>
<mvc:resources mapping="/images/**" location="/images/"/>
这并没有显示我的图像,但它也以某种方式弄乱了我的控制器,它没有处理 url 映射。我将向您展示我的大部分代码。
这是我的 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>spring-brains</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<multipart-config/>
</servlet>
<servlet-mapping>
<servlet-name>spring-brains</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-brains-servlet.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
这是我的 spring-brains-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<context:component-scan base-package="bobi.spring.spring.brains"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:default-servlet-handler/>
<mvc:resources mapping="/images/**" location="/images/"/>
<security:debug/>
<security:http pattern="/admin/login.jsp" security="none"/>
<security:http auto-config="true">
<security:intercept-url pattern="/admin/**" access="ROLE_USER" />
<security:form-login login-page="/admin/login.jsp" default-target-url="/admin/admin.jsp" always-use-default-target="true"/>
<security:logout logout-success-url="/admin" />
</security:http>
<bean class="service.DummyUserService" id="user-service-bobi"/>
<security:authentication-manager>
<security:authentication-provider user-service-ref="user-service-bobi">
</security:authentication-provider>
</security:authentication-manager>
这是我的AdminController:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package bobi.spring.spring.brains;
import domains.User;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import service.Authentication;
import service.ProductManager;
import service.Service;
/**
*
* @author BOBBOO
*/
@MultipartConfig
@Controller
@RequestMapping(value = "/admin")
public class AdminController {
protected final Log logger = LogFactory.getLog(getClass());
@RequestMapping(value = "/{adminview}")
public ModelAndView getAdminView(@PathVariable("adminview") String view) {
switch (view) {
case "login": {
return new ModelAndView("admin/login");
}
case "admin": {
return new ModelAndView("admin/admin");
}
case "newcategory": {
return new ModelAndView("admin/newcategory");
}
case "newproduct": {
return new ModelAndView("admin/newproduct", "categories", Service.getCategories());
}
case "newuser": {
return new ModelAndView("admin/newuser");
}
case "products": {
return new ModelAndView("admin/products", "products", Service.getProducts());
}
default:
return new ModelAndView("admin/login");
}
}
@RequestMapping("/form")
public void formHandler(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, FileUploadException {
String formId = request.getParameter("formId");
request.setCharacterEncoding("UTF-8");
if (formId != null && formId.equals("newcat")) {
service.Admin.saveCategory((HashMap) ServletUtils.prepareRequestArguments(request));
response.sendRedirect("admin/newcategory");
} else if (formId != null && formId.equals("login")) {
Authentication auth = new Authentication();
User user = service.Service.getUser(request.getParameter("username"));
} else if (formId != null && formId.equals("newuser")) {
Authentication auth = new Authentication();
boolean success = auth.CheckUserName(request.getParameter("username"));
if (success) {
service.Admin.saveUser((HashMap) ServletUtils.prepareRequestArguments(request));
response.sendRedirect("admin/newuser");
} else {
response.sendRedirect("admin/login");
}
}
}
@RequestMapping(value = "/upload")
public void productAdd(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
if (ServletFileUpload.isMultipartContent(request)) {
request.setCharacterEncoding("UTF-8");
Part part = request.getPart("picture");
String path = service.Constants.LINUX_ABS_PROJECT_PATH + System.getProperty("file.separator") + "images";
Service serv = new Service();
String kategorija = request.getParameter("category");
System.out.println(kategorija);
try {
serv.SaveFile(path, part);
} catch (Exception e) {
e.printStackTrace();
}
ServletUtils util = new ServletUtils();
try {
service.Admin.saveProduct((HashMap) util.prepareRequestMultiPartArguments(request));
} catch (Exception e) {
logger.info("Error while saving product @ AdminController, line 92!!");
}
response.sendRedirect(request.getContextPath() + "/admin/admin.jsp");
}
}
@RequestMapping(value="/edit/{object}/{objectId}")
public ModelAndView editTable(@PathVariable("object") String editItemType,
@PathVariable("objectId") String itemId){
switch(editItemType){
case "product":{
return new ModelAndView("admin/editproduct", "product", Service.getProduct(Integer.parseInt(itemId)));
}
case "category":{
return new ModelAndView("admin/editcategory", "category", Service.getProduct(Integer.parseInt(itemId)));
}
case "user":{
return new ModelAndView("admin/edituser", "user", Service.getProduct(Integer.parseInt(itemId)));
}
}
return new ModelAndView("admin/admin");
}
@RequestMapping(value="/formedit")
public void editForm(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, FileUploadException {
String formId = request.getParameter("formId");
request.setCharacterEncoding("UTF-8");
if (formId != null && formId.equals("newcat")) {
service.Admin.saveCategory((HashMap) ServletUtils.prepareRequestArguments(request));
response.sendRedirect("admin/newcategory");
} else if (formId != null && formId.equals("login")) {
Authentication auth = new Authentication();
User user = service.Service.getUser(request.getParameter("username"));
} else if (formId != null && formId.equals("newuser")) {
Authentication auth = new Authentication();
boolean success = auth.CheckUserName(request.getParameter("username"));
if (success) {
service.Admin.saveUser((HashMap) ServletUtils.prepareRequestArguments(request));
response.sendRedirect("admin/newuser");
} else {
response.sendRedirect("admin/login");
}
}
}
}
所以基本上我有两个问题: 1. 如何让我的应用显示静态图片内容? 2. 为什么以及如何-->
<mvc:default-servlet-handler/>
<mvc:resources mapping="/images/**" location="/images/"/>
弄乱了我的控制器,或者我所说的阻止它处理它应该处理的映射。
提前谢谢你,我已经为此苦苦挣扎了好几天
【问题讨论】:
-
首先,不要让
DispatcherServlet和ContextLoaderListener加载相同的上下文文件。 -
Tomcat 正在请求上下文侦听器,但我不知道如何使用 DispatcherServlet 加载相同的侦听器
-
请注意您的
<context-param>为/WEB-INF/spring-brains-servlet.xml。此外,您的DispatcherServlet被命名为spring-brains。默认情况下,Spring 会查找名为<your-servlet-name>-servlet.xml的上下文文件并使用DispatcherServlet加载它。在此,与ContextLoaderListener相同的文件。 -
好的,我回答了 2。对自己来说,我错过了
<mvc:annotation-driven/>。所以我的控制器现在可以工作了,但我仍然看不到我的图像,每当<img src""/>应该显示时,或者当我给浏览器提供完整的 URL 时,我都看不到它们。我不断收到 HTTP-404。谁能帮我解决另一半,即显示静态内容。 -
@SotiriosDelimanolis 当我在我的 servlet.xml 中评论
部分时,我收到以下错误:java.io.FileNotFoundException:无法打开 ServletContext 资源 [/WEB-INF/applicationContext.xml ]
标签: java spring spring-mvc controller