1.SpringMVC的介绍
2.SpringMVC的工作流程
3.SpringMVC的搭建以及配置文件说明
4.SpringMVC值传递的方式
SpringMVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或者集成其他的MVC开发框架,如Struts1(现在不用),Structs2(一般老项目使用)等。
1.SpringMVC是Spring的后续产品。
2.控制层的框架(Servlet的封装)
3.基于MVC的设计模式
M:实体,dao,service
V:HTML,Jsp,velocity
C:控制层,SpringMVC,Struts2
图片来源:ProcessOn用户:小熊VIP
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet 收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet 调用HandlerAdapter处理器适配器。
5、HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)方法。
6、处理器执行完成返回ModelAndView给HandlerAdapter。
7、HandlerAdapter 将处理器执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet 将ModelAndView传给ViewReslover 视图解析器。
9、ViewReslover 解析后返回具体View给DispatcherServlet。
10、DispatcherServlet 调用视图解析器根据View进行渲染视图(即将模型数据填充至视图 中)。
11、将渲染后的页面返回到前端控制器DispatcherServlet。
12、DispatcherServlet 将渲染后的页面响应到客户端。
1.DispatcherServlet(前端控制器):核心组件,协调调用其他组件。
2.HandlerMapping(映射处理器):根据请求查找处理该请求的处理器(Handler)。
3.Handler:处理请求的方法。
4.HandlerAdapter(处理器适配器):适配参数以及调用执行处理器方法。
5.ModelAndView:封装跳转的页面以及向页面传递的参数。
6.ViewResolver(视图解析器):查找跳转的页面并将数据解析到该页面。
<!-- 前端控制器--> <servlet> <servlet-name>springmvc</servlet-name> <!-- 前端控制类--> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定springmvc配置文件路径,默认路径WEB-INF/servlet-name+"-"servlet.xml(springmvc-servlet.xml)--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- “/”代表的是所有格式的请求,或者*.do,不可以*.*--> <url-pattern>/</url-pattern> </servlet-mapping> 复制代码
(其他非默认的映射处理器和处理器适配器以及自定义的视图解析器,和以bean节点的方式完成请求和处理器的对应关系)
<?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" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--请求为"/login",由LoginController处理请求--> <bean id="/login" class="com.springmvc.controller.LoginController"/> </beans> 复制代码
LoginController类实现Controller接口:
public class LoginController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv=new ModelAndView(); mv.setViewName("index"); mv.addObject("msg","登陆成功"); System.out.println(1111111); return mv; } } 复制代码
直接在浏览器地址栏输入:项目网址/login
<!-- 实例化非默认的映射处理器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 实例化非默认的适配处理器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 定义视图解析器的前后缀,这样return "直接写网页名"不用再带后缀.jsp了--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> 复制代码
<!-- 扫包--> <context:component-scan base-package="com.springmvc.controller"/> <!-- 开启MVC注解驱动--> <mvc:annotation-driven conversion-service="myConverter"/> 复制代码
这里我新建一个RegController.java文件:
@Controller//实例化次Controller类 public class RegController { @RequestMapping("reg")//这个注解是为例映射匹配的请求"reg" public ModelAndView reg(){ ModelAndView mv=new ModelAndView(); mv.setViewName("index"); mv.addObject("msg","注册1"); return mv; } } 复制代码
说明:
@RequestMapping("请求名"):匹配请求,可以加在类上或者方法上,注解里的请求名是可以省略的。
注意:
1、类上可以不写@RequestMapping注解,但是类中的方法要作为一个处理器方法就必须写该注解。
2、如果类上和方法上都有该注解,同时注解里的请求名都省略了,这时,这个方法为一个默认请求的方法。即在访问http://locathost:8080/springmvc01/时,默认优先访问静态首页,如果没有静态首页则访问后台的默认请求。
返回类型是String,默认将String类型作为视图名;处理器方法中的类类型参数会自动实例化。
@Controller public class RegController { @RequestMapping("reg") public ModelAndView reg(){//ModelAndView传值 ModelAndView mv=new ModelAndView(); mv.setViewName("index"); mv.addObject("msg","注册1"); return mv; } @RequestMapping("reg1")//返回类型是String类型作为视图名;处理器中的类类型参数会自动实例化 public String reg1(Model m){//Model传值 m.addAttribute("msg","通过model将数据传到前端页面"); return "index"; } @RequestMapping("reg2") public String reg2(Map m){//Map传值 m.put("msg","通过map将数据传到前端页面"); return "index"; } @RequestMapping("reg3") public String reg3(ModelMap m){//ModelMap传值 m.put("msg","通过ModelMap 将数据传到前端页面"); return "index"; } @RequestMapping("reg4") public String reg4(){//返回类型是String类型作为视图名;处理器中的类类型参数会自动实例化 return "index"; } } 复制代码
@RequestMapping("reg5") public String reg5(HttpSession session){ session.setAttribute("msg","通过session将数据传输到前端页面"); return "index"; } 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 响应:${msg} ${uid} </body> </html> 复制代码
<a href="user/getUById?uid=1&uname=lkk">编辑</a> <%--如果链接上加上user表示对应的类中加上了注解@RequestMapping("user"), 再访问处理器方法"getUById",表示是一个二级请求, 在这里我选用了一级请求:直接访问处理器方法。如下:--%> <a href="getUById?uid=1&uname=lkk">编辑</a> 复制代码
@RequestMapping("getUById") public String getUById(Model m,int uid,String uname) { m.addAttribute("msg", u); return "main"; } 复制代码
public Class User{ private int uid; private String uname; } 复制代码
@RequestMapping("getUById") public String getUById(Model m,User u) { m.addAttribute("msg", u); return "index"; } 复制代码
刚刚入门的开发者可以看一下这个教程,希望对你的学习有所帮助!