प्रौद्योगिकी साझेदारी

वसन्त mvc शिक्षण

2024-07-12

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

अध्याय 4 वसन्त एमवीसी

खण्डः १ वसन्त एमवीसी परिचयः

1. वसन्त एमवीसी

SpringMVC एकः जावा मुक्तस्रोतरूपरेखा अस्ति तथा च Spring Framework पारिस्थितिकीतन्त्रे एकः स्वतन्त्रः मॉड्यूलः अस्ति यत् इदं Spring इत्यस्य आधारेण Web MVC (data, business and presentation) डिजाइन-प्रतिमानस्य अनुरोध-सञ्चालितं लघु-रूपरेखां कार्यान्वितं करोति सुविधा।

2. वसन्त MVC कोर घटक

  • DispatcherServlet अग्रनियंत्रकः

    अनुरोधं प्राप्तुं अनुरोधं वितरितुं च उत्तरदायी

  • हैंडलर प्रोसेसर

    संसाधके अवरोधकाः, नियन्त्रके विधयः इत्यादयः सन्ति, मुख्यतया अनुरोधानाम् संसाधनस्य उत्तरदायी च भवति ।

  • HandlerMapping प्रोसेसर मैपर

    विन्याससञ्चिकाः विश्लेषणं कुर्वन्तु, टिप्पणीं स्कैन कुर्वन्तु, संसाधकानां कृते अनुरोधानाम् मेलनं कुर्वन्तु

  • HandlerAdpter संचालक एडाप्टर

    अनुरोधस्य आधारेण मेलप्रोसेसरं अन्वेष्टुम् एषा प्रक्रिया अनुकूलनम् इति कथ्यते

  • ViewResolver दृश्य समाधानकर्ता

    प्रोसेसरस्य निष्पादनस्य अनन्तरं प्राप्तं परिणामं दृश्यं भवितुम् अर्हति, परन्तु एतत् दृश्यं तार्किकं दृश्यं भवति (पृष्ठे तर्कसङ्केतः अस्ति, यथा लूप्स्, जजमेण्ट् च), तथा च एतत् दृश्यनिराकरणस्य उपयोगेन संसाधितुं आवश्यकम् अस्ति दृश्यस्य प्रतिपादनम् इति उच्यते ।

खण्डः २ वसन्त एमवीसी विकासः विकासश्च

<!--低版本-->
<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. बीन् नाम अथवा ID URL अनुरोधेन सह मेलति

१.१ 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
१.२ 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
१.३ नियन्त्रकस्य लेखनम्
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
१.४ नियन्त्रकं विन्यस्यताम्
<!--通过id值匹配请求的URL-->
<bean id="/view" class="com.qf.spring.mvc.controller.UserController" />
  • 1
  • 2

चिन्तनम् : अनुरोधानाम् अस्याः पद्धतेः अनुसारं तस्य अनुरूपं नियन्त्रकस्य आवश्यकता भवति एतत् Servlet विकासस्य उपयोगेन सह बृहत्संख्यायां नियन्त्रकाणां लेखनं भविष्यति, यस्य परिणामेण अत्यन्तं न्यूनं विकासदक्षता भविष्यति ।

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

2. Bean’s method name अनुरोधेन सह मेलति

२.१ विधिनाम पार्सरः

Spring InternalPathMethodNameResolver प्रदाति, नियन्त्रके विधिनामानां कृते समाधानकर्ता अस्य समाधानकर्तायाः कार्यं URL अनुरोधानाम् मेलनाय आधाररूपेण विधिनामस्य उपयोगः नियन्त्रकेन सह सम्बद्धः भवति ।

२.२ बहु-सञ्चालन-नियन्त्रकः

Spring अन्येषां नियन्त्रकवर्गाणां कृते MultiActionController नियन्त्रकवर्गं प्रदाति यत् तस्य उपवर्गेषु, विकासकाः अनुरोधानाम् संसाधनार्थं बहुविधाः पद्धतयः लिखितुं शक्नुवन्ति, ततः अनुरोधस्य सङ्गतिं कर्तुं विधिनाम पार्सरस्य उपयोगं कर्तुं शक्नुवन्ति ।

२.३ नियन्त्रकस्य लेखनम्
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
२.४ 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 handler mapping

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. मेल-अनुरोधानाम् टिप्पणीं कुर्वन्तु

४.१ नियन्त्रकस्य लेखनम्
@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
४.२ 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

खण्डः ३ वसन्त एमवीसी सामान्यटिप्पणी

1. @ नियन्त्रक

इदं टिप्पणं नियन्त्रकस्य परिचयः भवति

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

2. @अनुरोधनक्शा

एतत् एनोटेशनं अनुरोधानाम् मेलनाय उपयुज्यते

@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. @अनुरोधशरीर

इदं एनोटेशनं केवलं विधिस्य मापदण्डेषु एव प्रयोक्तुं शक्यते तथा च अनुरोधशरीरात् दत्तांशं प्राप्तुं पैरामीटर्स् मध्ये इन्जेक्शन् कर्तुं च उपयुज्यते ।

@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. @प्रतिक्रियाशरीर

एतत् एनोटेशनं पृष्ठं प्रति दत्तांशं प्रसारयितुं उपयुज्यते

@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. @अनुरोधपरम्

इदं एनोटेशनं केवलं मेथड् इत्यस्य पैरामीटर्स् इत्यत्र एव प्रयोक्तुं शक्यते तथा च अनुरोधशीर्षकात् दत्तांशं प्राप्तुं पैरामीटर्स् मध्ये इन्जेक्शन् कर्तुं च उपयुज्यते ।

@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. @ पथचर

इदं एनोटेशनं केवलं विधिस्य मापदण्डेषु एव प्रयोक्तुं शक्यते तथा च अनुरोधमार्गात् दत्तांशं प्राप्तुं मापदण्डेषु इन्जेक्शन् कर्तुं च उपयुज्यते ।

@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. @अनुरोधशीर्षकम्

इदं एनोटेशनं केवलं मेथड् पैरामीटर्स् इत्यत्र एव प्रयोक्तुं शक्यते तथा च अनुरोधशीर्षकाणां दत्तांशं प्राप्तुं उपयुज्यते ।

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

9. @कुकीमूल्यम्

इदं टिप्पणी केवलं विधिमापदण्डेषु प्रयोक्तुं शक्यते तथा च अनुरोधात् कुकीमूल्यं प्राप्तुं उपयुज्यते ।

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

10. @नियंत्रकपरामर्श

एतत् एनोटेशनं केवलं क्लास्-मध्ये एव प्रयोक्तुं शक्यते, यत् एतत् क्लास् अपवादं नियन्त्रयति इति नियन्त्रकः इति सूचयति ।

/**
 * 异常处理的控制器
 */
@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 जेएसआर-303

1. जेएसआर-303 इत्यस्य परिचयः

JSR इत्यस्य अर्थः Java Specification Requests इति भवति, यत् Java specification proposals इत्यस्य प्रतिनिधित्वं करोति । JSR-303 जावा बीन् आँकडा वैधता सत्यापनार्थं जावा द्वारा प्रदत्तं मानकरूपरेखा अस्ति यत् एतत् सत्यापनटिप्पणीनां समुच्चयं परिभाषयति यत् सदस्यचरानाम् विशेषताविधिषु च टिप्पणीं कर्तुं शक्यते । 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. सत्यापन टिप्पणी

टिप्पणीव्याख्यातिटिप्पणीव्याख्याति
@लुप्तमूल्यशून्यं भवितुमर्हति@NotNull इतिशून्यं न भवितुम् अर्हति
@AssertTrue इतिसत्यं भवितुमर्हति@AssertFalse इतिमिथ्या भवितुमर्हति
@मिनएतादृशी संख्या भवितुमर्हति यस्याः मूल्यं निर्दिष्टन्यूनतममूल्यात् अधिकं वा समं वा भवति@अधिकतमएतादृशी संख्या भवितुमर्हति यस्य मूल्यं निर्दिष्टस्य अधिकतममूल्यात् न्यूनं वा समं वा भवति
@ दशमलवमिनएतादृशी संख्या भवितुमर्हति यस्याः मूल्यं निर्दिष्टन्यूनतममूल्यात् अधिकं वा समं वा भवति@ दशमलवअधिकतमएतादृशी संख्या भवितुमर्हति यस्य मूल्यं निर्दिष्टस्य अधिकतममूल्यात् न्यूनं वा समं वा भवति
@आकृतिसेट् इत्यस्य लम्बता@अङ्काःसंख्या भवितुमर्हति तस्याः मूल्यं च स्वीकार्यपरिधिमध्ये भवितुमर्हति
@भूतपूर्वं तिथिः भवितुमर्हति@भविष्यभविष्यस्य तिथिः भवितुमर्हति
@प्रतिमानम्‌नियमितव्यञ्जनस्य मेलनं अवश्यं करणीयम्@ईमेलईमेल प्रारूपेण भवितुमर्हति
@ लम्बाई(मिनट=,अधिकतम=)तारस्य आकारः निर्दिष्टपरिधिमध्ये भवितुमर्हति@नहीं रिक्तशून्यं न भवितुम् अर्हति, दीर्घता 0 इत्यस्मात् अधिका अस्ति
@Range(मिनट=,अधिकतम=,सन्देश=)तत्त्वानि समुचितव्याप्तेः अन्तः एव भवितुमर्हन्ति@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

खण्डः ५ RESTFUL

1. RESTFUL इत्यस्य परिचयः

REST इत्यस्य पूर्णं नाम अस्ति प्रतिनिधित्व राज्य स्थानांतरण,व्यक्त प्रतिनिधित्व राज्य स्थानांतरण

RESTFUL इत्यस्य निम्नलिखितगुणाः सन्ति ।

  • प्रत्येकं URI एकं संसाधनं प्रतिनिधियति
  • क्लायन्ट् सर्वरसंसाधनानाम् संचालनाय GET, POST, PUT, DELETE इत्यादीनां उपयोगं करोति: GET इत्यस्य उपयोगः संसाधनं प्राप्तुं भवति, POST इत्यस्य उपयोगः नूतनानां संसाधनानाम् निर्माणार्थं भवति (संसाधनानाम् अद्यतनीकरणाय अपि तस्य उपयोगः कर्तुं शक्यते), PUT इत्यस्य उपयोगः संसाधनानाम् अद्यतनीकरणाय भवति, DELETE च संसाधनं विलोपयितुं प्रयुक्तम्

2. RESTFUL अनुरोधः

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

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

3. RESTFUL इत्यस्य कृते Spring’s support

3.1 @विश्रामनियंत्रक

इदं एनोटेशनं केवलं वर्गेषु एव प्रयोक्तुं शक्यते तथा च @Controller तथा @ResponseBody एनोटेशनयोः संयोजनस्य समकक्षम् अस्ति ।अस्मिन् वर्गे सर्वेषां मेथड्-निष्पादनानन्तरं प्रत्यागताः परिणामाः प्रत्यक्षतया पृष्ठे निर्गच्छन्ति इति सूचयति ।

३.२ @GetMapping इति
३.२ @PostMapping इति
३.२ @PutMapping इति
३.२ @DeleteMapping इति

खण्डः ६ स्थिरसंसाधनसंसाधनम्

1. स्थिरसंसाधनानाम् अभिगमनं न भवति इति कारणानि

स्थिरसंसाधनेषु html, js, css, चित्राणि, font files इत्यादयः सन्ति । स्थिरसञ्चिकासु url-पैटर्न् नास्ति, अतः ते पूर्वनिर्धारितरूपेण अभिगम्याः न सन्ति । कारणं यत् एतत् अभिगन्तुं शक्यते यतोहि tomcat इत्यस्मिन् वैश्विकः सर्व्लेट् अस्ति: org.apache.catalina.servlets.DefaultServlet अस्य url-पैटर्न् "/" अस्ति, अतः परियोजनायां मेलनं कर्तुं न शक्यन्ते ये स्थिरसंसाधनानुरोधाः सर्वे सन्ति अस्मिन् Servlet द्वारा सम्पादितम्। परन्तु SpringMVC मध्ये DispatcherServlet अपि "/" इत्यस्य उपयोगं url-pattern इत्यस्य रूपेण करोति, अतः वैश्विक Serlvet इत्यस्य उपयोगः परियोजनायां न भविष्यति, यस्य परिणामेण स्थिरसंसाधनानाम् अभिगमनं कर्तुं असमर्थः भवति

2. समाधानम्

२.१ विकल्पः १

केवलं DispathcerServlet इत्यस्य अनुरूपं url-pattern इत्येतत् "/" इत्यस्मात् परं मेल-प्रतिरूपं परिवर्तयन्तु । यथा *.कुरु, *.कर्म । अस्य परिवर्तनस्य अनन्तरं अनुरोधं प्रेषयति समये अनुरोधस्य URL .do अथवा .action इत्यनेन सह मेलनं कर्तव्यम् ।

२.२ विकल्पः २
<!-- web.xml -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
  </servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
२.२ विकल्पः ३
<!-- 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

खण्डः ७ चीनी विकृतसङ्केतसंसाधनम्

<?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 वसन्त एमवीसी कार्यसिद्धान्तः

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