一、Spring MVC的原理 和 四大组件
SpringMVC 和Servlet 作用一样,我们先看下一个处理请求名为“control ”的Servlet
@WebServlet("/ ") // 1、DispatchServlet 用于接收所有请求 public class DispatchServlet extends HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // 2、解析判断具体哪个请求,往哪个方法跳转 String result =res.getparmenter("control") if(result.equals("example1")){ // 3、调用具体的方法 example1(); } public void example1(){ System.out.println("方法example1执行") 此处一般写结果返回页面的代码 } } }流程:
接收所有请求 -- 判别具体哪个请求 --- 调用具体方法 --- 结果返回页面
SpringMVC 原理 和Servelt 执行流程一样,四个流程对应四大核心组件
SpringMVC四大重要组件
1.1 DispatcherServlet : (前端控制器),请求入口:接收捕获所有请求 (如果过滤规则 配置为 “/ ”,不接收 jsp 页面)
1.2 HandlerMapping: (处理器映射器) 请求派发,(负责URL请求和 控制器建立一一对应的关系)解析请求.判断具体哪个请求,希望要执行哪个具体的方法.
1.3 HandlerAdapter: (处理器适配器) 负责调用具体的方法(方法称为Controller 或 Handder).
1.4 ViewResovler:(视图解析器).解析结果,准备跳转到具体的物理视图(页面文件)
二、SpringMVC 使用配置
web.xml 进行初始化配置(其实是配置前端控制器 DispatcherServlet)
<!-- 配置SpringMVC -->
<servlet>
<servlet-name>ssm-crm</servlet-name> <!-- 1、名字可以随便起,内容固定 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param> <!-- 2、SpringMVC 详细配置文件的位置和名字 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- springmvc启动优先级,为整数0或者大于0springMVC随着容器启动而启动,小于0,则在第一次请求进来的时候启动,固定 -->
</servlet>
<servlet-mapping>
<servlet-name>ssm-crm</servlet-name>
<url-pattern>/</url-pattern> <!-- 3、配置拦截规则,什么样的请求能进来 配置为 “/ ”,不接收 jsp 页面 -->
</servlet-mapping>
扩展:
在web.xml中可以配置字符编码过滤器,解决中文编码
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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 1、配置Controller的注解包扫描,原理上是使用注解的都需要包扫描 -->
<context:component-scan base-package="com.crm.controller" />
<!-- 2、配置注解驱动,固定 -->
<mvc:annotation-driven />
<!-- 3、放行静态资源 -->
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 所有URL请求格式为mapping="/images/**"的,去location="/images/"中找 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
Controller 程序
@Controller
public class ExampleController {
@RequestMapping("Example")
public String Example() {
System.out.println("执行了Example")
return "执行了Example"
}
}
结果:
在地址栏输入 http://项目名/Example 控制台就会出现
"执行了Example"
同时,由于设置了return,会自动跳转到一个空页面,页面内容为
执行了Example
二、SpringMVC 使用的一些特性
1、SpringMVC 中 Contrlooer 的方法接收参数,需要啥就写啥,你要你敢写,SpringMVC就敢自动给你传进来
需要默认保证参数名称和请求中传递的参数名相同,SpringMVC 自动为我们做了很多工作
如:
前端:
<html>
......
<form action ="Example" method="post">
<input type ="text" name ="name"/>
<input type ="text" name ="age"/>
<input type ="submit" value ="提交"/>
......
</html>
Controller 程序
说明:之前写了一个User的实体类 属性为name 和age
@Controller
public class ExampleController {
@RequestMapping("Example")
public String Example(User user,String name,int age) {
System.out.println("user")
return "执行了Example"
}
}
结果:
我们需要一个实体类,直接在接收参数写上一个实体类参数,SpringMVC 会自动把 接收的name 和age 参数自动封装成user
控制台输出:
[name 张三 age 18] 张三 18