SpringMVC——快速入门

目录

1、SpringMVC

1.1、回顾MVC架构

1.2、SpringMVC概述

1.3、SpringMVC的特点

1.4、SpringMVC整体架构

2、SpringMVC快速入门

2.1、创建一个web工程

2.2、导入依赖坐标

2.3、tomcat插件

2.4、配置DispatcherServlet前端控制器

2.5、SpringMVC核心配置文件

2.6、创建页面

2.7、自定义Headler(Controller)

3、注解开发

3.1、创建Controller类

4、五种映射

4.1、标准映射

4.2、Ant风格url映射 

4.3、占位符映射

4.4、限定请求方式映射

4.5、限定请求参数

5、SpringMVC页面跳转

5.1、返回字符串

5.2、转发(forward关键字)

5.3、重定向(redirect关键字)

6、SpringMVC存储数据

6.1、servlet存储数据

6.2、Model存储数据


1、SpringMVC

1.1、回顾MVC架构

MVC是模型(Model) 、视图(View) 、控制器(Controller) 的缩写,是一种软件设计规范。

Model :      javaBean (1.处理业务逻辑,2. 封装数据)
View:        视图  jsp/html(展示数据)
controller:  控制器 (1.接收请求,2.调用模型,3.转发视图)

MVC是将业务逻辑、数据、显示进行分离的方式来组织代码。MVC主要作用是降低了视图与业务逻辑间的耦合度。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在一些差异!

1.2、SpringMVC概述

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。它可以通过一套注解,让一个简单的Java类成为控制器,而无须实现任何接口。

简单一句话:SpringMVC简化Servlet的开发!!,SpringMVC主要解决web层的代码,本质是Servlet。

1.3、SpringMVC的特点

1、轻量级,简单易学。
2、高效 , 基于请求响应的MVC框架。
3、与Spring兼容性好,无缝结合。
4、约定优于配置(SpringBoot)。
5、功能强大:RESTful、数据验证、格式化、本地化、主题等。
6、简洁灵活。

1.4、SpringMVC整体架构

主要组件有五个:

前端控制器(DispatcherServlet):只负责接收和响应

处理器映射器(HandlerMapping):根据请求的url查找对应的处理器

处理器(Handler):程序员自己定义的处理器

处理器适配器(HandlerAdpter):对处理器handler进行执行

视图解析器(ViewResvoler):进行视图解析,返回的数据,进行处理,可以解析成对应的页面信息

1、用户发起请求到控制器 DispatcherServlet(前端控制器)
2、前端控制器去handlerMapper查找Handler对象
3、HandlerMapper返回HandlerExecutorChain 执行链(包含两部分内容:Handler ,拦截器集合)
4、前端控制器,通过HandlerAdapter 适配器执行 Handler对象
5、Handler处理具体的业务逻辑
6、Handler处理完业务逻辑之后,返回ModelAndView  其中的View是视图名称
7、将ModelAndView返回前端控制器
8、前端控制器,通过ModelAndView 中的视图名称。在视图解析器中查找视图
9、返回真正的View 视图对象
10、渲染视图
11、返回用户响应

2、SpringMVC快速入门

2.1、创建一个web工程

创建的maven web工程

2.2、导入依赖坐标

<!--springmvc依赖包,springmvc 只有这一个包-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.9.RELEASE</version>
</dependency>

<!--serlvet-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>

<!--jsp-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.0</version>
  <scope>provided</scope>
</dependency>

<!--日志-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.4</version>
</dependency>

<!--测试-->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

2.3、tomcat插件

<build>
  <plugins>
    <!--添加tomcat插件-->
    <plugin>
       <groupId>org.apache.tomcat.maven</groupId>
       <artifactId>tomcat7-maven-plugin</artifactId>
       <version>2.2</version>
       <configuration>
           <port>8080</port>
           <path>/</path>
       </configuration>
    </plugin>
    
  </plugins>
</build>

点击右上角的Add Configuration

 

点击左上角的+号,选择下面的Maven添加,在后面的配置栏中填写tomcat7:run后应用ok

2.4、配置DispatcherServlet前端控制器

在web.xml配置文件中进行配置DIspatcherServlet前端控制器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
           version="3.0">
    <!--前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载指定配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--指定servlet在tomcat启动时创建-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--
            *.do           匹配后缀
            /              请求不了 html,js,css,img
            /*             只能访问controller请求
        -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

2.5、SpringMVC核心配置文件

配置springmvc-servlet.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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--HandlerMapping 映射器  springmvc会自己配置无需配置  -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--HandlerAdapter 适配器 springmvc会自己配置无需配置-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--配置自定义的handler controller-->
    <bean name="handler" class="cn.itssl.controller.Hello"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2.6、创建页面

根据前缀创建一个对应位置的页面hello.jsp,注意:这里的视图名一定要和自定义Headler里setViewName方法中写的名字一致,因为前端控制器会根据这个视图名去寻找页面后进行数据回显。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

2.7、自定义Headler(Controller)

创建一个Hello类去实现Controller接口,并重写里面的方法handleRequest。

public class Hello implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","这是第一个springmvc程序!!");

        //设置视图名   hello仅仅是视图的名字
        mv.setViewName("hello");

        return mv;
    }
}

注意:这里的setViewName里面填写的名字就是视图名,会自动为我们进行拼接前缀和后缀,因为在配置文件中我们进行了配置,所以它最后请求的路径即为:localhost:8080/hello.do,这里的.do是我在web.xml中的url-pattern中配置的匹配后缀,跟拼接后缀.jsp没有任何关系。

3、注解开发

入门案例中的思考:
    1、每个类需实现Controller,麻烦
    2、每个类只能处理一个业务逻辑,不能是controller处理多个业务逻辑。
    3、每一个Controller都需要进行配置
    使用注解:解决上述问题

学会了使用xml配置文件后,总觉得太过于麻烦,那么注解开发可以很简单的进行,省略了xml配置的繁琐。

3.1、创建Controller类

@Controller//注解声明这是一个Controller类
@RequestMapping("/hello")
public class Hello2 {
    //标准映射 value可以省略不写,以及/也可省略不写
    @RequestMapping(value = "/show")
    public ModelAndView test1(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是第一个springmvc注解!!");
        mv.setViewName("hello");
        return mv;
    }
}

 配置核心配置文件(开启注解扫描和开启springMVC注解驱动)

<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--扫描包下的注解-->
    <context:component-scan base-package="cn.itssl.*"/>
    <!--开启注解驱动-->
    <mvc:annotation-driven/>
</beans>

启动tomcat服务器测试

4、五种映射

4.1、标准映射

  //标准映射
    @RequestMapping(value = "/show")
    public ModelAndView test1(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是第一个springmvc注解!!");
        mv.setViewName("hello");
        return mv;
    }

4.2、Ant风格url映射 

 //Ant风格url映射
    @RequestMapping("/test/*/show2")
    public ModelAndView test2(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是第一个springmvc注解!!2222");
        mv.setViewName("hello");
        return mv;
    }

多级目录可以写单级目录 

//多级目录可以写单级目录
    @RequestMapping("/test/**/show3")
    public ModelAndView test3(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是第一个springmvc注解!!2222");
        mv.setViewName("hello");
        return mv;
    }

4.3、占位符映射

@RequestMapping(“/user/{userId}/query")

通过@PathVariable(“xxx”) 获取请求路径中参数值

//占位符映射
    @RequestMapping("/show4/{itemId}/{name}")
    public ModelAndView test4(@PathVariable("itemId") String itemId,@PathVariable("name") String name){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","itemId:"+itemId+" name:"+name);
        mv.setViewName("hello");
        return mv;
    }

4.4、限定请求方式映射

RequestMethod.POST @PostMapping("xx")

RequestMethod.GET @GetMapping("xx")

//限制请求方式映射
    //post请求方式
    @RequestMapping(value = "/show5",method = RequestMethod.POST)
    public ModelAndView test5(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是指定了post请求方式");
        mv.setViewName("hello");
        return mv;
    }
    //限制请求方式映射
    //get请求方式
    @RequestMapping(value = "/show6",method = RequestMethod.GET)
    public ModelAndView test6(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是指定了get请求方式");
        mv.setViewName("hello");
        return mv;
    }
    //限制请求方式映射
    //post/get请求方式  @RequestMapping默认
    @RequestMapping(value = "/show7",method = {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView test7(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是指定了get/post请求方式");
        mv.setViewName("hello");
        return mv;
    }

以上方式可由下面替代 

    @GetMapping("show8")
    public ModelAndView test8(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是指定了get请求方式");
        mv.setViewName("hello");
        return mv;
    }
    @PostMapping("show9")
    public ModelAndView test9(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","这是指定了post请求方式");
        mv.setViewName("hello");
        return mv;
    }

4.5、限定请求参数

可以防止用户把不必要的信息注入进来

@GetMapping(value = "show15",params = "id")          必须包含id
@GetMapping(value = "show15",params = "!id")         不能包含id
@GetMapping(value = "show15",params = "id!=1007")    包含id其值不为1007

    //请求参数必须包含id  方式一
    @GetMapping(value = "show10",params = "id")
    public ModelAndView test10(@RequestParam("id") int id){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","限定请求参数:"+id);
        mv.setViewName("hello");
        return mv;
    }
    //请求参数必须包含id   方式二
    @GetMapping(value = "show11")
    public ModelAndView test11(@RequestParam("id") int id){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","限定请求参数:"+id);
        mv.setViewName("hello");
        return mv;
    }
    //请求参数不包含id
    @GetMapping(value = "show12",params = "!id")
    public ModelAndView test12(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","非id参数");
        mv.setViewName("hello");
        return mv;
    }
    //请求参数包含id其值不能为1007
    @GetMapping(value ="show13",params = "id!=1007")
    public ModelAndView test13(@RequestParam("id") int id){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求参数:"+id);
        mv.setViewName("hello");
        return mv;
    }

5、SpringMVC页面跳转

5.1、返回字符串

@Controller
@RequestMapping("hello3")
public class Hello3 {
    @RequestMapping("show1")
    public ModelAndView show1(){
        //第一种 ModelAndView 转发到视图解析器
        return new ModelAndView("hello");
    }
    //第二种 String 转发到视图解析器
    @RequestMapping("show2")
    public String show2(){
        return "hello";
    }
    //第三种 void 没有返回的视图
    @RequestMapping("show3")
    @ResponseStatus(HttpStatus.OK)
    public void show3(){
        System.out.println("我没有要返回的结果..");
    }

    //第四种 转发--通过servlet内置对象
    @RequestMapping("show4")
    public void show4(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request,response);
    }
}

5.2、转发(forward关键字)

    //第一种 转发--webapp   页面
    @RequestMapping("show5")
    public String show5(){
        return "forward:/user.html";
    }
    //第二种 转发--webapp   controller类
    @RequestMapping("show6")
    public String show6(){
        return "forward:/hello/show.do";
    }

    //第三种 转发--ModelAndView
    @RequestMapping("show7")
    public ModelAndView show7(ModelAndView mv){
        mv.setViewName("forward:/user.html");//webapp下的页面
        return mv;
    }
    //第三种 转发--ModelAndView
    @RequestMapping("show8")
    public void shiw8(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/user.html").forward(request,response);
    }

5.3、重定向(redirect关键字)

此关键字的底层:response.sendRedirect("web项目地址+重定向地址");

@Controller
@RequestMapping("hello4")
public class Hello4 {
    //第一种 重定向 redirect关键字
    @RequestMapping("show1")
    public String show1(){
        return "redirect:/user.html";//重定向webapp下的具体页面
    }
    //第二种 重定向 ModelAndView
    @RequestMapping("show2")
    public ModelAndView show2(ModelAndView mv){
        mv.setViewName("redirect:/user.html");
        return mv;
    }
    //第三种 重定向 绑定servlet内置对象
    @RequestMapping("show3")
    public void show3(HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.sendRedirect(request.getContextPath()+"/user.html");
    }
}

6、SpringMVC存储数据

在webapp包下创建list.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
姓名:
${requestScope.name}
城市:
${requestScope.city}
年龄:
${requestScope.age}
</body>
</html>

6.1、servlet存储数据

@Controller
@RequestMapping("test")
public class ServletTest {


    @RequestMapping("requestAPI")
    public void requestAPI(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name","itssl");
        request.getRequestDispatcher("/list.jsp").forward(request,response);
    }
    
}

6.2、Model存储数据

//方式一 ModelAndView存数据
    @RequestMapping("modelAndViewTest")
    public ModelAndView modelAndViewTest(ModelAndView mv){
        mv.addObject("name","jack");
        mv.setViewName("list");
        return mv;
    }
    //方式二 Model
    @RequestMapping("TestModel")
    public String modelAndViewTest2(Model model){
        model.addAttribute("name","rose");
        return "forward:/list.jsp";
    }
    //方式三 ModelMap
    @RequestMapping("TestModelMap")
    public String modelAndViewTest3(ModelMap modelMap){
        modelMap.addAttribute("city","zhengzhou");
        return "forward:/list.jsp";
    }
    //方式四 Map
    @RequestMapping("TestMap")
    public String modelAndViewTest4(Map<Object,Object> map){
          map.put("age",21);
          return "forward:/list.jsp";
    }

猜你喜欢

转载自blog.csdn.net/select_myname/article/details/127542903