运行原理

DispatcherServlet通过HandlerMapping在MVC的容器中找到处理请求的Controller,将请求提交给Controller,Controller对象调用业务层接口实现对应业务,并得到处理结果,返回ModelAndView,DispatcherServlet通过查找最适合的ViewResolver完成视图解析,完成HTTP响应

启动流程

ContextLoaderListener初始化,实例化IoC容器,并将此容器实例注册到ServletContext中,DispatcherServlet初始化。

DispatcherServlet配置

1.由Servlet拦截所有请求并发给Spring MVC控制器

在\webapp\WEB-INF\web.xml:

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Archetype Created Web Application</display-name> <servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 配置文件位置 -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 拦截所有的请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping> <filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<!-- 将字符编码为UTF-8-->
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

备注:web.xml文件并不是web工程必须的,web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等

classpath:springmvc.xml

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--配置视图映射器,这样直接返回字符串形式的.jsp的文件名即可--> <context:component-scan base-package="com"/><!--配置扫描范围--> <mvc:annotation-driven/><!--开启mvc的注解模式--> <!-- 3.配置InternalResourceViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
ModelAndView对象

流程图

注解扫描:

//在springBoot中,Controller的扫描范围默认同一个包内,包内的返回值将通过视图解析器解析
@Controller //直接返回结果
@ResponceBody @RestController=@ResponceBody+@Controller

webapp/web.xml

<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_3_1.xsd"
version="3.1" metadata-complete="true">
<!-- 如果是用mvn命令生成的xml,需要修改servlet版本为3.1 -->
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC需要加载的配置文件
spring-dao.xml,spring-service.xml,spring-web.xml
Mybatis - > spring -> springmvc
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- 默认匹配所有的请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

@RequestParam与@PathVariable的区别

使用@RequestParam时,通过get方法提交时,URL是这样的host/path?id=1,通过表单提交时name属性需要和控制器中@RequestParam中的value属性值相同

使用@PathVariable时,URL是host/path/1

@RequestMapping(value="/user",method = RequestMethod.GET)
public @ResponseBody
User printUser(@RequestParam(value = "id", required = false, defaultValue = "0")
int id) {
User user = new User();
user = userService.getUserById(id);
return user;
} @RequestMapping(value="/user/{id:\\d+}",method = RequestMethod.GET)
public @ResponseBody
User printUser2(@PathVariable int id) {
User user = new User();
user = userService.getUserById(id);
return user;
}

将Controller的数据提交到页面

使用HttpServletRequest对象里的setAttribute方法将值回传html或者JSP页面中

@GetMapping("/")
public String test(HttpServletRequest request){
request.setAttribute();
return "";
}

使用Model或者Map<Object, String>的方式保存参数

@GetMapping("/")
public String test(Model model){
model.addAttribute();
return "";
}

或者使用ModelAndView的方式

@GetMapping("/")
public ModelAndView test(){
ModelAndView mav = new ModelAndView();
mav.addObject();
return mav;
}

最新文章

  1. java ZipOutputStream压缩文件,ZipInputStream解压缩
  2. 第 22 章 CSS3 渐变效果
  3. java大数取模
  4. Bootstrap 按钮和折叠插件
  5. jdbc基础 (一) MySQL的简单使用
  6. PostgreSQL Replication之第十章 配置Slony(4)
  7. P235 实战练习(集合类2)、摇奖程序和验证码(修改版)
  8. Git server安装和配置
  9. centos 安装 vsftp
  10. repeater操作
  11. C# WinForm开发系列 - WebBrowser
  12. android 5.1 API简介
  13. linux下64位汇编的系统调用(2)
  14. Redis protocol (redis通信协议)
  15. loadrunner&#160;脚本录制-录制选项设置HTML-based&#160;URL-based&#160;Script
  16. Unity3D中自带事件函数的执行顺序
  17. 20165228 2017-2018-2 《Java程序设计》第6周学习总结
  18. mvc core2.1 Identity.EntityFramework Core ROle和用户绑定查看 (八)完成
  19. python 生成唯一识别码
  20. C数组&amp;结构体&amp;联合体快速初始化

热门文章

  1. Comparison Theorem in Riemannian geometry
  2. tfidf与bm25
  3. CTreeCtrl中通过单击获取当前选项文本
  4. JVMCFRE003 bad major version问题
  5. Python学习笔记文件读写之遍历目录树
  6. macOS完整安装包下载方法
  7. python菜鸟学习: 4.购物车演练
  8. 解决java.sql.SQLException: null, message from server: &quot;Host &#39;XXX&#39; is not allowed to connect异常
  9. LeetCode系列之 (JavaScript) =&gt; 88. 合并两个有序数组
  10. vue后台管理系统——订单管理模块