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个小时??)