Spring MVC 原理和理解 【百战】

一、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";
	}

 视图页面

   要点:通过点(.)传递属性。

猜你喜欢

转载自blog.csdn.net/feizai1208917009/article/details/88050143