2012-01-07 28 views
5

Tôi đã viết một ứng dụng Spring MVC thực sự đơn giản. Tôi xin lỗi vì tôi khá mới với Spring MVC nên chịu đựng tôi.Bản đồ servlet SpringMVC

Các web.xml như sau

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" 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_2_5.xsd"> 

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/root-context.xml</param-value> 
    </context-param> 

    <!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

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

</web-app> 

câu hỏi đầu tiên của tôi là, tôi có một trang jsp để đăng nhập với đoạn mã sau ...

<form action="/login" method="post" > 
Username : <input name="username" type="text" /> 
Password : <input name="password" type="password" /> 
<input type="submit" /> 
</form> 

Điều này cho phép 404 nhưng trong Bộ điều khiển của tôi, tôi đã ánh xạ bộ điều khiển đến/đăng nhập bằng mã bên dưới ...

@Controller 
public class LoginController { 

    private static final Logger logger = LoggerFactory.getLogger(LoginController.class); 

    /** 
    * Simply selects the home view to render by returning its name. 
    */ 
    @RequestMapping(value = "/login", method = RequestMethod.POST) 
    public String home(Locale locale, Model model, String username, String password) { 

     if(username.equalsIgnoreCase("david")) 
     { 
      logger.info("Welcome home! the client locale is "+ locale.toString()); 

      Date date = new Date(); 
      DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

      String formattedDate = dateFormat.format(date); 

      model.addAttribute("serverTime", formattedDate); 

      return "home"; 
     } 
     else 
     { 
      return "void"; 
     } 

    } 

} 

Sự hiểu biết của tôi là @requestm apping nên làm bản đồ servlet hơn là trong web.xml, điều này có đúng không? Giá trị của /WEB-INF/spring/appServlet/servlet-context.xml cũng được hiển thị bên dưới nếu cần.

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

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 

    <!-- Enables the Spring MVC @Controller programming model --> 
    <annotation-driven /> 

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

    <context:component-scan base-package="org.david.myapp" /> 



</beans:beans> 

Vì vậy, câu hỏi đầu tiên của tôi là: được ánh xạ servlet thực hiện trong web.xml hoặc tại @requestmapping trong lớp điều khiển?

Câu hỏi thứ hai: cách tốt nhất để kiến ​​trúc sư này có nhiều trang hơn, liệu tôi có nên tiếp tục thêm vào webxml không? Tôi có nên tạo bộ điều khiển cho mọi url không? Tôi có nên tạo một ngữ cảnh servlet cho mỗi url không?

Cảm ơn bạn đã đọc :)

+0

tôi didnt kiểm tra toàn bộ điều bạn đã cho, nhưng trên một cái nhìn đầu tiên phương pháp yêu cầu của bạn trên bộ điều khiển là GET, nơi hình thức của bạn sử dụng một phương thức POST. Có vẻ là một sai lầm ... – Omnaest

+0

ah, cảm ơn bạn đã thay đổi nhưng vẫn cùng một vấn đề, chỉnh sửa mã ở trên để phản ánh điều này. – david99world

Trả lời

5

Bạn đã xác định <url-pattern>/, có nghĩa là bạn appServlet sẽ chỉ nhận được yêu cầu đến địa chỉ gốc. Bằng cách thay đổi nó thành /*, appServlet sẽ nhận tất cả các yêu cầu đến. Điều này sẽ hiệu quả, nhưng bạn cũng có thể cân nhắc tạo một loginServlet cụ thể có thể được ánh xạ tới url /login/*.

  1. Bạn có thể có nhiều servlets được xác định trong một đơn web.xml. Yêu cầu nào sẽ nhấn từng servlet được chỉ định bằng cách thêm nhiều thẻ <servlet-mapping>.
  2. Một servlet có thể có nhiều bộ điều khiển. Thông thường, một bộ điều khiển phục vụ một phần cụ thể trong miền của bạn, ví dụ: PersonController, AddressController, v.v.
  3. Mỗi bộ điều khiển thường xử lý một số url được nhóm hợp lý lại với nhau, ví dụ: /persons/{id}, /persons/search, /persons/add vv
+0

Ah ok, vì vậy nếu việc lập bản đồ servlet được thực hiện trong web.xml, mục đích của @RequestMapping (value = "/ login", method = RequestMethod.POST) trong lớp điều khiển là gì? Cảm ơn bạn :) – david99world

+1

Bạn có thể sử dụng '@ RequestMapping' ở cả cấp độ lớp và cấp phương thức để thực hiện kiểm soát chi tiết về các yêu cầu khác nhau sẽ được xử lý như thế nào. Việc xử lý khác nhau có thể dựa trên url (mục c.f. 3 ở trên), phương thức HTTP và/hoặc các tham số yêu cầu khác nhau. Bạn có thể tìm thêm thông tin về ánh xạ yêu cầu trong [Hướng dẫn sử dụng mùa xuân] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping) – matsev

+0

ok, xin lỗi tôi đã có thể nhầm lẫn bản thân mình, nhưng nếu tôi có/đăng nhập trên web.xml ánh xạ tới một servlet-context và sau đó/đăng nhập trong @RequestMapping, điều đó có nghĩa là để đạt được điều khiển này tôi phải đi đến/login/login? Cảm ơn bạn đã giúp đỡ. – david99world

Các vấn đề liên quan