SpringMVC的概述
SpringMVC的入门案列
1.创建WEB项目,引入开发的jar包(引入依赖)
<packaging>war</packaging>
<!--版本锁定-->
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<!--引入依赖包-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--SpringMVC依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--ServletAPI依赖包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.配置核心配置的控制器
<?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_3_1.xsd"
version="3.1">
<!-- SpringMVC的核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.编写springmvc.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="com.itheima"></context:component-scan>
<!-- 配置spring开启注解mvc的支持-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4.编写index.jsp和HelloController控制器
4.1success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
SpringMVC入门案例!
</body>
</html>
5.HelloController控制器
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/****
* @Author:itheima
* @Description:
*****/
@Controller
public class HelloController {
/******
* 请求地址 http://localhost:18081/hello
* @RequestMapping(path = "/hello"):用户请求/hello的时候,由该注解所在的方法处理
* method:过滤了用户请求提交的方式
* method = RequestMethod.POST:用户以POST条,才能被该方法拦截处理\
*
*
* params用的比较少,这里不做要求掌握。
* param1: 表示请求必须包含名为 param1 的请求参数
* !param1: 表示请求不能包含名为 param1 的请求参数
* param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
* {“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1
* params = {"name"}:用户请求提交,必须要传入一个name参数
*
*
* headers用的比较少,这里不做要求掌握。
* param1: 表示请求头必须包含名为 param1 的请求头信息
* !param1: 表示请求头不能包含名为 param1 的请求头信息
* param1 != value1: 表示请求头包含名为 param1 的请求头信息,但其值不能为 value1
* {“param1=value1”, “param2”}: 请求必头须包含头信息 param1 和param2的两个请求头信息 ,且 param1 的值必须为 value1
*/
@RequestMapping(path = "/hello")
public String sayHello(){
System.out.println("SpringMVC hello!");
//只需要写页面的名字即可(不用写全路径,不用写后缀)
return "success";
//ViewResolver
//prefix+[返回的页面名字]+suffix
}
}
入门案列的执行流程
组件解析:
1.前端控制器(DispathcherServlet)
2.处理映射器(HandlerMapping)
3.处理器(Handler)
4.处理器适配器(HandlAdapter)
5.视图解析器(Viem Resolver)
6.视图(View)
RequestMapping注解
源码
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
RequestMapping注解的作用是建立请求URL和处理的方法之间的对应的关系
出现位置:
类上:
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头
他出现的目的是为了使我们的URL可以按照模块化管理:
列如:
账户模块: 订单模块:
/account/add /order/add
/account/update/ /order/update
/account/delete /order/delete
.........
红色部分就是把RequsetMappding写在类上,使我们URL更加精细
访问上:请求URL的第二级访问目录。
RequestMapping注解可以作用在方法和类上
作用在类上:第一级的访问目录
作用在方法上:第二级的访问目录
细节:路径可以不编写 / 表示应用的根目录开始
细节:${ pageContext.request.contextPath }也可以省略不写
案列:
案例:处理的请求路径是 http://localhost:8085/hello/say
@Controller
@RequestMapping(value = "/hello")
public class HelloController {
/**
* 接收请求
* @return
*/
@RequestMapping(value = "/say")
public String sayHello() {
System.out.println("Hello SpringMVC!!");
return "success";
}
}
RequestMapping的属性
path:路径指定的请求的路径url
列如: 在HelloController方法上加了@RequestMapping(path="/hello"),而sayHello方法上加了@RequestMapping(path="/say"),此时用户可以直接访问 http://localhost:8085/hello/say 来访问该方法.
@Controller
@RequestMapping(path = "/hello")
public class HelloController {
/**
* 此时用户访问此方法路径为 http://localhost:8085/hello/say
* @return
*/
@RequestMapping(value = "/say")
public String sayHello() {
System.out.println("Hello SpringMVC!!");
return "success";
}
}
value属性和path属性是一样的
method:指定该请求的方式
我们这里写了sayHello()和sayYourName()2个方法,但他们请求路径相同,而method属性的值不一样,如果是RequestMethod.GET,则只能以方式请求,如果是RequestMethod.POST则只能以POST方式请求。
@Controller
@RequestMapping(value = "/hello")
public class HelloController {
/**
* 加了method = RequestMethod.GET
* 此时此方法只接收 http://localhost:8085/hello/say 的GET提交方式请求
* @return
*/
@RequestMapping(value = "/say",method = RequestMethod.GET)
public String sayHello() {
System.out.println("Hello SpringMVC!!调用了GET方法");
return "success";
}
/**
* 加了method = RequestMethod.POST
* 此时此方法只接收 http://localhost:8085/hello/say 的POST提交方式请求
* @return
*/
@RequestMapping(value = "/say",method = RequestMethod.POST)
public String sayYourName() {
System.out.println("Hello SpringMVC!!调用了POST方法");
return "success";
}
}
params:指定限制请求的参数的条件
params用的比较少,这里不做要求掌握。
param1: 表示请求必须包含名为 param1 的请求参数
!param1: 表示请求不能包含名为 param1 的请求参数
param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1
列如:
/**
* headers参数:
* "Accept":表示请求头必须包含Accept头信息
* "!Date":表示请求头中不能包含Date的头信息
* "Accept-Encoding!=zh-CN":表示请求头中Accept-Encoding头信息的值不能为zh-CN
* "Host=localhost:18081":表示请求头中Host的值必须为localhost:18081
*
* @return
*/
@RequestMapping(headers = {"Accept","!Date","Accept-Encoding!=zh-CN","Host=localhost:18081"},
value = "/say",method = RequestMethod.GET)
public String sayHello() {
System.out.println("Hello SpringMVC!!调用了GET方法");
return "success";
}