SpringMvc(一)-初识
1、环境搭建
1.1 jar包
<spring.version>4.3.18.RELEASE</spring.version>
<!-- spring-mvc begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-mvc end -->
1.2 web.xml
前端核心控制器(dispatcherServlet)
- 配置初始化参数,指定springMvc的核心配置文件,目的就是自动创建容器对象
- 启动级别 1
Rest风格 请求转换过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!--前端核心控制器 springMvc框架提供的 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,指定springMvc的核心配置文件,目的就是自动创建容器对象 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- web容器启动,优先创建前端核心控制器实例对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 拦截所有的请求处理,放行jsp -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Rest风格 请求转换过滤器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
1.3spring-mvc.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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com.kgc.mvc"></context:component-scan>
<!-- jsp 视图解析器 -->
<!-- 作用:当请求处理方法返回一个目标视图页面的名称,视图解析器会自动将返回的视图名称解析为真实的物理视图(prefix + 目标视图页面名称 + suffix) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 统一前缀,请求处理方法返回目标视图名称时,会被统一增加此前缀目录(目录视图目录),结尾的 / 不能少 -->
<property name="prefix" value="/WEB-INF/views/"></property>
<!-- 统一后缀,请求处理方法返回目标视图名称时,会被统一增加此后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
2、Mvc 使用流程
需求,浏览器发送请求helloMvc,请求后端处理方法,返回目标success。jsp页面,并在页面中显示 Hello Mvc in KH96;
2.1 HelloMvcController
@Controller //不可以用其他的分层注解替换,只能用controller (1.可以作为一个控制层组件扫描到容器 2.代表一个控制器)
public class HelloMvcController {
//接收helloMvc,跳转到目标success.jsp
@RequestMapping("/helloMvc") //定义当前请求控制器中,可以处理请求的映射url字符串,前面的 / 可写 可不写
public String helloSpringMvc(){
System.out.println("------ 调用 HelloMvcController控制器的 helloSpringMvc() 请求处理方法------");
//目标jsp视图页面的名称(不带后缀),区分大小写
return "success";
}
}
2.2 success.jsp
webapp/WEB-INF/views/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功页面</title>
</head>
<body>
<h2>KH96 Success Page</h2>
</body>
</html>
2.3 测试

2.4 总结
springMvc使用流程小结:
- 1、Tomcat服务器启动时,自动创建前端核心控制器的实例-DispatcherServlet,同时自动读取配置的spring-mvc.xml核心配置文件,创建容器对象,并扫描组件加入到容器中;
即:将控**制器组件**(加了@Controller注解)**加入到容器中**,并**自动解析**加入的**请求控制器**,可以得到**请求处理url**和**请求处理方法**的**映射**;
2、客户端浏览器,**发送请求**:http://localhost:8080/springmvc-01/helloMvc
3、请求会被 **前端核心控制器** **拦截**(匹配到**前端核心控制器**的**url-pattern**)
4、**前端核心控制器** ,自动根据请求**url和请求处理方法的映射关系**,进行**映射查找**,如果**找到了**对应关系,自动将**当前请求**发送**给目标请求处理器**的请求处理方法,进行业务处理,如果**没有找到**,直接**报错误404**;
5、目标请求处理方法,处理完业务后,**返回**一个目标**视图的名称**-success
- 6、返回的目标视图名称,仍然会交给 前端核心控制器 进行视图解析(自动调用容器中添加的视图解析器解析),会得到一个真实的目标物理视图页面(要跳转的真实页面),进行响应跳转目标页面给浏览器显示;
3、@RequestMapping
3.1 @RequestMapping可以写的位置
类上和方法上 :
类上:相对于web应用根目录的;
方法上:相对于类上的映射,如果类上没有,就是相对于web应用根目录;
3.1.1 只用方法上有
@RequestMapping("/testSpringMvcRequestMappingTarget")
public String testMvcRequestMappingTarget(){
//返回成功页面
return "hello";
}
测试

3.1.2 类上 和 方法上都有
@Controller
@RequestMapping("/kh96")
public class SpringMvcController {
@RequestMapping("/testSpringMvcRequestMappingTarget")
public String testMvcRequestMappingTarget(){
//返回成功页面
return "hello";
}
}
测试

3.2 method属性
作用:指定当前请求处理方法的请求方式;
一旦指定了请求方式,就只能使用指定的请求方式,才可以映射处理,不指定,自动适配(所有方式都可以);
method 属性可以指定多个请求方式;
3.2.1 method = RequestMethod.GET
@RequestMapping(value = "/testSpringMvcRequestMappingMethodGet",method = RequestMethod.GET)
public String testSpringMvcRequestMappingMethodGet(){
System.out.println("----- @RequestMapping method = RequestMethod.GET ------");
//返回成功页面
return "hello";
}
使用PostMan测试
Get测试

Post测试

3.2.2 method = RequestMethod.POST
@RequestMapping(value = "/testSpringMvcRequestMappingMethodPost",method = RequestMethod.POST)
public String testSpringMvcRequestMappingMethodPost(){
System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
//返回成功页面
return "hello";
}
Get测试

Post测试

3.2.3 method = {RequestMethod.GET,RequestMethod.POST})
@RequestMapping(value = "/testSpringMvcRequestMappingMethodGetAndPost",method = {RequestMethod.GET,RequestMethod.POST})
public String testSpringMvcRequestMappingMethodGetAndPost(){
System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
//返回成功页面
return "hello";
}
Get测试

Post测试

3.3 params属性
指定当前请求处理方法对于请求,必要携带的参数:
- 写法1:指定当前请求必须携带的参数名,没有参数值,可以指定多个(大括号,逗号分割),如果请求没有携带params的所有参数,请求404;
- 写法2:指定当前请求必须携带的参数名和对应的参数值,可以指定多个(大括号,逗号分割),如果请求没有携带params指定的所有参数,请求404,如果请求携带的参数及对应的参数值不匹配,请求404;
- 注意:携带的参数值必须是指定的参数值
- 总结,必须携带所有的参数,如果有指定参数值,必须携带参数值且携带的参数值必须一致;
3.3.1 params ={"uname"}
指定一个参数,不指定参数值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname"} )
public String testSpringMvcRequestMappingParams(){
System.out.println("----- @RequestMapping 属性 params------");
//返回成功页面
return "hello";
}
测试,不带参数

测试,带参数,不带值

测试,带参数,带值

3.3.2 params ={"uname=kh96"}
指定一个参数,指定值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96"} )
public String testSpringMvcRequestMappingParams(){
System.out.println("----- @RequestMapping 属性 params------");
//返回成功页面
return "hello";
}
测试,带参数,带值,值不匹配

测试,带参数,带值,值匹配

3.3.3 params ={"uname=kh96","upwd=123"}
指定两个参数,并指定值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96","upwd=123"})
public String testSpringMvcRequestMappingParams(){
System.out.println("----- @RequestMapping 属性 params------");
//返回成功页面
return "hello";
}
测试,带一个参数,并指定值

测试,带两个参数,并指定第一个值

测试,带两个参数,并指定第两个值

3.4 headers属性
指定当前请求处理方法对于请求,必要携带的请求头参数,用法和params类似,参数位置不同;
@RequestMapping(value = "/testSpringMvcRequestMappingHeaders",headers = {"token=123"})
public String testSpringMvcRequestMappingHeaders(){
System.out.println("----- @RequestMapping 属性 headers------");
//返回成功页面
return "hello";
}
测试,主要观察参数位置,其他参数规则跟params一致

3.5 @RequestMapping + @PathVariable
请求映射注解:参数占位符注解 @PathVariable:
- 写法:只能携带请求处理方法的形参中,自动将RequestMapping中指定的url使用的占位符绑定参数值,
- 即:请求地址映射为: /url/{参数名},目标请求为:/url/参数值,自动将参数值绑定到指定参数名上;
- 要求1:@RequestMapping("指定参数名")注解请求url中,指定的占位符参数名,必须跟当前请求方法形参中@PathVariable注解指定的参数名一致;否者报错: Could not find @PathVariable [utel] in @RequestMapping
- 要求2:@RequestMapping,只写注解,不指定参数名,指定的占位符参数名,必须跟当前请求方法形参名一致(也就是默认为形参名);否则,报错:Could not find @PathVariable [uemail] in @RequestMapping
3.5.1 测试
3.5.1.1 占位符与@PathVariable注解指定的参数名不一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel#}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功页面
return "hello";
}
测试结果

3.5.1.2 占位符与@PathVariable注解指定的参数名一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功页面
return "hello";
}
测试结果

3.5.1.3 @PathVariable不指定参数名
测试,占位符与形参不一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail#}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功页面
return "hello";
}
测试结果

测试,占位符与形参一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功页面
return "hello";
}
测试结果

4.Rest风格
- get------查询select
- post------新增insert
- put------更新update
- delete------删除delete
相同的请求路径,通过请求方式判断请求方法;
自定义请求方式,一定要带一个名字为_method的参数;
4.1 Rest风格 请求转换过滤器
<!-- Rest风格 请求转换过滤器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.1 get------查询 select
请求方法
//请求映射注解:rest风格处理-get,查询select
//@RequestMapping(value = "/testSpringMvcRequestMappingRestGet/{uid}",method = RequestMethod.GET)
@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.GET)
public String testSpringMvcRequestMappingRestGet(@PathVariable("uid") String uid){
System.out.println("----- Rest Get 根据 uid:"+uid+" 查询用户详情 ------");
//返回成功页面
return "hello";
}
jsp
<h3>Get 请求映射注解:rest风格处理-get,查询select</h3>
<h3><a href="${pageContext.request.contextPath}/testSpringMvcRequestMappingRest/KH96_01">Test SpringMvc Rest Get</a> </h3>
测试

4.2post------新增 insert
//请求映射注解:rest风格处理-post,新增insert
//@RequestMapping(value = "/testSpringMvcRequestMappingRestPost",method = RequestMethod.POST)
@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.POST)
public String testSpringMvcRequestMappingRestPost(){
System.out.println("----- Rest Post 新增用户详情 ------");
//返回成功页面
return "hello";
}
jsp
<h3>Post 求映射注解:rest风格处理-post,新增insert</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
<input type="submit" value="Test SpringMvc Rest Post">
</form>
测试

4.3 put------更新 update
//请求映射注解:rest风格处理-put,更新update
//@RequestMapping(value = "/testSpringMvcRequestMappingRestPut",method = RequestMethod.PUT)
@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.PUT)
public String testSpringMvcRequestMappingRestPut(){
System.out.println("----- Rest Put 更新用户详情 ------");
//返回成功页面
return "hello";
}
jsp
<h3>Put 请求映射注解:rest风格处理-put,更新update</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
<input type="hidden" name="_method" value="put">
<input type="submit" value="Test SpringMvc Rest put">
</form>
测试

4.4 delete------删除 delete
//请求映射注解:rest风格处理-delete,删除delete
//@RequestMapping(value = "/testSpringMvcRequestMappingRestDelete/{uid}",method = RequestMethod.DELETE)
@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.DELETE)
public String testSpringMvcRequestMappingRestDelete(@PathVariable("uid") String uid){
System.out.println("----- Rest Delete 根据 uid:"+uid+" 删除用户 ------");
//返回成功页面
return "hello";
}
jsp
<h3>Delete 请求映射注解:rest风格处理-delete,删除delete</h3>
<form action="testSpringMvcRequestMappingRest/KH96_01" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="Test SpringMvc Rest delete">
</form>
测试

SpringMvc(一)-初识的更多相关文章
- SpringMVC 配置 & 初识 & 注解 &重定向与转发
初识 在web.xml 中注册DispatcherServlet <servlet> <servlet-name>springmvc</servlet-name> ...
- springMvc入门--初识springMvc
springMvc是什么 springmvc是表现层的框架,是一个spring的表现层组件.是整个spring框架的一部分,但是也可以不使用springmvc.跟struts2框架功能类似.其中的mv ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
- SpringMVC学习系列(1) 之 初识SpringMVC
1.前言: 与SpringMVC的结识源于个人之前想做一个微信公众账号的管理平台玩玩,既然要做就需要考虑平台的选择问题.由于我的朋友只有一台运行了Linux系统的虚拟主机,且上面还运行有他自己的一些论 ...
- springMVC学习笔记--初识springMVC
前一段时间由于项目的需要,接触了springMVC(这里主要是讲3.1版,以下内容也是围绕这个版本展开),发觉其MVC模式真的很强大,也简单易用,完全是基于注解实现其优雅的路径配置的.想想以前接手的项 ...
- [一]初识SpringMVC
是什么? web开发框架 为什么用? 功能强大 怎么做? 1.导入jar包 2.配置web.xml <?xml version="1.0" encoding="UT ...
- SpringMVC基础学习(一)—初识SpringMVC
一.HelloWorld 1.导入SpringMVC所需的jar包 2.配置web.xml 配置DispatcherServlet.DispatcherServlet默认加载/ ...
- SpringMVC 框架系列之初识与入门实例
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1). MVC:Model-View-Control Contr ...
- 初识 SpringMVC
1.Spring MVC 的工作流程 1.web请求被 前端控制器(DispatcherServlet)拦截 2.DispatcherServlet调用 映射处理器(HandelerMapping)查 ...
随机推荐
- 第三章、DNS域名解析服务
DNS 1DNS简介 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务.它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS ...
- 敲了几万行源码后,我给Mybatis画了张“全地图”
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.说说:"产"后感受 有人跟我说,手写Spring难,手写Mybatis ...
- JS:typeof
想要弄明白某一个变量中保存的数据到底是什么数据类型,我们可以使用到typeof操作符. typeof操作符:检测变量的数据类型. 看例子! var a = "abc"; var b ...
- 『忘了再学』Shell流程控制 — 34、if条件判断语句(二)
目录 1.多分支if条件语句格式 2.练习 3.说明 4.综合练习 1.多分支if条件语句格式 if [ 条件判断式1 ] then 当条件判断式1成立时,执行程序1 elif [ 条件判断式2 ] ...
- SpringBoot的浅浅配置和小整合
SpringBoot的浅浅配置和小整合 本文如题,就是浅浅记录一下学习的过程中一些过程,比较简单,并没有多少深度.谢谢! SpringBoot创建 从IDEA中新建项目或者模块.注意jdk版本,一般不 ...
- 倾斜摄影3D模型|手工建模|BIM模型 轻量化处理
一.什么是大场景? 顾名思义,大场景就是能够从一个鸟瞰的角度看到一个大型场景的全貌,比如一个园区.一座城市.一个国家甚至是整个地球.但过去都以图片记录下大场景,如今我们可以通过建造3D模型来还原大场景 ...
- ASPNET Core笔试题
1.如何在ASP.NET Core中激活Session功能? 首先要添加session包. 其次要在configservice方法里面添加session.然后又在configure方法里面调用 use ...
- 一文读懂数仓中的pg_stat
摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中.这些信息可以通过 "pg_stat_all_tables视图& ...
- 一个月后,我们又从 MySQL 双主切换成了主 - 从!
这是悟空的第 157 篇原创文章 官网:www.passjava.cn 你好,我是悟空. 一.遇到的坑 一个月前,我们在测试环境部署了一套 MySQL 高可用架构,也就是 MySQL 双主 + Kee ...
- 螣龙安科反入侵:EDR的缺点
EDR解决方案提供了比传统终结点安全解决方案更高的功能,并且可以增加人员数量,但是这些功能都有不少的缺点. EDR功能付出巨大代价 在过去四年中,虽然产品成本平均每年下降约35%,但即使到今天,产品的 ...