Spring MVC 中的 DispatcherServlet 的功能
功能:
根据URI调用对应的Controller的对应方法
根据返回的值跳转到对应的JSP页面
将请求的参数值包装传给对应的Controller中去。
DispatcherServlet 的使用
首先在web.xml中配置一个DispatcherServlet类
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
就像这样,就配置了一个Helloweb 的一个DispatcherServlet,而且,还必须在相同目录下,也就是/WEB-INF/
目录下配置 Helloweb-servlet.xml
文件,对自定义的DispatcherServlet进行配置。名字不能改变。。
改变DispatcherServlet 文件的位置
如果你想将 Helloweb-servlet.xml
文件写在其它地方,只需要在web.xml 中 <servlet>
标签下使用 <init-param>
标签对 contextConfigLocation
的值进行改变就了。不仅可以改变位置,也可以改变文件名。就像下图将文件名改变成 Helloweb-config.xml
文件。
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/Helloweb-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置DispatcherServlet的XML文件
我们就配置默认的 Helloweb-servlet.xml
文件来了解这个文件到底干了什么。。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 指定控制器所在的包 -->
<context:component-scan base-package="controller" />
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
1、在指定的包下,找到有 @Controller
标签的类,它就是一个控制器,可以根据对应的URL来进行不同的处理。
2、根据对应控制器的返回的视图,使用定义好的视图解析器进行解析。。。。
有@Controller注解的类
有 @Controller
注解的类成为了控制器,可以处理HTTP请求。具体是怎么样实现呢?
首先,找到控制器中有 @RequestMapping
注解的方法,这样的方法就是可以处理HTTP请求的方法,然后根据注解中value的值表示此方法只能处理对应的URI。返回的字符串就是对应的视图的名字。。更多有关 @RequestMapping
注解的内容,请看这篇文章。
@Controller
public class HelloController{
@RequestMapping("/login")
public String getLogin() {
return "login";
}
@RequestMapping(value = "/{userName}")
public String login(ModelMap model,
@PathVariable String userName) {
User user = new User();
user.setUserName(userName);
user.setPassword("123456");
model.addAttribute("user", user);
return "userInfo";
}
}
其实 @RequestMapping
注解也可以放在类名上,对这时注解对URI的限制是对全类的,如果类中的方法也的 @RequestMapping
注解,那方法要匹配的URI就是类的限制加上方法的限制。。
使用@AutoWired和@Service注解进行依赖注入
@AutoWired
注解可以注释属性或方法,此时,属性或方法就不需要定义了,它在生成类时,就会注入对应的实例。而被 @Service
注解注释的类就是要被注入的类。
比如,你需要在控制器中使用 UserService
类中的方法。