什么是springmvc:
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的
springmvc优势
1、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;
3、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;
4、和Spring 其他框架无缝集成,是其它Web框架所不具备的;
5、可适配,通过HandlerAdapter可以支持任意的类作为处理器;
6、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制;
7、功能强大的数据验证、格式化、绑定机制;
8、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试;
9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
10、强大的JSP标签库,使JSP编写更容易。
还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。
springmvc运行原理:
核心架构的具体流程步骤如下:
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
框架组件:
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开放的组件有handler、view
入门案例:
1.创建工程
2.导jar包
3.写好页面
4.创建Controller
package com.offcn.controller;
//UserController要实现Controller 接口
//导入tomcat的jar包
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import java.util.Map;
@Controller
@RequestMapping("/userController")
/*RequestMapping客户端访问路径必须加userController
-
http://localhost:8089/UserController/index?userName=123(访问路径)
-
/
public class UserController {
/ @Override
//return就是你要跳转的页面
//当你的客户端发送请求的url地址 跟这个类对应上了就会走这个方法
//HandlerMapping–public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
//参数就是你处理后要跳转的界面
return new ModelAndView(“doIndex”);
}*//-----------------------注解配置(不用实现)----------------------/
/RequestMapping代表客户端请求返回的地址/
/* @RequestMapping(“index”)
public String index(){
return “doIndex”;
}*//-------------------------333-------------------------------/
/* RequestParam是把页面的数据 放到Controller*/
/UserName是客户端请求中传递的参数//*userName已添加的键
- required这个代表可拼接的参数可有可无,false代表可以不拼接,可以拼接
- /
/@RequestMapping(“index”)
public String index(@RequestParam(value = “userName”,required = false)String userName,
@RequestParam(value = “userName1”,required = false)String userName1
){
System.out.println(userName);
System.out.println(userName1);
return “doIndex”;
}/
/--------这种 客户端请求必须传参-------/
/method代表请求的方式 405代表你的请求与你的接受方式不统一/
//@RequestMapping(value = "/index/.do",params = {“userName”,“pwd”},method = RequestMethod.GET)
/这种注释就是匹配你uri上的任何参数,注解上的pid==你的pid/
/*uri=url+urn */
@RequestMapping(value = “/index/{pid}”)
public String index(@PathVariable String pid){
System.out.println(pid);
//System.out.println(userName);
return “doIndex”;
}/把controller传到你的jsp/
@RequestMapping("/toDoIndex")
public ModelAndView toDoIndex(String userName){
//构建ModelAndView对象
ModelAndView modelAndView=new ModelAndView();
//把值放到ModelAndView对象
modelAndView.addObject(“userName”,userName);//把你要跳转的界面放到modelAndView modelAndView.setViewName("doIndex"); return modelAndView;
}
//返回我们需要的Model view—这个model不用实例化–效果与上面一样
@RequestMapping("/toDoIndex1")
public String toDoIndex1(String userName, Model model){//model里添加数据--以键值对形式传递 model.addAttribute("userName",userName); return "doIndex";
}
/--------------------通过Map把数据传过去--------------------/
@RequestMapping("/toDoIndex2")
public String toDoIndex2(String userName, Map<String,Object> map){map.put("userName",userName); return "doIndex";
}
/--------------最终版 ------/
public String toUpdate(@RequestParam(value = “userName”,required = false) String userName
,@RequestParam(value = “userPwd”,required = true)String userPwd
){return "";
}
}
创建springmvc.xml
<!--当你的请求地址是index.html 就会到UserController这个类-->
<!-- <bean name="/index.pp" class="com.offcn.controller.UserController"></bean>-->
<!--注解配置扫描controller包-->
<context:component-scan base-package="com.offcn.controller"></context:component-scan>
<!--开起注解驱动-->
<mvc:annotation-driven/>
<!--完成视图的对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
在web.xml中配置前端控制器
<?xml version="1.0" encoding="UTF-8"?>
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
1
springmvc
/
RequestMapping
@RequestMapping :请求映射注解
用法举例:
- @RequestMapping(“list.do”)
- @RequestMapping(“/list.do”)
- @RequestMapping(“list”)
- @RequestMapping(value=”list”)
- @RequestMapping(value=”list”,method.RequestMethod.POST)
自定义一个jsp
<%–
Created by IntelliJ IDEA.
User: ibm
Date: 2018/10/16
Time: 10:03
To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>