spring MVC是基于Model2实现的技术框架,spring的web框架是围绕DispatcherServlet(分发器)设计的,其作用是将用户请求分发到不同的控制器(又称处理器)。默认控制器接口为Controller。
①客户端发出一个HTTP请求,web应用服务器接受这个请求,如果与web.xml配置文件中指定的DispatcherServlet请求映射路径相匹配,那么web容器就会将该请求转交给DispatcherServlet处理。
②DispatcherServlet接受这个请求后,根据请求的信息(URL或请求参数等)按照某种机制寻找恰当的映射处理器来处理这个请求。
③DispatcherServlet根据映射处理器(Handler mapping)来选择并决定将请求派送给哪个控制器。
④控制器处理这个请求,并返回一个ModelAndView给DispatcherServlet,其中包含了视图逻辑名和模型数据信息。
⑤由于ModelAndView中包含的是视图逻辑名,而非真正的视图对象,因此DispatcherServlet需要通过ViewResolver完成视图逻辑名到真实视图对象的解析功能。
⑥得到真实的视图对象后,DispatcherServlet就要View对象对ModelAndView中的模型数据进行渲染。
⑦最终客户端得到返回的响应,可能是一个普通的HTML页面,也可能是一个Excel、PDF文档等视图形式。
配置DispatcherServlet:
DispatcherServlet是spring MVC核心,负责接收HTTP请求并协调spring mvc的各个组件完成请求处理的工作,用户需要在web.xml中配置DispatcherServlet。假设希望DispatcherServlet截获所有以*.do结尾的URL请求,web.xml配置如下:
<servlet>
<servlet-name>spring</servelt-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-mapping>
<url-pattern>*.do</utl-pattern>
</servlet-mapping>
当DispatcherServlet加载后,它将从XML文件中加载spring的应用上下文,这个XML文件的名字取决于Servlet的名字。
上述配置中,Servlet名字为spring,那么DispatcherServlet会从spring-servlet.xml文件中加载应用上下文。为了能找到spring-servlet.xml文件,该文件需要放在项目的WEB-INF目录中。
控制器:
spring控制器架构的基础是org.springframework.web.servlet.mvc.Controller接口
package org.springframework.web.servlet.mvc;
import javax.servlet.hittp.HttPServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
public interface Controller{
ModelAndVIew handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception;
}
Controller接口中只声明了一个handleRequest方法,该方法用来处理请求并返回恰当的模型和视图。ModelAndView与Controller构成了spring MVC框架实现的基础。
实现Controller接口的控制器:
命令,AbstractCommandController,控制器将多个请求参数封装成一个命令对象,以此执行业务处理。
表单,SimpleFormController,处理基于单一表单的请求。
多动作,MultiActionController,使用一个Controller处理多个相似的请求。
命令控制器:
使用AbstractCommandController控制器,实现用户登录功能。
①建项目
②添加spring支持
③建实体包、类
④建com.springmvc.web包,建LoginController类,该类继承AbstractCommandController控制器:
package com.springmvc.web;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
import com.springmvc.entity.Users;
public class LoginController extends AbstractCommandController{
@Override
protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException exception)throws Exception{
//获取对象
Users user=(Users)command;
//创建一个指定视图逻辑名的ModelAndView实例
ModelAndView mav=new ModelAndView("success");
//给mav实例指定数据模型
mav.addObject("user",user);
return mav;
}
}
由于自定义的LoginController继承了AbstractCommandController类,需要实现handle方法,其中4个参数:
Request:代表请求对象,Response:代表响应对象,Command:封装请求参数的对象,exception:表示数据绑定过程的异常。
⑤在web.xml文件中配置DispatcherServlet:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-,apping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
⑥在WEB-INF目录下创建spring-servlet.xml配置文件,在该文件中配置命令控制器:
<?xml version="1.0" encoding="UTF-8"?>
<beans ···········>
<!-- 配置处理器映射采用SimpleUrlHandleMapping类 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- props底下的prop标签内填写的key都是符合转发条件的url值,之后跟的是bean的ID,如果输入的url值与key中的url匹配,则执行对应beanID绑定的Controller -->
<property name="mappings">
<props>
<prop key="login.do">loginController</prop>
</props>
</property>
</bean>
<!-- 定义控制器LoginController -->
<bean id="loginController" class="com.springmvc.web.LoginController">
<!-- 设置请求数据的封装类型,执行到该控制器时就会自动将数据封装成Users -->
<property name="commandClass" value="com.springmvc.entity.Users"/>//执行到该控制器,就会自动将数据封装成Users
</bean>
<!-- 配置视图解析器,使用InternalResourceViewResolver类作为视图解析器.Controller回传ModelAndVIew,DispatcherServlet将其交给ViewResolver解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 属性prefix和suffix分别指定视图文件所在的路径和后缀 -->
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
⑦在WebRoot目录下建登录页面login.jsp:
<form action="login.do" method="post">
······
⑧建success.jsp:
欢迎您:${user.userName}