目录
Spring MVC架构
结构最清晰的MVC Model2实现
Controller
ModelAndView
Spring MVC请求处理流程
Spring MVC体系结构
DispatcherServlet(前端控制器)
Spring MVC最核心的类
web.xml中配置
Handler(处理器):对应MVC中C(Controller层)
类型:Object
作用:实际处理请求
标注了@RequestMapping的所有方法都可以看作是一个Handler
ModelAndView
逻辑视图名
模型对象
根据Spring MVC的请求处理过程,我们具体分析一下每个组件所负责的工作内容:
-
客户端发出HTTP请求,Web应用服务器接收此请求。如匹配DispatcherServlet的请求映射路径,则Web容器将该请求转交给DispatcherServlet处理;
-
DispatcherServlet拿到请求之后,根据请求的信息(URL、请求参数、HTTP方法等)及HandlerMapping的配置找到处理请求的处理器(Handler);
-
当DispatcherServlet找到相应的Handler之后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter可以理解为真正使用Handler来干活的人。
-
在请求信息真正到达调用Handler的处理方法之前的这段时间,Spring MVC还完成了很多工作,它会将请求信息以一定的方式转换并绑定到请求方法的入参,对于入参的对象会进行数据转换、数据格式化以及数据校验等。这些都做完以后,最后才真正调用Handler的处理方法进行相应的业务逻辑处理。
-
处理器完成业务处理之后,将一个ModelAndView对象返回给DispatcherServlet,其中包含了逻辑视图名和模型数据信息。
-
DispatcherServlet通过ViewResolver将逻辑视图名解析为真正的视图对象View,可以是JSP、HTML、XML、PDF、JSON等等,Spring MVC均可灵活配置,在以后会介绍。
-
得到真正的视图对象之后,DispatcherServlet会根据ModelAndView对象中的模型数据对View进行视图渲染。
-
最终客户端获得响应消息。
Spring MVC框架特点
清晰地角色划分
灵活的配置功能
提供了大量的控制器接口和实现类
真正做到与View层的实现无关(JSP、Velocity、Xslt等)
国际化支持
面向接口编程
Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起
相关配置
注解驱动控制器
通过BeanNameUrlHandlerMapping的方式完成请求与Controller之间的映射关系
springmvc-servlet.xml
……
<bean name="/index.html" class="cn.smbms.controller.IndexController"/>
<bean name="/user.html" class="cn.smbms.controller.UserController"/>
基于注解的处理器
<context:component-scan />
@Controller:标注一个普通的JavaBean成为可以处理请求的控制器
@RequestMapping:通过请求URL进行映射
<mvc:annotation-driven />
@RequestMapping
- 标注在类定义处
- 标注在方法定义处
- 映射规则
通过请求URL进行映射
通过请求参数进行映射
若选择方法参数直接入参的话,方法入参名必须与请求中参数名保持一致 - 通过请求方法进行映射
GET
POST
@RequestMapping(value="/welcome",method=RequestMethod.GET, params="username")
注意: @RequestMapping映射的请求信息必须保证全局唯一
@RequestParam
作用:@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
取值 | 说明 |
---|---|
value | 参数名 |
required | 是否必需 |
defaultValue | 默认值 |
将模型数据传递给视图
ModelAndView
包含视图信息和模型数据信息
常用方法
添加模型数据
ModelAndView addObject(String attributeName, Object attributeValue);
ModelAndView addAllObjects(Map<String,?> modelMap);
设置视图
void setView(View view);
void setViewName(String viewName);
Model
数据结构:Map类型
常用方法:添加模型数据
Model.addAttribute(String attributeName,Object attributeValue);
注意:在Model中增加模型数据,若不指定key,则默认使用对象的类型作为key
基于注解使用视图解析器-ViewResolver
将逻辑视图名转换为web内部资源——JSP(少写路径,提高安全性)
InternalResourceViewResolver
prefix:前缀
suffix:后缀
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
/WEB-INF/jsp/逻辑视图名.jsp
例子:
web-xml配置
<?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">
<servlet>
<!-- 别名-->
<servlet-name>SpringMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<!-- 数字越小启动优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- /* 拦截所有请求-->
<!-- / 除jsp,html都进行拦截-->
<servlet-mapping>
<servlet-name>SpringMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- name:请求地址中 的路径,配置文件中是什么,请求就写什么-->
<!-- <bean name="/logic.html" class="controller.Logic"></bean>-->
<!-- <bean name="/index.html" class="controller.Logic"></bean>-->
<context:component-scan base-package="controller"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
编写java代码
@Controller
@RequestMapping(value = "/public")//通过请求URL进行映射
public class HelloController {
@RequestMapping(value = "/logic0.html")//方法url
public ModelAndView logic(HttpServletResponse response) {
ModelAndView mav = new ModelAndView("/index.jsp");
System.out.println("pring mvc");
mav.addObject("message", "Hello Spring MVC");
return mav;
}
@RequestMapping(value = "/outLogic")
public ModelAndView out(@RequestParam(value = "user",required = true) String string) {
return new ModelAndView("/out.jsp");
}
}
创建index.jsp
启动tomcat
访问 http://localhost:8080/工程名称/public/outLogic
可跳转到out.jsp页面