Κοινή χρήση τεχνολογίας

εκμάθηση mvc ελατηρίου

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Κεφάλαιο 4 Spring MVC

Ενότητα 1 Εισαγωγή στο Spring MVC

1. Ελατήριο MVC

Το SpringMVC είναι ένα πλαίσιο ανοιχτού κώδικα Java και μια ανεξάρτητη ενότητα στο οικοσύστημα του Spring Framework. Εφαρμόζει το ελαφρύ πλαίσιο σχεδίασης Web MVC (δεδομένα, επιχειρηματικές και παρουσιάσεις) που βασίζεται σε απλουστευμένη καθημερινή ανάπτυξη ευκολία.

2. Εξαρτήματα πυρήνα ελατηρίου MVC

  • Μπροστινός ελεγκτής DispatcherServlet

    Υπεύθυνος για τη λήψη αιτημάτων και τη διανομή αιτημάτων

  • Επεξεργαστής χειριστή

    Ο επεξεργαστής περιλαμβάνει υποκλοπές, μεθόδους στον ελεγκτή κ.λπ., και είναι κυρίως υπεύθυνος για την επεξεργασία αιτημάτων.

  • Χαρτογράφηση επεξεργαστή HandlerMapping

    Ανάλυση αρχείων διαμόρφωσης, σάρωση σχολιασμών και αντιστοίχιση αιτημάτων στους επεξεργαστές

  • Προσαρμογέας χειριστή HandlerAdpter

    Βρείτε έναν αντίστοιχο επεξεργαστή με βάση το αίτημα Αυτή η διαδικασία ονομάζεται προσαρμογή

  • Πρόγραμμα επίλυσης προβολής ViewResolver

    Το αποτέλεσμα που λαμβάνεται μετά την εκτέλεση του επεξεργαστή μπορεί να είναι μια προβολή, αλλά αυτή η προβολή είναι μια λογική προβολή (υπάρχει λογικός κώδικας στη σελίδα, όπως βρόχοι και κρίσεις) και πρέπει να υποβληθεί σε επεξεργασία με χρήση ενός προγράμματος ανάλυσης προβολής ονομάζεται απόδοση της προβολής.

Ενότητα 2 Ανάπτυξη και εξέλιξη Spring MVC

<!--低版本-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

1. Το όνομα ή το αναγνωριστικό φασολιών αντιστοιχεί στο αίτημα διεύθυνσης URL

Διαμόρφωση 1.1 web.xml
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <!--配置Servlet初始化参数-->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <!--前置控制器要接收所有的请求,因此在容器启动的时候就应该完成初始化-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
Διαμόρφωση 1.2 spring-mvc.xml
<!--视图解析器:在控制器返回视图的时候生效-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--视图资源的前缀-->
    <property name="prefix" value="/" />
    <!--视图资源的后缀-->
    <property name="suffix" value=".jsp" />
</bean>
<!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
1.3 Εγγραφή του ελεγκτή
public class UserController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        //这里使用配置的视图解析器进行解析  user => / + user + .jsp => /user.jsp
        return new ModelAndView("user");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
1.4 Διαμορφώστε τον ελεγκτή
<!--通过id值匹配请求的URL-->
<bean id="/view" class="com.qf.spring.mvc.controller.UserController" />
  • 1
  • 2

Σκέψη: Σύμφωνα με αυτή τη μέθοδο αντιστοίχισης αιτημάτων, κάθε αίτηση απαιτεί από έναν ελεγκτή να αντιστοιχεί σε αυτό.

Spring 提供了方法名来匹配请求来解决这个问题
  • 1

2. Το όνομα της μεθόδου του Bean ταιριάζει με το αίτημα

2.1 Αναλυτής ονόματος μεθόδου

Το Spring παρέχει το InternalPathMethodNameResolver, ένα εργαλείο επίλυσης για ονόματα μεθόδων στον ελεγκτή.

2.2 Ελεγκτής πολλαπλών λειτουργιών

Το Spring παρέχει την κλάση ελεγκτή MultiActionController για να κληρονομήσουν άλλες κλάσεις ελεγκτών Στις υποκλάσεις του, οι προγραμματιστές μπορούν να γράψουν πολλές μεθόδους για την επεξεργασία αιτημάτων και στη συνέχεια να χρησιμοποιήσουν τον αναλυτή ονόματος μεθόδου για να ταιριάξουν με το αίτημα.

2.3 Εγγραφή του ελεγκτή
public class UserMultiController extends MultiActionController {
    //这个方法就匹配 /login 请求
    //请求格式必须是 
    //ModelAndView 方法名(HttpServletRequest req, HttpServletResponse resp){}
    public ModelAndView login(HttpServletRequest req, HttpServletResponse resp){
        return new ModelAndView("login");
    }

    //这个方法就匹配 /register 请求
    public ModelAndView register(HttpServletRequest req, HttpServletResponse resp){
        return new ModelAndView("register");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
2.4 διαμόρφωση spring-mvc.xml
 <!--方法名解析器-->
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />
<!-- /login 请求使用该bean对象处理-->
<bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">
    <property name="methodNameResolver" ref="methodNameResolver" />
</bean>
<!-- /register 请求使用该bean对象处理-->
<bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">
    <property name="methodNameResolver" ref="methodNameResolver" />
</bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Σκέψη: Σύμφωνα με αυτήν τη μέθοδο αντιστοίχισης αιτημάτων, εάν ένας ελεγκτής πρέπει να χειριστεί πολλαπλά αιτήματα, θα οδηγήσει στο πρόβλημα ενός μεγάλου όγκου πληροφοριών διαμόρφωσης, το οποίο θα είναι δύσκολο να διατηρηθεί αργότερα. Πώς να το λύσετε;

Spring 提供了 SimpleUrlHandlerMapping 映射器, 该映射器支持一个控制器与多个请求匹配的同时也解决了配置信息繁多的问题。
  • 1

3. Απλή αντιστοίχιση προγράμματος χειρισμού URL

Για να χρησιμοποιήσετε το SimpleUrlHandlerMapping, χρειάζεται μόνο να τροποποιήσετε τη διαμόρφωση του spring-mvc.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--视图解析器:在控制器返回视图的时候生效-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图资源的前缀-->
        <property name="prefix" value="/" />
        <!--视图资源的后缀-->
        <property name="suffix" value=".jsp" />
    </bean>

    <!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配-->
<!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
    <!--通过id值匹配请求的URL-->
<!--    <bean id="/view" class="com.qf.spring.mvc.controller.UserController" />-->
    <!--方法名解析器-->
<!--    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />-->
    <!-- /login 请求使用该bean对象处理-->
<!--    <bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!--        <property name="methodNameResolver" ref="methodNameResolver" />-->
<!--    </bean>-->
    <!-- /register 请求使用该bean对象处理-->
<!--    <bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!--        <property name="methodNameResolver" ref="methodNameResolver" />-->
<!--    </bean>-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/view">userController</prop>
                <prop key="/user/*">userMultiController</prop>
            </props>
        </property>
    </bean>
    <bean id="userController" class="com.qf.spring.mvc.controller.UserController" />
    <bean id="userMultiController" class="com.qf.spring.mvc.controller.UserMultiController" />
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

Σκέψη: Καθώς προχωρά η ανάπτυξη του έργου, αναπτύσσονται όλο και περισσότερες επιχειρηματικές λειτουργίες, ο αριθμός των ελεγκτών θα αυξηθεί και ο αριθμός των αντιστοιχιών αιτημάτων θα αυξηθεί επίσης. Αυτό θα προκαλέσει επίσης προβλήματα που είναι δύσκολο να διατηρηθούν αργότερα ?

Spring 提供了 DefaultAnnotationHandlerMapping 映射器,支持使用注解来匹配请求,这样就解决了请求匹配导致配置信息繁多的问题,同时还提升了开发效率。
  • 1

4. Σημειώστε τα αιτήματα αντιστοίχισης

4.1 Σύνταξη ελεγκτή
@Controller
public class UserAnnotationController {

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(){
        return "login";
    }

    @RequestMapping(value = "/register", method = RequestMethod.GET)
    public String register(){
        return "register";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
4.2 διαμόρφωση spring-mvc.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--视图解析器:在控制器返回视图的时候生效-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图资源的前缀-->
        <property name="prefix" value="/" />
        <!--视图资源的后缀-->
        <property name="suffix" value=".jsp" />
    </bean>

    <!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配-->
<!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
    <!--通过id值匹配请求的URL-->
<!--    <bean id="/view" class="com.qf.spring.mvc.controller.UserController" />-->
    <!--方法名解析器-->
<!--    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />-->
    <!-- /login 请求使用该bean对象处理-->
<!--    <bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!--        <property name="methodNameResolver" ref="methodNameResolver" />-->
<!--    </bean>-->
    <!-- /register 请求使用该bean对象处理-->
<!--    <bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!--        <property name="methodNameResolver" ref="methodNameResolver" />-->
<!--    </bean>-->
    <!--<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/view">userController</prop>
                <prop key="/login">userMultiController</prop>
                <prop key="/register">userMultiController</prop>
            </props>
        </property>
    </bean>
    <bean id="userController" class="com.qf.spring.mvc.controller.UserController" />
    <bean id="userMultiController" class="com.qf.spring.mvc.controller.UserMultiController" />-->
    <!--类上的注解处理器-->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    <!--方法上的注解处理器-->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    <!--扫描包,使得该包下类以及类中定义的方法上所使用的注解生效-->
    <context:component-scan base-package="com.qf.spring.mvc.controller" />
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

5. Διαμόρφωση νεότερης έκδοσης

<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--视图解析器:在控制器返回视图的时候生效-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图资源的前缀-->
        <property name="prefix" value="/" />
        <!--视图资源的后缀-->
        <property name="suffix" value=".jsp" />
    </bean>
    <!--较新的版本使用该标签开启注解支持-->
    <mvc:annotation-driven />
    <!--扫描包,使得该包下类以及类中定义的方法上所使用的注解生效-->
    <context:component-scan base-package="com.qf.spring.mvc.controller" />
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Ενότητα 3 Κοινοί σχολιασμοί Spring MVC

1. @Controller

Αυτός ο σχολιασμός είναι το αναγνωριστικό ενός ελεγκτή

@Controller
public class UserController{
    
}
  • 1
  • 2
  • 3
  • 4

2. @RequestMapping

Αυτός ο σχολιασμός χρησιμοποιείται για την αντιστοίχιση αιτημάτων

@Controller
@RequestMapping("/user")
public class UserController{
    
    @RequestMapping(value="/login", method=RequestMethod.POST)
    public int login(){
        return 1;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3. @RequestBody

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο στις παραμέτρους της μεθόδου και χρησιμοποιείται για τη λήψη δεδομένων από το σώμα του αιτήματος και την εισαγωγή τους στις παραμέτρους.

@Controller
@RequestMapping("/user")
public class UserController{
    
    @RequestMapping(value="/login", method=RequestMethod.POST)
    public int login(@RequestBody User user){
        return 1;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4. @ResponseBody

Αυτός ο σχολιασμός χρησιμοποιείται για τη μετάδοση δεδομένων στη σελίδα

@Controller
@RequestMapping("/user")
public class UserController{
    
    @RequestMapping(value="/login", method=RequestMethod.POST)
    @ResponseBody
    public int login(@RequestBody User user){
        return 1;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5. @RequestParam

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο στις παραμέτρους της μεθόδου και χρησιμοποιείται για τη λήψη δεδομένων από την κεφαλίδα του αιτήματος και την εισαγωγή τους στις παραμέτρους.

@Controller
@RequestMapping("/user")
public class UserController{
    
    @RequestMapping(value="/search", method=RequestMethod.GET)
    @ResponseBody
    public List<User> searchUsers(@RequestParam(value="name") String name){
        return new ArrayList<>();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

6. @PathVariable

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο στις παραμέτρους της μεθόδου και χρησιμοποιείται για τη λήψη δεδομένων από τη διαδρομή αιτήματος και την εισαγωγή τους στις παραμέτρους.

@Controller
@RequestMapping("/user")
public class UserController{
    // /user/admin
    @RequestMapping(value="/{username}", method=RequestMethod.GET)
    @ResponseBody
    public User queryUser(@PathVariable("username") String username){
        return new User();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

7. @SessionAttributes[Δεν είναι σημαντικό]

Αυτός ο σχολιασμός μπορεί να χρησιμοποιηθεί μόνο σε ορισμούς κλάσεων και χρησιμοποιείται για την εισαγωγή δεδομένων στη συνεδρία.

@SessionAttributes(types=User.class) //会将model中所有类型为 User的属性添加到会话中。
@SessionAttributes(value={“user1”, “user2”}) //会将model中属性名为user1和user2的属性添加到会话中。
@SessionAttributes(types={User.class, Dept.class}) //会将model中所有类型为 User和Dept的属性添加到会话中。
@SessionAttributes(value={“user1”,“user2”},types={Dept.class}) //会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。
  • 1
  • 2
  • 3
  • 4

8. @RequestHeader

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο σε παραμέτρους μεθόδου και χρησιμοποιείται για τη λήψη δεδομένων από τις κεφαλίδες αιτημάτων.

@RequestMapping("/find")  
public void findUsers(@RequestHeader("Content-Type") String contentType) {//从请求头中获取Content-Type的值
}  
  • 1
  • 2
  • 3

9. @CookieValue

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο σε παραμέτρους μεθόδου και χρησιμοποιείται για τη λήψη της τιμής cookie από το αίτημα.

@RequestMapping("/find")  
public void findUsers(@CookieValue("JSESSIONID") String jsessionId) {//从请cookie中获取jsessionId的值
}  
  • 1
  • 2
  • 3

10. @ControllerAdvice

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο σε κλάσεις, υποδεικνύοντας ότι αυτή η κλάση είναι ο ελεγκτής που χειρίζεται τις εξαιρέσεις.

/**
 * 异常处理的控制器
 */
@ControllerAdvice //这个注解就是spring mvc提供出来做全局异常统一处理的
public class ExceptionController {
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

11. @ExceptionHandler

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο σε μεθόδους κλάσεων που προσδιορίζονται από το @ControllerAdvice ή το @RestControllerAdvice για τη διαχείριση εξαιρέσεων.

/**
 * 异常处理的控制器
 */
@ControllerAdvice //这个注解就是spring mvc提供出来做全局异常统一处理的
public class ExceptionController {

    @ExceptionHandler //异常处理器
    @ResponseBody //响应至页面
    public String handleException(Exception e){
        return e.getMessage();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Ενότητα 4 JSR-303

1. Εισαγωγή στο JSR-303

Το JSR σημαίνει Java Specification Requests, το οποίο αντιπροσωπεύει προτάσεις προδιαγραφών Java. Το JSR-303 είναι ένα τυπικό πλαίσιο που παρέχεται από την Java για επαλήθευση εγκυρότητας δεδομένων Java Bean Καθορίζει ένα σύνολο σχολιασμών επαλήθευσης που μπορούν να σχολιαστούν σε μεταβλητές μελών και μεθόδους. Το Hibernate Validator παρέχει μια υλοποίηση αυτού του προτύπου.

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.0.1.Final</version>
  <!-- 最新7.0.1.Final -->
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. Σχολιασμοί επαλήθευσης

σχόλιοεξηγώσχόλιοεξηγώ
@Μηδενικόπρέπει να είναι μηδενική@Οχι κενόδεν μπορεί να είναι μηδενική
@AssertTrueπρέπει να είναι αλήθεια@AssertFalseπρέπει να είναι ψευδής
@ ΕλάχΠρέπει να είναι ένας αριθμός του οποίου η τιμή είναι μεγαλύτερη ή ίση με την καθορισμένη ελάχιστη τιμή@ΜέγιστηΠρέπει να είναι ένας αριθμός του οποίου η τιμή είναι μικρότερη ή ίση με την καθορισμένη μέγιστη τιμή
@DecimalMinΠρέπει να είναι ένας αριθμός του οποίου η τιμή είναι μεγαλύτερη ή ίση με την καθορισμένη ελάχιστη τιμή@DecimalMaxΠρέπει να είναι ένας αριθμός του οποίου η τιμή είναι μικρότερη ή ίση με την καθορισμένη μέγιστη τιμή
@Μέγεθοςμήκος του σετ@DigitsΠρέπει να είναι αριθμός και η τιμή του πρέπει να είναι εντός ενός αποδεκτού εύρους
@Το παρελθόνΠρέπει να είναι ένα ραντεβού στο παρελθόν@ΜελλοντικόςΠρέπει να είναι μελλοντική ημερομηνία
@ΠρότυποΠρέπει να ταιριάζει με την κανονική έκφραση@ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗΠρέπει να είναι σε μορφή email
@Μήκος(ελάχιστο=,μέγιστο=)Το μέγεθος της συμβολοσειράς πρέπει να είναι εντός του καθορισμένου εύρους@Οχι άδειοΔεν μπορεί να είναι μηδενικό, το μήκος είναι μεγαλύτερο από 0
@Range(min=,max=,message=)Τα στοιχεία πρέπει να βρίσκονται εντός του κατάλληλου εύρους@NotBlankΔεν μπορεί να είναι μηδενικό, το μήκος συμβολοσειράς είναι μεγαλύτερο από 0 (περιορίζεται σε συμβολοσειρές)

3. Εφαρμογή

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.10</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.10</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.1.Final</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
<!-- web.xml -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
<?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:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" />

    <mvc:annotation-driven>
        <mvc:message-converters>
            <!--处理字符串的消息转换器-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <!--处理JSON格式的消息转换器-->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <context:component-scan base-package="com.qf.spring.controller" />
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotNull;

public class User {

    @NotNull(message = "账号不能为空")
    @Length(min = 8, max = 15, message = "账号长度必须为8~15位")
    private String username;

    @NotNull(message = "密码不能为空")
    @Length(min = 8, max = 20, message = "密码长度必须为8~20位")
    private String password;

    @Range(min = 0, max = 120, message = "年龄只能在0~120岁之间")
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/add")
    @ResponseBody
    public Object saveUser(@Valid User user, BindingResult result){
        if(result.hasErrors()) return result.getAllErrors();
        return 1;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

Ενότητα 5 ΑΝΑΚΟΥΣΙΑ

1. Εισαγωγή στο RESTFUL

Το πλήρες όνομα του REST είναι Μεταβίβαση Αντιπροσωπευτικού Κράτους,εξπρές Μεταβίβαση αντιπροσωπευτικού κράτους

Το RESTFUL έχει τα ακόλουθα χαρακτηριστικά:

  • Κάθε URI αντιπροσωπεύει έναν πόρο
  • Ο πελάτης χρησιμοποιεί GET, POST, PUT και DELETE για τη λειτουργία πόρων διακομιστή: Το GET χρησιμοποιείται για τη λήψη πόρων, το POST χρησιμοποιείται για τη δημιουργία νέων πόρων (μπορεί επίσης να χρησιμοποιηθεί για την ενημέρωση πόρων), το PUT χρησιμοποιείται για την ενημέρωση πόρων και το DELETE Χρησιμοποιείται για τη διαγραφή πόρων

2. Αίτημα ΑΝΑΚΟΥΣΗΣ

/user GET => 获取用户资源
/user POST => 增加用户资源
/user PUT => 修改用户资源
/user DELETE => 删除用户资源

/user/{username} GET => 获取指定用户资源  这是RESTFUL风格中子资源的表述方式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3. Υποστήριξη της Spring για RESTFUL

3.1 @RestController

Αυτός ο σχολιασμός μπορεί να εφαρμοστεί μόνο σε κλάσεις και είναι ισοδύναμος με τον συνδυασμό των σχολιασμών @Controller και @ResponseBody.Υποδεικνύει ότι τα αποτελέσματα που επιστρέφονται μετά την εκτέλεση όλων των μεθόδων αυτής της κλάσης εξάγονται απευθείας στη σελίδα.

3.2 @GetMapping
3.2 @PostMapping
3.2 @PutMapping
3.2 @DeleteMapping

Ενότητα 6 Επεξεργασία στατικών πόρων

1. Λόγοι για τους οποίους δεν είναι δυνατή η πρόσβαση σε στατικούς πόρους

Οι στατικοί πόροι περιλαμβάνουν html, js, css, εικόνες, αρχεία γραμματοσειρών κ.λπ. Τα στατικά αρχεία δεν έχουν μοτίβο url, επομένως δεν είναι προσβάσιμα από προεπιλογή. Ο λόγος για τον οποίο είναι δυνατή η πρόσβαση σε αυτό είναι επειδή υπάρχει ένας παγκόσμιος διακομιστής στο tomcat: org.apache.catalina.servlets.DefaultServlet Το μοτίβο url του είναι "/", επομένως τα αιτήματα στατικών πόρων που δεν μπορούν να αντιστοιχιστούν στο έργο είναι όλα. που χειρίζεται αυτή η συμφωνία Servlet. Αλλά στο SpringMVC, το DispatcherServlet χρησιμοποιεί επίσης το "/" ως μοτίβο url, επομένως το καθολικό Serlvet δεν θα χρησιμοποιείται πλέον στο έργο, γεγονός που έχει ως αποτέλεσμα να μην είναι δυνατή η πρόσβαση στατικών πόρων.

2. Λύσεις

2.1 Επιλογή 1

Απλώς αλλάξτε το μοτίβο url που αντιστοιχεί στο DispathcerServlet σε ένα αντίστοιχο μοτίβο εκτός από το "/". Για παράδειγμα *.do, *.action. Μετά από αυτήν την τροποποίηση, κατά την αποστολή ενός αιτήματος, η διεύθυνση URL αιτήματος πρέπει να αντιστοιχεί σε .do ή .action.

2.2 Επιλογή 2
<!-- web.xml -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
  </servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
2.2 Επιλογή 3
<!-- spring-mvc.xml -->
<!-- 
这个handler就是处理静态资源的,它的处理方式就是将请求转会到tomcat中名为default的Servlet 
-->
<mvc:default-servlet-handler/>
<!-- mapping是访问路径,location是静态资源存放的路径 -->
<mvc:resources mapping="/static/**" location="/static/" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Ενότητα 7 Επεξεργασία αλλοιωμένων κινεζικών κωδικών

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

Ενότητα 8 Αρχή λειτουργίας ελατηρίου MVC

checkMultipart(request); //检测是否是多部分请求,这个只可能在文件上传的时候为真


getHandler(processedRequest); //获取处理器 => 遍历HandlerMapping,找到匹配当前请求的执行器链
//没有找到执行器链 就直接向页面报一个404
noHandlerFound(processedRequest, response);
//找到处理当前请求的适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

//控制器之前执行的拦截器将先执行,如果拦截器不通过,则方法直接结束
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
    return;
}
//控制器处理请求,可能会得到一个ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

//控制器之后的拦截器执行
mappedHandler.applyPostHandle(processedRequest, response, mv);
//处理分发的结果:这个结果就是控制器处理后的结果
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
//拦截器在控制器给出的结果DispatcherServlet处理后执行
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22