
Spring MVC框架模型
原理解釋:
- http請求
客戶端發(fā)出一個http請求,web應(yīng)用服務(wù)器接收到這個請求,如果請求匹配DispatcherServlet的請求映射路徑,就將之轉(zhuǎn)發(fā)給DispatcherServlet處理; - 尋找控制器
DispatcherServlet接收到請求后,將根據(jù)請求的信息(包括URL,HTTP方法,請求報文頭,請求參數(shù),cookie等)及HandlerMapping的配置找到處理請求的控制器。 - 調(diào)用控制器
DispatcherServlet把請求提交到Controller - 業(yè)務(wù)處理
Controller調(diào)用服務(wù)層方法處理業(yè)務(wù)邏輯 - 返回業(yè)務(wù)處理結(jié)果ModelAndView
Controller的返回結(jié)果為ModelAndView - 處理視圖映射
DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖。 - 把模型數(shù)據(jù)傳給view顯示
- http響應(yīng)
客戶端展現(xiàn)
舉個栗子:
- 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>
引入之后需要配置攔截條件,即:符合什么條件的請求會被轉(zhuǎn)發(fā)到spring來處理,這里通過servlet-mapping來配置:
<servlet-mapping>
<servlet-name>zhong717</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
以上配置會把.do結(jié)尾的請求分配到spring去處理。
- 控制器的聲明(對應(yīng)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(對應(yīng)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包,應(yīng)用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>
當(dāng)處理器返回“index”時,InternalResourceViewResolver解析器會自動添加前綴和后綴:/WEB-INF/jsp/index.jsp
有個問題:
看到的所有例子和書里,實際的頁面視圖都是jsp的,不理解這是否代表著ModelAndView返回的東西只和jsp關(guān)聯(lián)?如果我不使用jsp而是用angular做前端的話,這樣好像就行不通了…