第一个Demo
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/first.action">第一个Demo</a>
</body>
</html>
前端控制器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">
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>mySpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件 -->
<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mySpringMVC</servlet-name>
<!-- 设置所有以action结尾的请求进入SpringMVC -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
-
springmvc.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="com.itlike"/>
</beans>
-
控制器Hander
类
package com.itlike.springmvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller //让该类称为控制器类
public class MyController {
@RequestMapping("/first.action")
public ModelAndView show(){
ModelAndView modelAndView = new ModelAndView();
// 接收参数(或来自页面)
modelAndView.addObject("name","itlike");
//跳转
modelAndView.setViewName("/result.jsp");
return modelAndView;
}
}
-
result.jsp
结果页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>${name}来了!</h1>
</body>
</html>
执行流程
1.PNG执行原理
- 用户发送
请求
至前端控制器DispatcherServlet
- DispatcherServlet收到请求
调用
HandlerMapping处理器映射器
- 处理器映射器根据
请求url
找到具体的处理器,生成处理器对象
及处理器拦截器
(如果有则生成)一并返回
给DispatcherServlet - DispatcherServlet通过
HandlerAdapter
处理器适配器
调用处理器 -
执行处理器
(Controller,也叫后端控制器)。 - Controller执行完成返回
ModelAndView
- HandlerAdapter将controller执行结果ModelAndView
返回
给DispatcherServlet - DispatcherServlet将ModelAndView传给
ViewReslover
视图解析器 - ViewReslover解析后返回
具体View
- DispatcherServlet对View进行
渲染视图
(即将模型数据填充至视图中)。 - DispatcherServlet
响应用户
需要手动编写的,只有 DispatcherServlet
(web.xml)
、Handler(Controller)
、View(jsp)
组件说明
- DispatcherServlet
组件调度
- 前端控制器
- 用户请求
到达
前端控制器,它就相当于mvc
模式中的C
- dispatcherServlet是
整个流程控制的中心
- 由它
调用其它
组件处理用户的请求 - dispatcherServlet的存在
降低
了组件之间的耦合性
- HandlerMapping
请求映射
- 处理器映射器
- HandlerMapping负责根据用户
请求url
找到Handler处理器 - springmvc提供了不同的映射器实现不同的映射方式
- HandlerMapping会把找到映射返回给
前端控制器
- HandlerAdapter
执行处理器
- 通过HandlerAdapter对
处理器
进行执行
- 处理器适配器
- Handler
请求处理
- 后端控制器
- 在DispatcherServlet的控制下
Handler
对具体的用户请求进行处理
。
- ViewResolver
生成View视图
- 视图解析器
- View Resolver负责将
处理结果
生成View视图
- View
数据展示
- springmvc框架提供了很多的View视图类型的支持
- 包括但不限于:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp
默认加载组件
处理器映射器
HandlerMapping
- @RequestMapping:定义请求url到处理器功能方法的映射
-
注解式
处理器映射器,对类中标记了@ResquestMapping的方法进行映射。
@RequestMapping("/first.action")
- 根据@ResquestMapping定义的
url匹配
@ResquestMapping标记的方法 -
匹配成功
返回HandlerMethod对象
给前端控制器 - HandlerMethod
对象
中封装
url对应的方法Method
处理器适配器
HandlerAdapter
- 对标记@ResquestMapping的方法
进行适配
-
解析
对应的方法
视图解析器
ViewResolver
- 视图解析器使用SpringMVC框架默认的
InternalResourceViewResolver
- 这个视图解析器支持
JSP
视图解析 - 配置视图解析器
1. 当一个页面存放目录结构比较多时,`就可以配置目录`
2. 可以在返回地址上添加`前缀`和`后缀`
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀-->
<property name="prefix" value="WEB-INF/myxq/"/>
<!--配置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
@Controller //让该类成为控制器类
public class MyController {
@RequestMapping("/first.action")
public ModelAndView show(){
ModelAndView modelAndView = new ModelAndView();
// 接收参数(或来自页面)
modelAndView.addObject("name","itlike");
//跳转
modelAndView.setViewName("itlike");
return modelAndView;
}
}
1.png
2.png
解决初始化加载慢
- 在服务器
启动时就加载
<!--大于1表示在服务器启动时就加载-->
<load-on-startup>1</load-on-startup>
web.xml
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>mySpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件 -->
<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--大于1表示在服务器启动时就加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mySpringMVC</servlet-name>
<!-- 设置所有以action结尾的请求进入SpringMVC -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
请求转发
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/second.action">第二个Demo</a>
</body>
</html>
MyController
@Controller //让该类成为控制器类
public class MyController {
@RequestMapping("/second.action")
public String show2(){
/*使用String直接进行跳转(不需要数据)*/
return "/result.jsp";
}
}
result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>来了!</h1>
</body>
</html>
重定向
- 使用前缀
redirect:
return "redirect:/result.jsp";
return "redirect:/second.action";
请求转发和重定向的区别?
请求转发:地址栏
2.PNG不改变
重定向:地址栏
1.PNG改变
更改web.xml
-
*.action
改为/
<!-- 设置所有以action结尾的请求进入SpringMVC -->
<url-pattern>/</url-pattern>
<?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">
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>mySpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件 -->
<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--大于1表示在服务器启动时就加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mySpringMVC</servlet-name>
<!-- 拦截所有,不包括jsp,包含.js .png.css (建议使用) -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
简化后Controller
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--设置"/",不再需要以.action结尾--%>
<a href="${pageContext.request.contextPath}/first">demo</a>
</body>
</html>
- MyController
@Controller
public class MyController {
@RequestMapping("/first")
public String myform(){
//System.out.println("跳转。。。");
return "/second.jsp";
}
}
- second.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>second!</h1>
</body>
</html>
网友评论