原理解释:
- http请求
客户端发出一个http请求,web应用服务器接收到这个请求,如果请求匹配DispatcherServlet的请求映射路径,就将之转发给DispatcherServlet处理; - 寻找控制器
DispatcherServlet接收到请求后,将根据请求的信息(包括URL,HTTP方法,请求报文头,请求参数,cookie等)及HandlerMapping的配置找到处理请求的控制器。 - 调用控制器
DispatcherServlet把请求提交到Controller - 业务处理
Controller调用服务层方法处理业务逻辑 - 返回业务处理结果ModelAndView
Controller的返回结果为ModelAndView - 处理视图映射
DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 - 把模型数据传给view显示
- http响应
客户端展现
举个栗子:
- DispatcherServlet的引入和配置:
DispatcherServlet是springMVC框架的核心控制器,是入口,在web.xml里进行引入:
<!-- springMVC的核心控制器 -->
<servlet>
<servlet-name>zhong717</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
引入之后需要配置拦截条件,即:符合什么条件的请求会被转发到spring来处理,这里通过servlet-mapping来配置:
<servlet-mapping>
<servlet-name>zhong717</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
以上配置会把.do结尾的请求分配到spring去处理。
- 控制器的声明(对应2-5)
控制器可以通过配置文件和注解的方式声明,供DispatcherServlet查找。以下是注解的方式:
package com.zhong717.web;
import java.lang.Exception;
import java.util.Date;
import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.zhong717.domain.User;
import com.zhong717.service.UserService;
import com.zhong717.common.util.Message;
@Controller
public class LoginController{
private static Logger logger = Logger.getLogger(LoginController.class);
@Autowired
private UserService userService;
@Autowired
private Message msg;
@RequestMapping(value = "/index.do")
public String loginPage(){
return "login";
}
@RequestMapping(value = "/loginCheck.do")
public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){
boolean isValidUser =
userService.hasMatchUser(loginCommand.getUserName(),
loginCommand.getPassword());
if (!isValidUser) {
return new ModelAndView("login", "error", "用户名或密码错误。");
} else {
User user = userService.findUserByUserName(loginCommand
.getUserName());
user.setLastIp(request.getLocalAddr());
user.setLastVisit(new Date());
userService.loginSuccess(user);
request.getSession().setAttribute("user", user);
logger.info(request.getParameter("password"));
return new ModelAndView("main");
}
}
}
以上可以看出:
a. 引入了org.springframework.web.bind.annotation.RequestMapping来做控制器的映射
b. 使用@ Controller来声明控制器
c. 使用@RequestMapping处理URI请求
- 配置视图解析器InternalResourceViewResolver(对应6-7)
SpringMVC在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器。
SpringMVC里提供了多个视图解析器,InternalResourceViewResolver就是其中之一:
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- 扫描web包,应用Spring的注解 -->
<context:component-scan base-package="com.zhong717.web"/>
<!-- 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
</beans>
当处理器返回“index”时,InternalResourceViewResolver解析器会自动添加前缀和后缀:/WEB-INF/jsp/index.jsp
有个问题:
看到的所有例子和书里,实际的页面视图都是jsp的,不理解这是否代表着ModelAndView返回的东西只和jsp关联?如果我不使用jsp而是用angular做前端的话,这样好像就行不通了…
网友评论