卜若的代码笔记系列-Web系列-MVC框架-如何在mvc中使用@RequestMapping-3001

1.@RequestMapping来映射请求,可以通过控制器处理
一些URL请求。相当于Servlet在web.xml中
的配置的映射作用一致
像我在这里写的

<servlet>

    <servlet-name>test</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> 

</servlet>
    
    
<servlet-mapping>    
    <!-- 将servlet的请求映射到某个url -->
    <servlet-name>test</servlet-name>
    <url-pattern>*.test</url-pattern>
</servlet-mapping>

我在这里其实是创建了一个servlet,然后将
url(带.test)动作的映射给了这个servlet
然后,web.xml其实是一个web服务器程序的
入口,在这里启动之后,它会根据你创建
的servlet:

<servlet>

    <servlet-name>test</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> 

</servlet>


    
会装载一个test-servlet.xml的文件并启动在这个test-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.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">                    

    
    
    <!-- 我们需要定义一个映射器 -->
    <bean class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        
        <property name = "mappings">
            <props>
            
              <prop key  = "Start.test">startController</prop>
              <prop key = "Login.test">startLogin</prop>
              <prop key = "login_success.test">login_success</prop>
            </props> 
            
        </property>
        
    </bean>
    
        <bean class = "org.springframework.web.servlet.view.UrlBasedViewResolver">
        
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value = "/WEB-INF/jsp/"/>
        
        <property name="suffix" value = ".jsp"/>
       </bean>
    <!-- 我们在这里定义了控制器 -->
    <bean id = "startController" class = "test.testControoler"> 
    
    </bean>
    <bean id = "startLogin" class = "org.springframework.web.servlet.mvc.ParameterizableViewController">
           <property name="viewName" value = "login"></property>
    </bean>      
      <bean id = "login_success" class = "test.CommondControllerTest">
    
    </bean>
     
    
    
</beans>


    
    在这里使用了bean的方式注入了控制器
    
比如,这里创建了一个
 

<bean id = "startController" class = "test.testControoler"> 
    
    </bean>


    控制器,接着,我们可以映射一些请求
    全部放在这里
    
    

<property name = "mappings">
            <props>
            
              <prop key  = "Start.test">startController</prop>
              <prop key = "Login.test">startLogin</prop>
              <prop key = "login_success.test">login_success</prop>
            </props> 
            
    </property>


    
    然后,我们那个控制器其实是实现了一个控制器基类
    里面的有个
    

public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
    
        
        
        System.out.println("2333333333333");
        return  new ModelAndView("main");
    }


    这个函数就直接的实现了使用映射的方式完成的url请求
    
    
    好了,了解这个,我们现在有一个需求,就是在一个控制器
    里面映射多于一个的请求,于是我们开始引入了@RequestMapping来映射请求。

接着,我需要贴出@RequestMapping的源码

public @interface RequestMapping {
    String name() default "";
    String[] value() default {};
    String[] path() default {};
    RequestMethod[] method() default {};
    String[] params() default {};
    String[] headers() default {};
    String[] consumes() default {};
    String[] produces() default {};
}

单纯的看这个,我特么也看不懂,所以,我们还是
来屡一下整个过程好了。
首先,我们的html发一个请求过来的时候,
它是如何提交请求的(一个url)

标记在action里面
像这种的
action="user/login"

<form action="user/login" method="post">
    <input type="submit" value="使用Post发送请求"/>
</form>


这个请求,提交给服务器之后,就会转接到控制器?
注意,我们回顾下上面最简单的serlvlet
我们是在web.xml里面定义了一个servlet,并将所有
的.test的请求全部分给了这个servlet,在servlet里面
详细的定义了具体的控制器。


而看起来使用@RequestMapping方法似乎是直接
跳过了这个过程,直接将url请求映射到java
代码里面去了??
不,总感觉不对,因为你没有实例化你的控制器
没有实例,你什么都做不了!
哦,对了,我查了下资料,尊重每一个人的劳动成果是我们程序员的
第一守则!像我,查的资料在哪我都会贴出来,大家引用资料的时候
也要贴出来哇!

https://my.oschina.net/kolbe/blog/509686

所以总结下来,你还需要自己定义一下这个servlet

<servlet>
    <servlet-name> mappingTest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> 
    
</servlet>
<servlet-mapping>
        <servlet-name>mappingTest</servlet-name>
        <!-- 可以应答所有请求,也就是将所有的请求都交给mappingTest这个servlet来处理 -->
        <url-pattern>/</url-pattern>
        
</servlet-mapping>

ok,我们定义了一个servlet,接着,我们需要
回忆一下,你定义了servlet,你需要一个xx-servlet.xml
去初始化你的servlet是吧

所以我们需要在src根目录创建一个

mappingTest-servlet.xml
的文件
并且在里面初始化这个servlet为映射型servlet

...在研究中!!!!!!!!!!!!!!!!!!!!!!!

哈哈,经过我一番研究,终于研究出来了
首先,你要定义一下这个xx-servlet.xml的文件路径哈
在web里面写

<servlet>
    <servlet-name> mappingTest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> 
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- classpath表示类(src根目录)路径下的mappingTest-servlet.xml文件 -->
            <param-value>classpath:mappingTest-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

这个<init-param>标签就可以定义初始化路径

接着,你需要初始化这个mappingTest-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"
    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-4.2.xsd">
    
    <!-- 自动扫描 cn.kolbe.spring.mvc 下的带有Spring组件注解的类 -->
    <context:component-scan base-package="mapping.test.controller"/>

    <!-- 配置视图解析器:将控制器方法返回值解析为实际物理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 假设控制器返回 success 字符串,该视图解析器将自动进行装配,具体的视图将为:
            prefix + 返回的字符串 + suffix = /WEB-INF/views/success.jsp
         -->
        <!-- prefix表示前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- suffix表示后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

ok,我来解释下
    <context:component-scan base-package="mapping.test.controller"/>
这一句话配置了这个控制器所在的包,ok,这样我们就解决了控制器
的实例化问题。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 假设控制器返回 success 字符串,该视图解析器将自动进行装配,具体的视图将为:
            prefix + 返回的字符串 + suffix = /WEB-INF/views/success.jsp
         -->
        <!-- prefix表示前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- suffix表示后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>
    


用来描述你的请求的分包,也就是说,任意请求来了之后,它就会转到
<context:component-scan base-package="mapping.test.controller"/>
定义的包里面的控制器
这些控制器里面(一个类实例)会存在这样
@RequestMapping(url)
的url请求映射,通过这个映射你就能够转接url请求!
是吧,超级简单!!!!(mmp?花了我2个小时??)

猜你喜欢

转载自blog.csdn.net/qq_37080133/article/details/82746580
今日推荐