JAVAEE框架技术之4springMVC入门

Posted teayear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVAEE框架技术之4springMVC入门相关的知识,希望对你有一定的参考价值。

springMVC

回顾MVC

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

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

是将业务逻辑、数据、显示进行分离的方式来组织代码。

MVC主要作用是降低了视图与业务逻辑间的耦合度。

MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在一些差异!

SpringMVC概述

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

简单一句话:SpringMVC简化Servlet的开发!!

总结:

SpringMVC主要解决web层的代码,本质是Servlet

Spring MVC的特点

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

springmvc 整体架构

原理-流程-springmvc面试必问

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、返回用户响应

springmvc入门

创建一个工程

创建的maven web工程

导入依赖

<!--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>

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>

dispatcherServlet控制器

配置web.xml中的添加dispatcherServlet

    <!--前端控制器-->
    <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>
        <!--
            springmvc基于拦截器实现; 拦截所有的controller请求,都会进入controller类中
		   /  拦截所有controller请求, 包括 webapp下的静态资源如:html,js,css,img (不包括jsp)
            /* 拦截所有controller请求,包括 webapp下的静态资源如: jsp(包括jsp) html,js,css,img ..
            *.xx 
		   *.do 匹配后缀
        -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

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: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.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.xsd">

</beans>

自定义Handler(Controller)

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;
    

配置HandlerMapping&HandlerAdapter -了解

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

配置handler

  	<!--配置自定义的Handler,controller-->
    <bean name="/hello.do" class="cn.yanqi.controller.Hello"/>

配置视图解析器

通过源码分析,可以看是放在WEB-INF下

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

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

测试

请求过程分析

注解开发

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

创建controller类

package cn.yanqi.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
 * @Auther: yanqi
 */
@Controller //表示当前是一个controller类
@RequestMapping("hello2")
public class Hello2 
    // @RequestMapping(value="/show1.do")
    // @RequestMapping("show1.do")
    // @RequestMapping("/show1")
    @RequestMapping("show1")
    public ModelAndView test1()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","这是第一个springmvc注解!!");
        //设置视图名   hello仅仅是视图的名字
        mv.setViewName("hello");
        return mv;
    
    @RequestMapping("show2")
    public ModelAndView test2()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","这是第一个springmvc注解!!");
        //设置视图名   hello仅仅是视图的名字
        mv.setViewName("hello");
        return mv;
    

配置注解扫描器

<!--配置注解扫描包
扫描含有@Controller的类
-->
<context:component-scan base-package="cn.yanqi"/>
<!--开启注解驱动-->
<mvc:annotation-driven/>

测试

五种映射

1、标准URL映射 
2、Ant风格的URL映射*  **
3、占位符映射  
		@requestMapping (show/userid/name )  方法中(@pathVariable(“ userid”) String id)  				http://localhost/hello2/833/yanqi.do 
4、限制请求方式映射 
		@requestMapping ( value=“ show2” , method=requestMehtod.POST)    错误405
		@GetMapping
    	@PostMapping
5、限制请求参数映射  
		@requestMapping( value=”show3” , params=”abc”) 方法中(@requestParam(“abc”) String abc)

标准映射

    /**
     * 标准映射
     * @return
     */
	@RequestMapping(value = "/show1.do")
    public ModelAndView test1()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","这是第一个springmvc注解!!");
        //设置视图名   hello仅仅是视图的名字
        mv.setViewName("hello");
        return mv;
    

Ant风格的URL映射

单级目录匹配
    @RequestMapping("test/*/show") 
    访问:   /test/a/show.do  
    访问:   /test/abc/show.do

单级目录匹配:
    @RequestMapping("test/**/show") 
    访问:   hello/test/a/b/c/show.do
    //http://localhost:8080/hello2/test/a/b/c/show4.do
    //http://localhost:8080/hello2/test/a/show4.do  多级目录可以写单级目录
    @RequestMapping("/test/**/show4")
    public ModelAndView test4()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","我是多级目录");
        mv.setViewName("hello");
        return mv;
    

    //http://localhost:8080/hello2/test/a/show4.do
    @RequestMapping("/test/*/show5")
    public ModelAndView test5()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","我是单级目录");
        mv.setViewName("hello");
        return mv;
    

占位符映射

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

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

/**
     * 占位符
     * @param itemId
     * @param name
     * @return
     */
@RequestMapping("/show6/itemId/name")
public ModelAndView test6(@PathVariable("itemId") String itemId ,@PathVariable("name") String name)
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","占位符:"+itemId +" : "+name);
        mv.setViewName("hello");
        return mv;
    

限制请求方式映射

RequestMethod.POST @PostMapping(“xx”)
RequestMethod.GET @GetMapping(“xx”)

405 请求方式不合法

    //get post 两种请求方式
	@RequestMapping(value = "/show9",method = RequestMethod.POST,RequestMethod.GET)
    public ModelAndView test9()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求方式为 GET ,  POST");
        mv.setViewName("hello");
        return mv;
    

	//post 请求方式
    @RequestMapping(value = "/show8",method = RequestMethod.POST)
    public ModelAndView test8()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求方式为 POST ");
        mv.setViewName("hello");
        return mv;
    
    
	//get  请求方式
    @RequestMapping(value = "/show7",method = RequestMethod.GET)
    public ModelAndView test7()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求方式为 GET ");
        mv.setViewName("hello");
        return mv;
    

	//post 请求方式
    @PostMapping("show11")
    public ModelAndView test11()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求方式为 POST");
        mv.setViewName("hello");
        return mv;
    
	//get 请求方式
    @GetMapping("show10")
    public ModelAndView test10()
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求方式为 GET");
        mv.setViewName("hello");
        return mv;
    
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="/hello2/show11.do" method="post">
        <input type="submit">
    </form>

</body>
</html>

接口测试工具 : postmain

限定请求参数

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

400 请求参数不合法

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

    //请求参数必须包含id  方式一
    @GetMapping(value = "show15",params = "id")
    public ModelAndView test15(@RequestParam("id") int id)
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求参数:"+id);
        mv.setViewName("hello");
        return mv;
        
    //请求参数必须包含id   方式二
    @GetMapping("show12")
    public ModelAndView test12(@RequestParam("id") int id)
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求参数:"+id);
        mv.setViewName("hello");
        return mv;
        
    
    //请求参数不参包含id
    @GetMapping(value ="show14",params = "!id")
    public ModelAndView test14(@RequestParam("name") String name)
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","限定请求参数:"+name);
        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;
    


SpringMVC页面跳转

转发

返回字符串

以上是关于JAVAEE框架技术之4springMVC入门的主要内容,如果未能解决你的问题,请参考以下文章

JAVAEE框架技术之4springMVC入门

JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD

JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD

JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD

JAVAEE框架数据库技术之11 oracle入门

JAVAEE框架数据库技术之11 oracle入门