SpringMVC初步认识

SpringMVC概述

SpringMVC通过Spring实现web模块,简化web开发

SpringMVC通过一套MVC注解,让POJO(Plain Ordinary Java Object)成为处理请求的控制器,而无需实现任何接口
支持REST风格的URL请求

原生的MVC

Model:模型,封装和映射数据
View:视图,页面显示工作
Controller:控制器,控制整个网站的跳转逻辑(Servlet)

SpringMVC初步认识

 

Spring的MVC 

SpringMVC初步认识

 

 

简单使用

运行流程:
客户端点击连接发送 http://localhost:8080/mvctest/hello
来到tomcat服务器
SpringMVC前端控制器收到所有请求
比较请求地址和哪个@RequestMapping标注匹配,决定使用哪个类的哪个方法来处理请求
前端控制器找到目标处理器类和目标方法,直接利用反射执行目标方法
方法执行完成后有一个返回值,用视图解析器拼接得到完整页面地址
拿到页面地址,前端控制器帮我们转发到页面

 

底层知识:

DefaultServlet是tomcat中处理静态资源(处了jsp和servlet外都是静态资源)的,DefaultServlet的url-pattern=/
如果DispatcherServlet(前端控制器)的url-pattern=/,则将覆盖掉DefaultServlet
jsp能访问是因为没有覆盖服务器中的JspServlet的配置
JspServlet的url-pattern如下
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

        <!--定义SpringMVC前端控制器-->
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <!--
                    如果不指定配置文件位置,默认找 /WEF-INF/前端控制器名-servlet.xml 文件
                -->
                <param-name>contextConfigLocation</param-name>
                <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
            </init-param>
            <!--    load-on-startup服务器启动的时候创建对象,值越小优先级越高,越先创建对象-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <!--   /和/*都是拦截所有请求
                   /*范围更大,还会拦截 *.jsp 请求,一旦拦截jap页面就不能显示
                   /不会拦截 *.jsp 请求,能保证jsp访问正常
            -->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
</web-app>

  

dispatcher-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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--扫描所有组件-->
    <context:component-scan base-package="com.tang"></context:component-scan>

    <!--配置一个视图解析器,能帮我们拼接页面-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

  

index.jsp

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

<a href="hello">hello</a>
</body>
</html>

  

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功</title>
</head>
<body>
访问成功
</body>
</html>

  

FirstController.java

package com.tang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

//@Controller标识表示这是一个控制器,可以处理请求
@Controller
public class FirstController {

    //@RequestMapping告诉SpringMVC这个方法用来处理什么请求,这个/可以省略,默认从当前项目下开始,但习惯加上比较好
    @RequestMapping("/hello")
    public String hello(){

        //通过视图解析器帮我们拼接
        //拼接后:/WEB-INF/pages/success.jsp
        return "success";
    }
}

  

@RequestMapping

在控制器的类定义及方法定义处都可标注
标注在类定义处相当于为方法路径指定了基本路径

 

参数

method:限定请求方式(GET、POST等)
method=RequestMethod.POST 表示只接收post请求
params:规定请求参数
params={"username"} 表示发送请求的时候必须带上一个名为username的参数
params={"!username"} 表示发送请求的时候不能带上一个名为username的参数
headers:规定请求头
consumes:规定请求头中的Content-Type,表示只接收哪种内容类型的请求
produces:给响应头中加上Content-Type,告诉浏览器返回的内容类型

支持模糊匹配
Ant风格资源地址支持3种匹配符:
?:匹配文件名中的一个字符
*:匹配文件名中任意字符
**:匹配多层路径

 

@PathVariable获取路径上的占位符

@RequestMapping("/delete/{id}"}
public void delete(@PathVariable("id") Integer id) {
    UserDao.delete(id);
}

  

REST:目的是以更简洁的URL地址来发送请求,以区分请求方式的方法来表示对同一个资源的增删改查

 

请求处理

@RequestParam

@RequestHeader

@CookieValue

获取请求参数

默认方式获取请求参数:直接给方法加上一个和请求参数同名的形参来接收,若请求没带参数,则形参值为null
注解方式获取请求参数:@RequestParam
@RequestParam:获取请求参数,使用该注解默认必须带参数(可以更改)

属性

  • value:指定要获取的参数的key
  • required:布尔值(默认为true),true表示必须传参,false表示可以不传参
  • defaultValue:默认值

@RequestParam(value="username", required=false, defaultValue="") String username 等同于 String username = req.getParameter("username");

获取请求头中的信息

属性

  • value:指定要获取的请求头的key
  • required:布尔值(默认为true),true表示必须存在,false表示可以不存在
  • defaultValue:默认值

@RequestHeader("User-Agent") String userAgent

获取Cookie

属性

  • value:指定要获取的Cookie的key
  • required:布尔值(默认为true),true表示必须存在,false表示可以不存在
  • defaultValue:默认值

@CookieValue("JSESSIONID") String jid

 

POJO

SpringMVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值,支持级联属性

@RequestMapping("/book")
public String addBook(Book book) {
	System.out.println(book);
	return "success";
}

  

原生API

SpringMVC的Handler方法可以接收的原生API:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader
  • Writer

 

CharacterEncodingFilter解决乱码问题

注意:要放在其他Filter之前

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!-- encoding指定解决POST请求乱码问题-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <!--  forceEncoding顺便解决响应乱码问题 response.setCharacterEncoding(this.encoding); -->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  

数据输出

Model

Map

ModelMap

都存放在请求域中

最终都是BindingAwareModelMap在工作

 

ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据
@SessionAttributes:只能标注在类上,将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
@ModelAttribute:标注于方法上,这个方法就会比目标方法先运行,于是,可以在目标方法执行前先保存需要的数据,然后在目标方法参数上标注该注解即可取得保存的数据

@RequestMapping("/hello")
public ModelAndView hello() {
	ModelAndView mv = new ModelAndView("success");
	mv.addObject("msg", "你好");
	return mv;
}

  

 

 

DispatcherServlet源码分析

SpringMVC初步认识

 

上一篇:python--终端工具之subprocess


下一篇:#跟着教程学# 6、maya/python window命令