วิธีจัดการกับเนื้อหาคงที่ใน Spring MVC


200

ฉันกำลังพัฒนา webapp โดยใช้ Spring MVC 3 และมีการDispatcherServletร้องขอทั้งหมดเพื่อ '/' like so (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>

ตอนนี้ใช้งานได้ตามที่โฆษณาไว้แล้ว แต่ฉันจะจัดการกับเนื้อหาสแตติกได้อย่างไร ก่อนหน้านี้ก่อนที่จะใช้ RESTful URL ฉันจะได้รับตัวอย่าง * .html ทั้งหมดและส่งไปที่DispatcherServletแต่ตอนนี้มันเป็นเกมบอลที่แตกต่างกัน

ฉันมี / คงที่ / โฟลเดอร์ซึ่งรวมถึงการ / รูปแบบ / / js / / images / ฯลฯ และผมอยากจะยกเว้น / คงที่ / * DispatcherServletจาก

ตอนนี้ฉันสามารถทำให้ทรัพยากรคงที่ทำงานได้เมื่อฉันทำสิ่งนี้:

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

แต่ฉันต้องการให้มี URL ที่ดี (จุดที่ฉันใช้ Spring MVC 3) ไม่ใช่หน้าที่เชื่อมโยงไปถึงเป็น www.domain.com/app/

ฉันไม่ต้องการโซลูชันควบคู่ไปกับ Tomcat หรือ servlet container อื่นและเพราะนี่คือปริมาณการใช้งานที่ค่อนข้างต่ำฉันไม่ต้องการเว็บเซิร์ฟเวอร์ (เช่น apache httpd) หน้าเว็บ

มีวิธีแก้ปัญหาแบบนี้หรือเปล่า?


1
กวดวิชาที่เกี่ยวข้อง: ฤดูใบไม้ผลิ MVC - วิธีการรวมถึง JS หรือไฟล์ CSS ในหน้า
informatik01

@hamo หัวข้อที่เกี่ยวข้อง: stackoverflow.com/questions/34279705/…
smwikipedia

คำตอบ:


266

เนื่องจากฉันใช้เวลามากกับปัญหานี้ฉันคิดว่าฉันจะแบ่งปันวิธีแก้ปัญหาของฉัน ตั้งแต่ฤดูใบไม้ผลิ 3.0.4 มีพารามิเตอร์การกำหนดค่าที่เรียกว่า<mvc:resources/>(เพิ่มเติมเกี่ยวกับที่บนเว็บไซต์เอกสารอ้างอิง ) ซึ่งสามารถใช้เพื่อให้บริการทรัพยากรคงที่ในขณะที่ยังคงใช้ DispatchServlet บนรากของเว็บไซต์ของคุณ

ในการใช้สิ่งนี้ให้ใช้โครงสร้างไดเรกทอรีที่มีลักษณะดังนี้:

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

เนื้อหาของไฟล์ควรมีลักษณะดังนี้:

src / springmvc / เว็บ / HelloWorldController.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" />" />

หวังว่านี่จะช่วย :-)


12
ตัวอย่างนี้ควรอยู่ในคู่มือผู้ใช้ Spring - เป็นสิ่งที่ดีที่สุดที่ฉันเคยเห็นในหัวข้อนี้ ขอบคุณ Joris!
พอล

นี่เป็นการหลอกลวงสำหรับฉัน - เพียงคำแนะนำของ rozky คือสิ่งที่ฉันเริ่มทำ แต่ด้วยเหตุผลใดก็ตามหน้าใด ๆ นอกเหนือจากหน้าแรกของฉันคือการแสดงผลทรัพยากรของ URL เทียบกับหน้า - ทำตามคำแนะนำนี้ทำให้พวกเขาสัมพันธ์ ไปที่รูทบริบทของแอปของฉันแทน - และทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณ!
ความหายนะ

ขอบคุณ! ฉันดึงผมออกมาจนกระทั่งเปลี่ยนบรรทัด: <mvc: resources mapping = "/ resources / **" location = "/, classpath: / META-INF / web-resources /" /> เป็น <mvc: การจับคู่ทรัพยากร = "/ resources / **" location = "/ resources /" />
ทำเครื่องหมาย D

2
ตามที่ @Bane ชี้ให้เห็นว่า <c: url value = ... /> เป็นส่วนสำคัญของโซลูชันนี้ คุณ (หรือใครก็ได้) คิดจะบอกฉันทำไม ขอบคุณ!
ทำเครื่องหมาย

4
คุณยังสามารถใช้ <mvc: resources mapping = "/ **" location = "/ resources /" /> และจะถูกแมปกับรูท (เช่น: รูทจะมีทั้งทรัพยากรและ jsps) สิ่งนี้สามารถช่วยคุณประหยัดได้โดยใช้ c: url ได้ทุกที่
efaj

46

ปัญหานี้ได้รับการแก้ไขในฤดูใบไม้ผลิ 3.0.4 ปล่อยที่ซึ่งคุณสามารถใช้ <mvc:resources mapping="..." location="..."/> องค์ประกอบการกำหนดค่าในแฟ้มการกำหนดค่าตัวกระจายฤดูใบไม้ผลิของคุณ

ตรวจสอบSpring Documentation


5
แม้ว่าจะไม่ใช่ "ผิด" จริง ๆ คำตอบนี้สั้นเกินไปเพราะเอกสารของ Spring (ซึ่งคุณอ้างถึงเป็นคำตอบ) ดูเหมือนจะหายไปบางอย่าง ตรวจสอบคำตอบของ Joris เพื่อหาคำตอบที่สมบูรณ์ยิ่งขึ้น ... ไม่ใช่ความจริงที่ว่ายาวเกินไป แต่ความจริงที่ว่าเขากล่าวถึงการใช้ <c: url ... > ซึ่งไม่ใช่คำตอบของคุณหรือ dox ของ Spring ที่พูดถึง - และพิสูจน์แล้วว่า เป็นส่วนสำคัญของการแก้ปัญหา
สารพิษ

38

ใน Spring 3.0.x เพิ่มสิ่งต่อไปนี้ใน servlet-config.xml ของคุณ (ไฟล์ที่กำหนดค่าใน web.xml เป็น contextConfigLocation คุณต้องเพิ่ม mvc namespace ด้วยเช่นกัน แต่เพียงแค่ google หากคุณไม่ทราบวิธี !;)

ที่เหมาะกับฉัน

<mvc:default-servlet-handler/>

ความนับถือ

Ayub Malik


เมื่อฉันเพิ่มบรรทัดนี้ฉันได้รับ: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: บรรทัดที่ 31 ในเอกสาร XML จากทรัพยากรพา ธ ของคลาส [META-INF / spring / application-context.xml] ไม่ถูกต้อง ข้อยกเว้นซ้อนคือ org.xml.sax.SAXParseException; หมายเลขบรรทัด: 31; คอลัมน์จำนวน: 35; cvc-complex-type.2.4.c: wildcard ที่ตรงกันมีความเข้มงวด แต่ไม่พบการประกาศสำหรับองค์ประกอบ 'mvc: default-servlet-handler'
Alex Worden

ให้แน่ใจว่าจัดการกับคำสั่งของตัวจัดการเมื่อคุณมีตัวแก้ไขมุมมองอื่น ๆ ด้วย
ฟีนิกซ์

20

หากฉันเข้าใจปัญหาของคุณอย่างถูกต้องฉันคิดว่าฉันพบวิธีแก้ไขปัญหาของคุณแล้ว:

ฉันมีปัญหาเดียวกันกับที่แสดงผลดิบโดยไม่พบรูปแบบ css, javascripts หรือ jquery files

ฉันเพิ่งเพิ่มการแมปไปยังเซิร์ฟเล็ต "ค่าเริ่มต้น" ต่อไปนี้ถูกเพิ่มในไฟล์ 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>

สิ่งนี้ควรกรองคำขอไฟล์ javascript และ css จากวัตถุ DispatcherRequest

อีกครั้งไม่แน่ใจว่านี่คือสิ่งที่คุณเป็น แต่มันได้ผลสำหรับฉัน ฉันคิดว่า "default" เป็นชื่อของเซิร์ฟเล็ตเริ่มต้นภายใน JBoss ไม่แน่ใจเหมือนกันว่ามันมีไว้สำหรับเซิร์ฟเวอร์อื่น


1
ที่จริงผมไม่ต้องการที่จะใช้ servlet- เริ่มต้นที่คู่ฉันไป JBoss / โพง
hamo

@ โธ่ทำไมเป็นปัญหา? (นี่เป็นคำถามของแท้ไม่ใช่การโต้กลับโต้แย้ง) คุณจะต้องใช้เซิร์ฟเวอร์ (jboss / tomcat / jetty) เพื่อให้สปริงรันใช่ไหม?
Manav

3
และคุณสามารถเพิ่ม<url-pattern>แท็กทั้งหมดในแบบเดียวกัน<servlet-mapping>
Milanka

16

มีอีกโพสต์ล้นล้นที่มีทางออกที่ดีทางออกที่ดี

ดูเหมือนจะไม่เจาะจง Tomcat ง่ายและใช้งานได้ดี ฉันได้ลองใช้วิธีแก้ไขปัญหาสองสามข้อในโพสต์นี้ด้วย spring mvc 3.1 แต่มีปัญหาในการรับบริการเนื้อหาแบบไดนามิก

โดยสังเขปมันบอกว่าเพิ่มการทำแผนที่ servlet เช่นนี้

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

11

ฉันพบวิธีรอบ ๆ มันโดยใช้ urlrewritefilter ของ tuckey โปรดอย่าลังเลที่จะให้คำตอบที่ดีกว่าถ้าคุณมี!

ใน web.xml:

<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>

ใน 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>    

ซึ่งหมายความว่า uri ใด ๆ ที่มี '.' ในนั้น (เช่น style.css เป็นต้น) จะไม่ถูกเขียนใหม่


5
คำตอบที่ดีกว่าคือ Spring 3 <mvc:resources/>ตามที่แสดงโดย @Joris
Paul

11

ฉันเพิ่งได้รับการต่อสู้กับปัญหานี้ใน Spring MVC 3.0 และตอนแรกฉันไปกับตัวเลือก UrlRewriteFilter อย่างไรก็ตามฉันไม่พอใจกับการแก้ปัญหานี้เพราะ "รู้สึกไม่ถูก" (ฉันไม่ใช่คนเดียว - ดูลิงก์ด้านบนไปยังฟอรัมสปริงที่ซึ่งคำว่า "แฮ็ค" ปรากฏขึ้นสองสามครั้ง)

ดังนั้นฉันจึงคิดวิธีแก้ปัญหาคล้ายกับ "ไม่ทราบ (Google)" ด้านบน แต่ยืมความคิดที่มีเนื้อหาคงที่ทั้งหมดที่ให้บริการจาก / คงที่ / (นำมาจากรุ่น Spring Roo ของแอพ Pet Store) เซิร์ฟเล็ต "ดีฟอลต์" ไม่ทำงานสำหรับฉัน แต่ Spring Webflow ResourceServlet ทำ (นำมาจากแอปที่สร้างจาก 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>

การเปลี่ยนแปลงเดียวที่ฉันทำกับ JSP คือการเพิ่ม / static / path เข้ากับ URL สำหรับ CSS, JS และรูปภาพ เช่น "$ {pageContext.request.contextPath} /static/css/screen.css"

สำหรับผู้ใช้ Maven การพึ่งพาสำหรับ "org.springframework.js.resource.ResourceServlet" คือ:

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

ไม่ใช่ทางออกที่ไม่ดี Nickdos- ขอบคุณ! ฉันยังไม่ได้ "เข้าใจ" ว่าทำไมไม่มี servlet ทรัพยากรใน core spring mvc (แทนที่จะต้องเพิ่มการพึ่งพาเว็บ flow) หรือโซลูชันอื่น ๆ นอกกรอบ Urlrewrite ทำงานได้ดีสำหรับฉันดังนั้นฉันจะยึดติดกับที่ในขณะนี้! ไชโย, Hamo
hamo

2
เมื่อมองย้อนกลับไปที่แอพ Spring Pet Clinic รุ่นมาตรฐาน (ไม่ใช่รู) ฉันสังเกตเห็นว่าคำจำกัดความของ servlet สำหรับคำว่า "ค่าเริ่มต้น" ถูกคอมเม้นท์พร้อมความคิดเห็นเพิ่มเติม: "ไม่ใส่เครื่องหมายข้อคิดเห็นนี้ในคอนเทนเนอร์ (GlassFish) ที่ไม่ประกาศสิ่งนี้ คำจำกัดความโดยปริยายนอกกรอบ ". ประกาศแพคเกจที่ชัดเจนสำหรับการเริ่มต้นคือ org.apache.catalina.servlets.DefaultServlet ดังนั้นนี่อาจเป็น Resource servlet "นอกกรอบ" ของคุณ ฉันใช้ Jetty สำหรับงาน dev และดูเหมือนว่า Jetty ไม่ได้ให้ servlet เริ่มต้นโดยปริยาย (เช่น Glassfish)
nickdos

8

ประสบการณ์ของฉันเกี่ยวกับปัญหานี้มีดังต่อไปนี้ หน้าเว็บและหนังสือที่เกี่ยวข้องกับสปริงส่วนใหญ่ดูเหมือนจะแนะนำว่าไวยากรณ์ที่เหมาะสมที่สุดมีดังต่อไปนี้

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

ไวยากรณ์ข้างต้นแสดงให้เห็นว่าคุณสามารถวางทรัพยากรแบบคงที่ (CSS, JavaScript, ภาพ) ในโฟลเดอร์ชื่อ "ทรัพยากร" ในรูทของแอปพลิเคชันของคุณเช่น / webapp / resources /

อย่างไรก็ตามในประสบการณ์ของฉัน (ฉันใช้ Eclipse และปลั๊กอิน Tomcat) วิธีเดียวที่ทำงานคือถ้าคุณวางโฟลเดอร์ทรัพยากรของคุณไว้ใน WEB_INF (หรือ META-INF) ดังนั้นไวยากรณ์ที่ฉันแนะนำคือต่อไปนี้

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

ใน JSP ของคุณ (หรือคล้ายกัน) อ้างอิงทรัพยากรดังต่อไปนี้

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

ไม่จำเป็นต้องพูดถึงคำถามทั้งหมดเกิดขึ้นเพราะฉันต้องการให้ servlet ของ Spring dispatcher (ผู้ควบคุมด้านหน้า) ขัดขวางทุกอย่าง ดังนั้นฉันมีดังต่อไปนี้ใน web.xml ของฉัน

<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>

ในที่สุดเนื่องจากฉันใช้แนวปฏิบัติที่ดีที่สุดในปัจจุบันฉันจึงมีสิ่งต่อไปนี้ใน servlet xml ของคอนโทรลเลอร์ด้านหน้าของฉัน

<mvc:annotation-driven/>

และฉันมีสิ่งต่อไปนี้ในการใช้งานคอนโทรลเลอร์จริงของฉันเพื่อให้แน่ใจว่าฉันมีวิธีการเริ่มต้นเพื่อจัดการคำขอที่เข้ามาทั้งหมด

@RequestMapping("/")

ฉันหวังว่านี่จะช่วยได้.


นั่นเป็นทางออกเดียวที่เหมาะกับฉัน สิ่งที่น่าสนใจอย่างหนึ่งที่ฉันสังเกตเห็นคือทรัพยากรใหม่ที่เพิ่มเข้ามาหลังจากที่ฉันเริ่มเว็บแอพไม่พบจนกระทั่งรีสตาร์ท ไม่สมเหตุสมผลจากมุมมองของผู้ใช้ แต่ไม่ควรเป็นปัญหาที่สำคัญเป็นส่วนใหญ่
Rafael Steil

คุณบอกกับมุมมองของ Tomcat, น่ากลัว :)
sirra Omkar

ฉันลองแต่ละคำตอบในหน้านี้ โชคดีที่เมื่อฉันมาถึงที่นี่ฉันไม่ต้องลองอีกต่อไป
TimeTrax

6

ฉันพบปัญหาเดียวกันและพบว่าคำตอบของ Joris มีประโยชน์มาก แต่นอกจากนี้ฉันต้องเพิ่ม

<mvc:annotation-driven /> 

ไปยังไฟล์ config ของ servlet หากไม่มีการแมปทรัพยากรนั้นจะไม่ทำงานและเครื่องมือจัดการทั้งหมดจะหยุดทำงาน หวังว่านี่จะช่วยใครซักคน


2

URLRewrite นั้นเป็น "แฮ็ค" หากคุณต้องการเรียกมันว่า สิ่งที่เกิดขึ้นคือคุณกำลังคิดค้นวงล้อใหม่ เนื่องจากมีวิธีแก้ไขอยู่แล้ว สิ่งที่ควรจดจำอีกอย่างคือ Http Server = เนื้อหาแบบคงที่และเซิร์ฟเวอร์แอพ = เนื้อหาแบบไดนามิก (นี่คือวิธีการออกแบบ) ด้วยการมอบความรับผิดชอบที่เหมาะสมให้กับเซิร์ฟเวอร์แต่ละเครื่องคุณจะได้เพิ่มประสิทธิภาพสูงสุด ... แต่วันนี้อาจเป็นเพียงข้อกังวลในสภาพแวดล้อมที่มีความสำคัญต่อประสิทธิภาพและสิ่งที่ Tomcat น่าจะทำงานได้ดีที่สุดในทั้งสองบทบาทส่วนใหญ่ แต่ก็ยังมีบางสิ่งที่ต้องจำไว้ไม่น้อย


2

ฉันแก้ไขมันด้วยวิธีนี้:

<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>

สิ่งนี้ใช้ได้กับ Tomcat และ ofcourse Jboss อย่างไรก็ตามในท้ายที่สุดฉันตัดสินใจใช้โซลูชันสปริงจัดหา (ตามที่กล่าวไว้โดย rozky) ซึ่งพกพาได้ไกลกว่ามาก


2

ฉันใช้ทั้งสองวิธีที่เป็น urlrewrite และหมายเหตุประกอบใน spring mvc 3.0.x และพบว่าวิธีการใช้คำอธิบายประกอบนั้นเหมาะสมที่สุดที่จะเป็น

<annotation-driven />

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

ในกรณีของ urlrewrite ต้องกำหนดกฎจำนวนมากและบางครั้งยังได้รับคลาสไม่พบข้อยกเว้นสำหรับ UrlRewriteFilter ตามที่ได้จัดเตรียมไว้สำหรับมันแล้ว ฉันพบว่ามันเกิดขึ้นเนื่องจากการปรากฏตัวของการพึ่งพาสกรรมกริยาดังนั้นอีกหนึ่งขั้นตอนจะเพิ่มขึ้นและต้องแยกการพึ่งพาจาก pom.xml ที่ใช้

<exclusion></exclusion> tags.

ดังนั้นแนวทางที่ใช้คำอธิบายประกอบจะเป็นข้อเสนอที่ดี


2

จาก Spring 3 ทรัพยากรทั้งหมดต้องแมปด้วยวิธีที่แตกต่าง คุณต้องใช้แท็กเพื่อระบุตำแหน่งของทรัพยากร

ตัวอย่าง:

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

ด้วยการทำเช่นนี้คุณกำลังสั่งให้ dispatcher servlet ค้นหาทรัพยากรไดเรกทอรีเพื่อค้นหาเนื้อหาสแตติก


1

วิธีของฉันในการแก้ปัญหานี้คือการวางการกระทำทั้งหมดของคุณด้วยคำนำหน้าเฉพาะเช่น "เว็บ" หรือ "บริการ" และกำหนดค่าว่า URL ทั้งหมดที่มีคำนำหน้านั้นจะถูกดักจับโดย DispatcherServlet


1

ฉันเพิ่งเพิ่มสามกฎก่อนฤดูใบไม้ผลิกฎเริ่มต้น (/ **) เพื่อ urlrewritefilter ของ tuckey (urlrewrite.xml) เพื่อแก้ปัญหา

<?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

ฉันรู้ว่ามีการกำหนดค่าบางอย่างเพื่อใช้เนื้อหาแบบสแตติก แต่โซลูชันของฉันคือฉันเพิ่งสร้างโฟลเดอร์แอปพลิเคชันเว็บจำนวนมากภายใน Tomcat ของคุณ "webapp จำนวนมาก" นี้ให้บริการเฉพาะเนื้อหาคงที่ทั้งหมดโดยไม่ต้องแสดงแอพ นี่เป็นวิธีที่ไม่เจ็บปวดและใช้ง่ายสำหรับการให้บริการเนื้อหาแบบคงที่กับ webapp ฤดูใบไม้ผลิที่แท้จริงของคุณ

ตัวอย่างเช่นฉันใช้สอง webapp โฟลเดอร์บนโพงของฉัน

  1. springapp : ทำงานเฉพาะเว็บแอปพลิเคชั่นสปริงที่ไม่มีเนื้อหาคงที่เช่น imgs, js หรือ css (เฉพาะสำหรับแอพสปริง)
  2. แหล่งข้อมูล : มันจะให้บริการเฉพาะเนื้อหาคงที่โดยไม่ต้อง JSP, servlet หรือประเภทใด ๆ ของเว็บแอปพลิเคชันจาวา (เฉพาะสำหรับเนื้อหาคงที่)

ถ้าฉันต้องการใช้จาวาสคริปต์ฉันเพียงแค่เพิ่ม URI สำหรับไฟล์จาวาสคริปต์ของฉัน

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

สำหรับภาพนิ่งฉันใช้วิธีเดียวกัน

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

สุดท้ายฉันใส่ " ข้อ จำกัด ด้านความปลอดภัย " บน Tomcat ของฉันเพื่อป้องกันการเข้าถึงไดเรกทอรีจริง ฉันใส่ผู้ใช้ "ไม่มีใคร" ลงในข้อ จำกัด เพื่อให้หน้าสร้าง "ข้อผิดพลาดต้องห้าม 403" เมื่อผู้คนพยายามเข้าถึงเส้นทางเนื้อหาคงที่

จนถึงตอนนี้มันใช้งานได้ดีมากสำหรับฉัน ฉันยังสังเกตเห็นว่าเว็บไซต์ยอดนิยมมากมายเช่น Amazon, Twitter และ Facebook พวกเขากำลังใช้ URI ที่แตกต่างกันสำหรับการให้บริการเนื้อหาคงที่ เพื่อหาข้อมูลนี้เพียงคลิกขวาที่เนื้อหาคงที่และตรวจสอบ URI ของพวกเขา


1

นี่เป็นงานจริงในกรณีของฉัน

ใน web.xml:

...
<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

สำหรับการกำหนดค่าสปริงตามจาวาคุณสามารถใช้ดังต่อไปนี้

การใช้ResourceHandlerRegistryซึ่งเก็บการลงทะเบียนของตัวจัดการทรัพยากรสำหรับการให้บริการทรัพยากรคงที่

ข้อมูลเพิ่มเติม @ WebMvcConfigurerAdapterซึ่งกำหนดวิธีการโทรกลับเพื่อปรับแต่งการกำหนดค่าที่ใช้ Java สำหรับ Spring MVC เปิดใช้งานผ่าน @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

หลังจากเผชิญหน้าและทำตามกระบวนการตัดสินใจเดียวกับที่อธิบายไว้ที่นี่ฉันตัดสินใจไปกับข้อเสนอ ResourceServlet ซึ่งทำงานได้ค่อนข้างดี

โปรดทราบว่าคุณได้รับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ webflow ในกระบวนการสร้าง maven ของคุณที่นี่: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html

หากคุณใช้แหล่งเก็บข้อมูลส่วนกลาง Maven มาตรฐานสิ่งประดิษฐ์คือ (ตรงข้ามกับชุดแหล่งสปริงที่อ้างถึงด้านบน):

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

0

สามารถทำได้อย่างน้อยสามวิธี

โซลูชั่น :

  • เปิดเผย html เป็นไฟล์ทรัพยากร
  • สั่งให้ JspServlet จัดการกับคำขอ * .html ด้วย
  • เขียนเซิร์ฟเล็ตของคุณเอง (หรือส่งต่อไปยังเซิร์ฟเล็ตอื่นที่มีอยู่ร้องขอไปยัง * .html)

สำหรับตัวอย่างโค้ดแบบสมบูรณ์วิธีการบรรลุเป้าหมายโปรดตอบคำตอบของฉันในโพสต์อื่น: จะแมปคำขอไฟล์ HTML ใน Spring MVC ได้อย่างไร



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>

และถ้าคุณต้องการใช้การกำหนดค่าตามหมายเหตุประกอบใช้ด้านล่างรหัส

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.