一、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
2、SpringMVC中的数据如何传递到页面
hello.jsp页面
SpringMVC 控制器:TestController
方式一:
TestController
@Controller
public class HelloController {
@RequestMapping("hello")
public ModelAndView hello(){
System.out.println("hello springmvc....");
//创建ModelAndView对象
ModelAndView mav = new ModelAndView();
//设置模型数据
mav.addObject("msg", "hello springmvc...");
//设置视图名字
mav.setViewName("/WEB-INF/jsp/hello.jsp");
return mav;
}
过程:
使用ModelAndView 对象,addObject()方法 设置数据,将数据:"hello springmvc...",传递到前端页面 "msg" 中。setViewName(),设置要返回的前端页面。
浏览器输入http://项目名/hello.action (web.xml中设置了SpringMVC拦截规则为.action)
方式二:
@RequestMapping("itemEdit")
public String itemEdit(Model model , @RequestParam("id") Integer ids){
//查询商品信息
Item item = itemServices.getItemById(ids);
//通过Model把商品数据返回页面
model.addAttribute("item", item);
//返回String视图名字
return "itemEdit";
Controller 处理请求的方法中加入 Model 对象,使用 addAttribute( ) 方法将数据,传递到前端页面 "item" 中,return 设置要返回的前端页面
3、springmvc.xml 文件中 视图解析器前缀后缀的理解
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
在需要用到前端页面路径的时候,如2中:
mav.setViewName("/WEB-INF/jsp/hello.jsp");
视图解析器配置了如上前缀后缀,则可以知己写为
mav.setViewName("hello");
即直接写视图(前端页面)名字即可。如果视图文件多种类型,不配置后缀名,则可写为 mav.setViewName("hello,jsp") 即可
4、springmvc 中 控制器处理请求的方法如何接收单个参数
前端页面有个参数 “id” ,需要传进来使用
(1)可以在 Controller 处理请求的方法中加入一个同名同类型的参数,这样会直接传递进来
(2)可以在 Controller 中处理请求的方法中 使用【@RequestParam(同名参数) 同类型的自定义参数名 】来接收参数
完整的写法如下:require=true 代表必须要有值,defaultValue 代表默认值
PS:最原始的接收参数方法是类似于Servlet 中接受参数的方式
、springmvc 中 控制器处理请求的方法如何接收Java 实体类
视图页面
SpringMVC 控制器:
@RequestMapping("updateItem")
public String updateItem(Item item,Model model){
//更新商品
itemServices.update(item);
//返回商品模型
model.addAttribute("item", item);
//返回担任提示
model.addAttribute("msg", "修改商品成功");
//返回修改商品页面
return "itemEdit";
}
要点:表单提交的 Item 属性必需与 Bean 的属性名称一致。
实体类中,实体类 Item 的两个属性叫 name 和 price ,视图页面的参数属性就必须 和实体类的属性名字一样也叫 name 和 price 。
6、springmvc 中 控制器处理请求的方法如何接收 包装的实体类
即自己按需写的实体类,包装了其他实体类。即实体类的属性是实体类
实体类:
这里自己写了个实体类,里面只包装了Item 这一个实体类属性
controller代码:
@RequestMapping("queryItem")
public String queryItem(QueryVo vo){
//打印传入参数
System.out.println(vo);
//返回视图
return "itemList";
}
视图页面
要点:通过点(.)传递属性。