Làm thế nào để xử lý nội dung tĩnh trong Spring MVC?


200

Tôi đang phát triển một ứng dụng web bằng Spring MVC 3 và có DispatcherServlettất cả các yêu cầu để '/' như vậy (web.xml):

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

Bây giờ điều này hoạt động như quảng cáo, tuy nhiên làm thế nào tôi có thể xử lý nội dung tĩnh? Trước đây, trước khi sử dụng URL RESTful, tôi đã bắt tất cả * .html chẳng hạn và gửi nó cho DispatcherServlet, nhưng bây giờ nó là một trò chơi bóng khác.

Tôi có một thư mục / static / bao gồm / style /, / js /, / hình ảnh / etc và tôi muốn loại trừ / static / * khỏi DispatcherServlet.

Bây giờ tôi có thể làm cho tài nguyên tĩnh hoạt động khi tôi làm điều này:

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/</url-pattern>
  </servlet-mapping>

Nhưng tôi muốn nó có các URL đẹp (quan điểm của tôi khi sử dụng Spring MVC 3) chứ không phải trang đích là www.domain.com/app/

Tôi cũng không muốn một giải pháp được ghép nối với tomcat hoặc bất kỳ vùng chứa servlet nào khác và vì đây là lưu lượng truy cập thấp (tương đối) nên tôi không cần một máy chủ web (như apache httpd).

Có một giải pháp sạch cho điều này?



@hamo Một chủ đề liên quan: stackoverflow.com/questions/34279705/ từ
smwikipedia

Câu trả lời:


266

Vì tôi đã dành rất nhiều thời gian cho vấn đề này, tôi nghĩ tôi sẽ chia sẻ giải pháp của mình. Kể từ mùa xuân 3.0.4, có một tham số cấu hình được gọi <mvc:resources/>(thông tin thêm về trang web tài liệu tham khảo ) có thể được sử dụng để phục vụ tài nguyên tĩnh trong khi vẫn sử dụng DispatchServlet trên thư mục gốc của trang web của bạn.

Để sử dụng, hãy sử dụng cấu trúc thư mục giống như sau:

src/
 springmvc/
  web/
   MyController.java
WebContent/
  resources/
   img/
    image.jpg
  WEB-INF/
    jsp/
      index.jsp
    web.xml
    springmvc-servlet.xml

Nội dung của các tập tin sẽ trông như:

src / springmvc / web / HelloWorldControll.java:

package springmvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping(value="/")
 public String index() {
  return "index";
 }
}

WebContent / WEB-INF / web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>

WebContent / WEB-INF / springmvc-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- not strictly necessary for this example, but still useful, see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-controller for more information -->
 <context:component-scan base-package="springmvc.web" />

    <!-- the mvc resources tag does the magic -->
 <mvc:resources mapping="/resources/**" location="/resources/" />

    <!-- also add the following beans to get rid of some exceptions -->
 <bean      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
 </bean>

    <!-- JSTL resolver -->
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass"
   value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
 </bean>

</beans>

WebContent / jsp / index.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>Page with image</h1>
<!-- use c:url to get the correct absolute path -->
<img src="<c:url value="/resources/img/image.jpg" />" />

Hi vọng điêu nay co ich :-)


12
Ví dụ này phải có trong hướng dẫn sử dụng Spring - đây là hướng dẫn tốt nhất tôi từng thấy về chủ đề này. Cảm ơn Joris!
Paul

Điều này chắc chắn đã tạo ra mánh khóe cho tôi - chỉ đơn thuần là lời khuyên của rozky là những gì tôi bắt đầu làm nhưng vì một số lý do, bất kỳ trang nào, ngoài trang chủ của tôi, đều hiển thị URL của tài nguyên so với trang - theo lời khuyên này sẽ hiển thị chúng tương đối thay vào đó, đến ngữ cảnh gốc của ứng dụng - và hoạt động hoàn hảo! Cảm ơn!
Bane

cảm ơn! Tôi đã nhổ tóc cho đến khi tôi thay đổi dòng: <mvc: resource maps = "/ resource / **" location = "/, classpath: / META-INF / web-resource /" /> thành <mvc: maps maps = "/ resource / **" location = "/ resource /" />
Đánh dấu D

2
Như @Bane đã chỉ ra, <c: url value = ... /> là một phần quan trọng của giải pháp này. Bạn sẽ (hoặc bất cứ ai) tâm trí cho tôi biết tại sao? Cảm ơn!
Đánh dấu

4
Bạn cũng có thể sử dụng <mvc: resource maps = "/ **" location = "/ resource /" /> và nó sẽ được ánh xạ tới thư mục gốc. (tức là: Root sẽ chứa cả tài nguyên VÀ jsps). Điều này có thể giúp bạn tiết kiệm bằng cách sử dụng c: url ở mọi nơi
efaj

46

Vấn đề này được giải quyết trong mùa xuân 3.0.4.RELEASE nơi bạn có thể sử dụng thành <mvc:resources mapping="..." location="..."/> phần cấu hình trong tệp cấu hình bộ điều phối mùa xuân.

Kiểm tra tài liệu mùa xuân


5
Mặc dù không thực sự "sai", câu trả lời này quá ngắn gọn vì tài liệu riêng của Spring (mà bạn gọi là câu trả lời của bạn) dường như đang thiếu một cái gì đó. Kiểm tra câu trả lời của Joris để có câu trả lời đầy đủ hơn ... không phải thực tế là nó dài mà thực tế là anh ta đề cập đến việc sử dụng <c: url ...> mà cả câu trả lời của bạn và Spring đều không đề cập đến - và điều đó đã chứng minh cho là một phần quan trọng của giải pháp.
Bane

38

Trong Spring 3.0.x, hãy thêm đoạn mã sau vào tệp servlet-config.xml của bạn (tệp được định cấu hình trong web.xml dưới dạng bối cảnhConfigLocation. Bạn cũng cần thêm không gian tên mvc nhưng chỉ cần google cho điều đó nếu bạn không biết cách !;)

Nó ổn với tôi

<mvc:default-servlet-handler/>

Trân trọng

Ayub Malik


khi tôi thêm dòng này, tôi nhận được: org.springframework.beans.factory.xml.XmlBeanDefTHERStoreException: Dòng 31 trong tài liệu XML từ tài nguyên đường dẫn lớp [META-INF / spring / application-context.xml] không hợp lệ; ngoại lệ lồng nhau là org.xml.sax.SAXPudeException; số dòng: 31; số cột: 35; cvc-Complex-type.2.4.c: Ký tự đại diện phù hợp là nghiêm ngặt, nhưng không thể tìm thấy khai báo nào cho phần tử 'mvc: default-servlet-handler'.
Alex Worden

Hãy chắc chắn để giải quyết theo thứ tự của trình xử lý khi bạn cũng có một số trình giải quyết chế độ xem khác.
phượng hoàng

20

Nếu tôi hiểu chính xác vấn đề của bạn, tôi nghĩ rằng tôi đã tìm ra giải pháp cho vấn đề của bạn:

Tôi đã có cùng một vấn đề trong đó đầu ra thô được hiển thị mà không tìm thấy kiểu css, javascripts hoặc jquery.

Tôi vừa thêm ánh xạ vào servlet "mặc định". Sau đây đã được thêm vào tệp web.xml:

 <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
 </servlet-mapping>

Điều này sẽ lọc ra các yêu cầu tệp javascript và css từ đối tượng DispatcherRequest.

Một lần nữa, không chắc đây có phải là những gì bạn đang theo đuổi không, nhưng nó đã làm việc cho tôi. Tôi nghĩ "default" là tên của servlet mặc định trong JBoss. Không quá chắc chắn những gì nó là cho các máy chủ khác.


1
Tôi thực sự không muốn sử dụng servlet mặc định - kết hợp tôi với jboss / tomcat
hamo

@hamo tại sao đó là một vấn đề? (đây là một câu hỏi chính hãng, không phải là một câu trả lời tranh luận). Bạn sẽ cần chạy máy chủ (jboss / tomcat / jetty) cho mùa xuân để chạy, phải không?
Manav

3
Và bạn có thể thêm tất cả <url-pattern>các thẻ bên trong giống nhau<servlet-mapping>
Milanka

16

Có một bài viết tràn ngăn xếp khác có một giải pháp tuyệt vời .

Nó dường như không phải là Tomcat cụ thể, đơn giản và hoạt động tuyệt vời. Tôi đã thử một vài giải pháp trong bài đăng này với spring mvc 3.1 nhưng sau đó gặp sự cố khi cung cấp nội dung động của tôi.

Tóm lại, nó nói thêm một ánh xạ servlet như thế này:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/images/*</url-pattern>
</servlet-mapping>

11

Tôi đã tìm thấy một cách xung quanh nó bằng cách sử dụng urlrewritefilter của tuckey. Xin vui lòng cho một câu trả lời tốt hơn nếu bạn có một!

Trong tệp webDB:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/*</url-pattern>
  </servlet-mapping>

Trong urlrewrite.xml:

<urlrewrite default-match-type="wildcard">
<rule>
    <from>/</from>
    <to>/app/</to>
</rule>
<rule match-type="regex">
    <from>^([^\.]+)$</from>
    <to>/app/$1</to>
</rule>
<outbound-rule>
    <from>/app/**</from>
    <to>/$1</to>
</outbound-rule>    

Điều này có nghĩa là bất kỳ uri nào có dấu '.' trong đó (như style.css chẳng hạn) sẽ không được viết lại.


5
Câu trả lời tốt hơn là của Spring 3 <mvc:resources/>, như được chứng minh bởi @Joris.
Paul

11

Tôi vừa mới vật lộn với vấn đề này trong Spring MVC 3.0 và ban đầu tôi đã sử dụng tùy chọn UrlRewriteFilter. Tuy nhiên tôi không hài lòng với giải pháp này vì nó "không cảm thấy đúng" (Tôi không phải là người duy nhất - xem liên kết ở trên với Diễn đàn Mùa xuân nơi từ "hack" xuất hiện một vài lần).

Vì vậy, tôi đã đưa ra một giải pháp tương tự như "Unknown (Google)" ở trên nhưng đã mượn ý tưởng có tất cả nội dung tĩnh được phục vụ từ / static / (được lấy từ phiên bản Spring Roo của ứng dụng Pet Store). Servlet "mặc định" không hoạt động với tôi nhưng Spring Webflow ResourceServlet đã làm (cũng được lấy từ ứng dụng được tạo bởi Spring Roo).

Web.xml:

<servlet>
    <servlet-name>mainDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>mainDispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

Sự thay đổi duy nhất tôi đã thực hiện đối với các tệp JSP là thêm / static / path vào các URL cho CSS, JS và hình ảnh. Ví dụ: "$ {pageContext.request.contextPath} /static/css/screen.css".

đối với người dùng Maven, sự phụ thuộc của "org.springframework.js.resource.ResourceServlet" là:

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>org.springframework.js</artifactId>
    <version>2.0.8.RELEASE</version>
</dependency>

Một nickdos giải pháp không tồi- cảm ơn bạn! Tôi vẫn không "hiểu" về lý do tại sao không có một dịch vụ tài nguyên trong lõi lò xo mvc (thay vì phải thêm một phụ thuộc khác vào luồng web) hoặc một số giải pháp khác ra khỏi hộp. Urlrewrite hoạt động tốt với tôi vì vậy tôi sẽ gắn bó với điều đó trong thời gian này! Chúc mừng, Hamo
hamo

2
Nhìn lại phiên bản tiêu chuẩn (không phải là Roo) của ứng dụng Spring Pet Clinic, tôi nhận thấy rằng định nghĩa của servlet cho "mặc định" được nhận xét với nhận xét bổ sung: "Bỏ ghi chú này trong các thùng chứa (GlassFish) không khai báo điều này định nghĩa ngầm ra khỏi hộp ". Khai báo gói rõ ràng cho mặc định là org.apache.cirthina.servlets.DefaultServlet. Vì vậy, đây có thể là servlet tài nguyên "ngoài luồng" của bạn (?). Tôi sử dụng Jetty cho công việc dev và có vẻ như Jetty không cung cấp một servlet mặc định ngầm (như Glassfish).
nickdos

8

Kinh nghiệm của riêng tôi với vấn đề này là như sau. Hầu hết các trang web và sách liên quan đến mùa xuân dường như gợi ý rằng cú pháp phù hợp nhất là sau đây.

    <mvc:resources mapping="/resources/**" location="/resources/" />

Cú pháp trên cho thấy rằng bạn có thể đặt tài nguyên tĩnh (CSS, JavaScript, hình ảnh) của mình vào thư mục có tên "tài nguyên" trong thư mục gốc của ứng dụng, tức là / webapp / resource /.

Tuy nhiên, theo kinh nghiệm của tôi (tôi đang sử dụng Eclipse và plugin Tomcat), cách tiếp cận duy nhất hiệu quả là nếu bạn đặt thư mục tài nguyên của mình bên trong WEB_INF (hoặc META-INF). Vì vậy, cú pháp tôi khuyên là như sau.

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

Trong tệp JSP của bạn (hoặc tương tự), hãy tham khảo tài nguyên như sau.

<script type="text/javascript"
        src="resources/my-javascript.js">
</script>

Không cần phải đề cập, toàn bộ câu hỏi chỉ phát sinh vì tôi muốn bộ điều phối Spring (bộ điều khiển phía trước) của tôi chặn mọi thứ, mọi thứ động, đó là. Vì vậy, tôi có những điều sau đây trong tệp web.xml của mình.

<servlet>
    <servlet-name>front-controller</servlet-name>
    <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    <!-- spring automatically discovers /WEB-INF/<servlet-name>-servlet.xml -->
</servlet>

<servlet-mapping>
    <servlet-name>front-controller</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Cuối cùng, vì tôi đang sử dụng các thực tiễn tốt nhất hiện tại, tôi có các mục sau trong bộ điều khiển phía trước servlet xml (xem bên trên).

<mvc:annotation-driven/>

Và tôi có những điều sau trong triển khai bộ điều khiển thực tế của mình, để đảm bảo rằng tôi có một phương thức mặc định để xử lý tất cả các yêu cầu đến.

@RequestMapping("/")

Tôi hi vọng cái này giúp được.


Đó là giải pháp duy nhất hiệu quả với tôi. Một điều thú vị tôi nhận thấy là các tài nguyên mới được thêm vào sau khi tôi khởi động ứng dụng web không tìm thấy cho đến khi khởi động lại. Không có ý nghĩa từ quan điểm người dùng, nhưng không phải lúc nào cũng là một vấn đề lớn.
Rafael Steil

Bạn đã nói với quan điểm Tomcat, tuyệt vời :)
omkar sirra

Tôi đã thử từng câu trả lời trên trang này. Rất may khi tôi đến cái này tôi sẽ không phải cố gắng nữa.
TimeTrax

6

Tôi có cùng một vấn đề và thấy câu trả lời của Joris rất hữu ích. Nhưng ngoài ra tôi cần thêm

<mvc:annotation-driven /> 

đến tập tin cấu hình servlet. Không có ánh xạ tài nguyên đó sẽ không hoạt động và tất cả các trình xử lý sẽ ngừng hoạt động. Hy vọng điều này sẽ giúp được ai đó.


2

URLRewrite là một loại "hack" nếu bạn muốn gọi nó là. Những gì nó được đưa ra là, bạn đang phát minh lại bánh xe; như đã có giải pháp Một điều cần nhớ là Máy chủ http = Nội dung tĩnh & Máy chủ ứng dụng = nội dung động (đây là cách chúng được thiết kế). Bằng cách ủy thác các trách nhiệm phù hợp cho mỗi máy chủ, bạn sẽ tối đa hóa hiệu quả ... nhưng hiện tại, điều này có lẽ chỉ là mối quan tâm trong môi trường quan trọng về hiệu suất và hầu như mọi thứ như Tomcat hầu như sẽ hoạt động tốt trong cả hai vai trò; nhưng nó vẫn là một cái gì đó để ghi nhớ không hơn không kém.


2

Tôi đã giải quyết nó theo cách này:

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

Điều này hoạt động trên Tomcat và ofcference Jboss. Tuy nhiên, cuối cùng tôi quyết định sử dụng giải pháp mà Spring cung cấp (như được đề cập bởi rozky), tính di động cao hơn nhiều.


2

Tôi đã sử dụng cả hai cách là urlrewrite và annotation dựa trên spring mvc 3.0.x và thấy rằng cách tiếp cận dựa trên chú thích là phù hợp nhất đó là

<annotation-driven />

<resources mapping="/resources/**" location="/resources/" />

Trong trường hợp urlrewrite, phải xác định nhiều quy tắc và đôi khi cũng nhận được lớp không tìm thấy ngoại lệ cho UrlRewriteFilter như đã cung cấp sự phụ thuộc cho nó. Tôi thấy rằng điều đó xảy ra do sự hiện diện của phụ thuộc bắc cầu, do đó, một bước nữa sẽ tăng lên và phải loại trừ sự phụ thuộc đó khỏi pom.xml bằng cách sử dụng

<exclusion></exclusion> tags.

Vì vậy, cách tiếp cận dựa trên chú thích sẽ là thỏa thuận tốt.


2

Từ Mùa xuân 3, tất cả các tài nguyên cần được ánh xạ theo một cách khác. Bạn cần sử dụng thẻ để chỉ định vị trí của các tài nguyên.

Thí dụ :

<mvc:resources mapping="/resources/**" location="/resources/" />

Bằng cách này, bạn đang hướng bộ điều phối servlet xem xét các tài nguyên thư mục để tìm nội dung tĩnh.


1

Cách giải quyết vấn đề này của tôi là đặt tất cả các hành động của bạn với một tiền tố cụ thể như "web" hoặc "dịch vụ" và định cấu hình rằng tất cả các url có tiền tố đó sẽ bị DispatcherServlet chặn lại.


1

Tôi chỉ cần thêm ba quy tắc trước quy tắc mặc định mùa xuân (/ **) vào urlrewritefilter (urlrewrite.xml) của tuckey để giải quyết vấn đề

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
    <urlrewrite default-match-type="wildcard">
     <rule>
      <from>/</from>
      <to>/app/welcome</to>
     </rule>
     <rule>
      <from>/scripts/**</from>
      <to>/scripts/$1</to>
     </rule>
     <rule>
      <from>/styles/**</from>
      <to>/styles/$1</to>
     </rule>
     <rule>
      <from>/images/**</from>
      <to>/images/$1</to>
     </rule>
     <rule>
      <from>/**</from>
      <to>/app/$1</to>
     </rule>
     <outbound-rule>
      <from>/app/**</from>
      <to>/$1</to>
     </outbound-rule> 
    </urlrewrite>

1

Tôi biết có một vài cấu hình để sử dụng nội dung tĩnh, nhưng giải pháp của tôi là tôi chỉ cần tạo một thư mục ứng dụng web số lượng lớn trong tomcat của bạn. "Webapp số lượng lớn" này chỉ phục vụ tất cả các nội dung tĩnh mà không phục vụ các ứng dụng. Đây là giải pháp dễ dàng và dễ dàng để phục vụ nội dung tĩnh cho ứng dụng web mùa xuân thực tế của bạn.

Ví dụ: tôi đang sử dụng hai thư mục webapp trên tomcat của mình.

  1. springapp : nó chỉ chạy ứng dụng web mùa xuân mà không có nội dung tĩnh như ims, js hoặc css. (dành riêng cho các ứng dụng mùa xuân.)
  2. tài nguyên : nó chỉ phục vụ các nội dung tĩnh mà không có JSP, servlet hoặc bất kỳ loại ứng dụng web java nào. (dành riêng cho nội dung tĩnh)

Nếu tôi muốn sử dụng javascript, tôi chỉ cần thêm URI cho tệp javascript của mình.

EX> /resource/path/to/js/myjavascript.js

Đối với hình ảnh tĩnh, tôi đang sử dụng cùng một phương pháp.

EX> /resource/path/to/img/myimg.jpg

Cuối cùng, tôi đặt " ràng buộc bảo mật " trên tomcat của mình để chặn quyền truy cập vào thư mục thực tế. Tôi đặt "không ai" cuộn người dùng vào ràng buộc để trang tạo ra "403 lỗi bị cấm" khi mọi người cố gắng truy cập đường dẫn nội dung tĩnh.

Cho đến nay nó hoạt động rất tốt cho tôi. Tôi cũng nhận thấy rằng nhiều trang web phổ biến như Amazon, Twitter và Facebook họ đang sử dụng các URI khác nhau để phục vụ nội dung tĩnh. Để tìm hiểu điều này, chỉ cần nhấp chuột phải vào bất kỳ nội dung tĩnh nào và kiểm tra URI của họ.


1

Điều này đã làm công việc thực sự trong trường hợp của tôi

trong tệp web:

...
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/images/*</url-pattern>
    <url-pattern>/css/*</url-pattern>
    <url-pattern>/javascripts/*</url-pattern>
</servlet-mapping>


<servlet-mapping>
    <servlet-name>spring-mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

...


1

Đối với cấu hình lò xo dựa trên java, bạn có thể sử dụng như sau

Sử dụng ResourceHandlerRegistry , nơi lưu trữ các đăng ký của trình xử lý tài nguyên để phục vụ tài nguyên tĩnh.

Thông tin thêm @ WebMvcConfigurerAdOG xác định các phương thức gọi lại để tùy chỉnh cấu hình dựa trên Java cho Spring MVC được kích hoạt thông qua @EnableWebMvc.

@EnableWebMvc
@Configurable
@ComponentScan("package.to.scan")
public class WebConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static_resource_path/*.jpg").addResourceLocations("server_destination_path");

    }

0

Sau khi gặp và trải qua quá trình ra quyết định tương tự được mô tả ở đây, tôi quyết định thực hiện với đề xuất ResourceServlet hoạt động khá độc đáo.

Lưu ý rằng bạn có thêm thông tin về cách sử dụng luồng web trong quy trình xây dựng maven của mình tại đây: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html

Nếu bạn sử dụng kho lưu trữ trung tâm Maven tiêu chuẩn, tạo phẩm là (ngược lại với gói nguồn được đề cập ở trên):

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>spring-js</artifactId>
    <version>2.0.9.RELEASE</version>
</dependency> 

0

Điều này có thể đạt được theo ít nhất ba cách.

Giải pháp :

  • hiển thị html dưới dạng tệp tài nguyên
  • hướng dẫn JspServlet xử lý các yêu cầu * .html
  • viết servlet của riêng bạn (hoặc chuyển đến các yêu cầu servlet khác hiện có vào * .html).

Để biết ví dụ mã hoàn chỉnh, làm thế nào để đạt được điều này, xin vui lòng trả lời câu trả lời của tôi trong một bài đăng khác: Làm thế nào để ánh xạ các yêu cầu tới tệp HTML trong Spring MVC?


0

Vấn đề là với URLPotype

Thay đổi mẫu URL của bạn trên ánh xạ servlet của bạn từ "/" thành "/ *"


0
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:default-servlet-handler/>
</beans>

và nếu bạn muốn sử dụng cấu hình dựa trên chú thích, hãy sử dụng mã bên dưới

@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

0

Đặt nội dung tĩnh như css, js trong đường dẫn sau

resources 
        ->static
               ->css
               ->js
(or) 
resources 
        ->public
               ->css
               ->js
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.