2011-08-07 80 views
20

Tôi đang viết một ứng dụng web bằng Spring MVC. Tôi đang sử dụng chú thích cho bộ điều khiển, vv Mọi thứ đều hoạt động tốt, ngoại trừ khi liên quan đến các liên kết thực tế trong ứng dụng (mẫu hành động, <a> thẻ, v.v.) Hiện tại, tôi có điều này (rõ ràng là viết tắt):Spring MVC Yêu cầu URL trong JSP

//In the controller 
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET) 

//In the JSP 
<a href="/admin/listPeople">Go to People List</a> 

Khi tôi trực tiếp nhập URL như "http: // localhost: 8080/MyApp/admin/listPeople", trang tải chính xác. Tuy nhiên, liên kết trên không hoạt động. Nó mất tên ứng dụng "MyApp".

Có ai biết liệu có cách nào để định cấu hình Spring để ném vào tên ứng dụng không?

Hãy cho tôi biết nếu bạn cần xem bất kỳ cấu hình mùa xuân nào của tôi. Tôi đang sử dụng servlet điều phối tiêu chuẩn với trình phân giải chế độ xem, v.v.

+1

Điều này có thể vào mùa xuân 3.0 với '">People' –

Trả lời

43

Bạn cần thêm đường dẫn ngữ cảnh vào liên kết của mình.

// somewhere on the top of your JSP 
<c:set var="contextPath" value="${pageContext.request.contextPath}"/> 

... 
<a href="${contextPath}/admin/listPeople">Go to People List</a> 
+0

+1 Cảm ơn, tôi nghĩ về điều này nhưng tôi muốn làm điều đó với Spring bằng cách nào đó. –

+2

Không có cách "Spring" để làm điều này :) Chỉ có tùy chọn giúp bạn tiết kiệm từ $ {contextPath} trước cho các liên kết của bạn là bạn triển khai ứng dụng của bạn dưới dạng root, để đường dẫn ngữ cảnh là "/" (như Kevin đã mô tả); nhưng tôi sẽ không đề nghị phương pháp này vì nó sẽ làm cho ứng dụng của bạn phụ thuộc vào việc triển khai nó. – craftsman

+0

Ngoài ra còn có một cách với server.xml nếu tôi nhớ chính xác. – Kevin

0

Tôi thường định cấu hình tomcat để sử dụng ngữ cảnh gốc của "/" hoặc triển khai chiến tranh dưới dạng ROOT.war. Dù bằng cách nào, tên chiến tranh không trở thành một phần của URL.

6

Tôi thích sử dụng thẻ BASE:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" /> 

Sau đó, tất cả các liên kết của bạn có thể giống như:

<a href="admin/listPeople">Go to People List</a> 
+0

Tôi khuyên bạn nên đọc điều này trước khi sử dụng thẻ cơ sở: http://stackoverflow.com/questions/1889076/is-it-recommended-to-use-the-base-html-tag –

13

Thẻ c:url sẽ nối đường dẫn ngữ cảnh để URL của bạn. Ví dụ:

<c:url value="/admin/listPeople"/> 

Cách khác, tôi thích sử dụng URL tương đối nhiều nhất có thể trong ứng dụng Spring MVC của mình. Vì vậy, nếu trang ở số /MyApp/index, liên kết <a href="admin/listPeople"> sẽ đưa tôi đến trang listPeople.

Điều này cũng hoạt động nếu bạn hiểu sâu hơn về thứ bậc URL. Bạn có thể sử dụng số .. để lướt qua một cấp. Vì vậy, trên trang tại /MyApp/admin/people/aPerson, sử dụng <a href="../listPeople"> sẽ thích quay lại trang danh sách

0

Bạn có thể sử dụng một servletRelativeAction. Tôi không chắc chắn những gì các phiên bản này có sẵn trong (Tôi đang sử dụng 4.0.x hiện tại) và tôi đã không nhìn thấy nhiều tài liệu về điều này, nhưng nếu bạn nhìn vào mã sao hình thức mùa xuân bạn có thể đoán. Chỉ cần chắc chắn rằng con đường bạn vượt qua nó bắt đầu với một "/".

Ví dụ:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check" method="POST"> 

Xem org.springframework.web.servlet.tags.form.FormTag:

protected String resolveAction() throws JspException { 
    String action = getAction(); 
    String servletRelativeAction = getServletRelativeAction(); 
    if (StringUtils.hasText(action)) { 
     action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action)); 
     return processAction(action); 
    } 
    else if (StringUtils.hasText(servletRelativeAction)) { 
     String pathToServlet = getRequestContext().getPathToServlet(); 
     if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) { 
      servletRelativeAction = pathToServlet + servletRelativeAction; 
     } 
     servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction)); 
     return processAction(servletRelativeAction); 
    } 
    else { 
     String requestUri = getRequestContext().getRequestUri(); 
     ServletResponse response = this.pageContext.getResponse(); 
     if (response instanceof HttpServletResponse) { 
      requestUri = ((HttpServletResponse) response).encodeURL(requestUri); 
      String queryString = getRequestContext().getQueryString(); 
      if (StringUtils.hasText(queryString)) { 
       requestUri += "?" + HtmlUtils.htmlEscape(queryString); 
      } 
     } 
     if (StringUtils.hasText(requestUri)) { 
      return processAction(requestUri); 
     } 
     else { 
      throw new IllegalArgumentException("Attribute 'action' is required. " + 
        "Attempted to resolve against current request URI but request URI was null."); 
     } 
    } 
} 
4

Như tôi đã chỉ đang cố gắng tìm ra câu trả lời cho câu hỏi này và điều này là kết quả google đầu tiên.

Điều này có thể được thực hiện tại bằng cách sử dụng MvcUriComponentsBuilder

Đây là một phần của 4.phiên bản 0 của Spring MVC

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

Phương pháp cần thiết là fromMappingName

Từ các tài liệu:

Tạo một URL từ tên của bản đồ theo yêu cầu một bộ điều khiển Spring MVC phương pháp của. Cấu hình HandlerMethodMappingNamingStrategy xác định tên của ánh xạ yêu cầu phương thức điều khiển khi khởi động. Theo mặc định, tất cả ánh xạ được gán tên dựa trên các chữ cái viết hoa của tên lớp, theo sau là dấu "#" làm dấu phân cách và sau đó là tên phương thức. Ví dụ "PC# getPerson" cho một lớp có tên PersonController với phương thức getPerson. Trong trường hợp quy ước đặt tên không tạo ra kết quả duy nhất, tên rõ ràng có thể được chỉ định thông qua thuộc tính name của chú thích @RequestMapping.

Đây là mục đích chủ yếu để sử dụng trong công nghệ hiển thị chế độ xem và biểu thức EL. Thư viện thẻ URL của mùa xuân đăng ký phương thức này dưới dạng hàm được gọi là "mvcUrl".

Ví dụ, với bộ điều khiển này:

@RequestMapping("/people") 
class PersonController { 

    @RequestMapping("/{id}") 
    public HttpEntity getPerson(@PathVariable String id) { ... } 

} 

Một JSP có thể chuẩn bị một URL với phương pháp điều khiển như sau:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> 

<a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a> 
Các vấn đề liên quan