SpringMvc入门,已获千赞
作者:互联网
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718151958619.png)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718152019361.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
地址栏没变,说明这是一次转发操作
* * *
[]( )运行流程分析
=====================================================================
**1.客户端点击链接发送http://localhost:8080/springmvc/hello 请求**
**2.来到tomcat服务器**
**3.springmvc的前段控制器收到所有请求**
**4.查看请求地址和@RequestMapping标注的哪一个匹配,来找到到底使用哪个类的哪个方法来处理**
**5.前段控制器找到了目标处理器和目标方法,直接利用反射执行目标方法**
**6.方法执行完成以后,会有一个返回值,springmvc认为这个返回值就是要去的页面地址**
**7.拿到方法返回值以后,用视图解析器进行拼串得到完整的页面地址**
**8.拿到页面地址,前段控制器帮我妈转发到页面**
* * *
[]( )@RequestMapping分析
================================================================================
**作用:就是告诉SpringMvc这个方法用来处理什么请求**
**这里@RequestMapping("/hello")里面的/可以省略,即使省略了,也是默认从当前项目下开始,最好加上**
* * *
[]( )如果不在web.xml中指定配置文件位置的解决办法
========================================================================================
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718153331247.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718153526101.png)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718153712222.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718153938936.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
[]( )url-pattern的配置
=============================================================================
<servlet-name>DispatcherServlet</servlet-name>
<!--
/和/*都是拦截所有请求,但是/*的范围更大,还会拦截到*.jsp这些请求
一旦拦截jsp页面就不会显示了
/会拦截所有请求,但是不会拦截*.jsp,能保证jsp访问正常
处理*.jsp是tomcat做的事情
DefaultServlet是tomcat中处理静态资源的
除了jsp和servlet外,剩下的都是静态资源
index.html:静态资源,tomcat会在服务器下找到这个资源并返回
我们前端控制器的/禁用了tomcat服务器中的DefaultServlet(相当于子类重写了父类的配置,那么就会隐藏父类的配置)
1.服务器的大Web.xml中有一个DefaultServlet的url-pattern=/
2.我们配置的前端控制器url-pattern=/
静态资源会来到DefaultServlet(前端控制器)来看哪个方法的RequestMapping是这个index.html
3.我们没有覆盖服务器中的JspServlet的配置
4./*直接就是拦截所有请求,我们写/是为了迎合后来的Rest风格的URL地址
-->
<url-pattern>/</url-pattern>
* * *
[]( )使用@RequestMapping映射请求
====================================================================================
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=2021071815502991.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
[]( )一个方法处理一个请求,不能两个方法处理一个请求,不然报错
-------------------------------------------------------------------------------------------
[]( )类上加上注解,访问时的路径需要多加一层
----------------------------------------------------------------------------------
/*
-
为当前类的所有的方法的请求地址指定了一个基准路径
-
*/
@Controller
@RequestMapping("/haha")
public class userController {
/*
* /代表从当前项目开始
* 处理当前项目下的hello请求
* 请求映射
* */
@RequestMapping("/hello")
public String show()
{
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718184440399.png)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718184431803.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
[]( )@RequestMapping注解的相关属性
-------------------------------------------------------------------------------------
### []( )method限定请求方式
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718163803453.png)
@Controller
public class userController {
/*
* /代表从当前项目开始
* 处理当前项目下的hello请求
* 请求映射
* */
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String show()
{
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
* * *
### []( )params规定请求参数
#### []( )建议看下面的这篇链接文章
[@RequestMapping中的params(请求参数映射限定)]( )
* * *
### []( )headers规定请求头
[@RequestMapping中的headers(请求头数据映射限定)]( )
/*
-
为当前类的所有的方法的请求地址指定了一个基准路径
-
*/
@Controller
public class userController {
/*
-
user-agent: 浏览器信息
-
实现让谷歌不能访问,火狐能访问
-
*/
@RequestMapping(value = “/hello”,headers =
{"User-Agent=User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"})
public String show()
{
System.out.println("收到请求"); //视图解析器自动拼串 //前缀+返回值+后缀 return "Success";
}
}
* * *
### []( )consumes:只接收内容类型是哪种的请求,规定请求头中的content-type
### []( )produces:告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;char
[@RequestMapping中的consumes属性和produces属性]( )
* * *
### []( )ant风格的URL----URL地址可以写模糊的通配符
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718185245675.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718171151936.png)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718171408684.png)
\*号优先级比?号低
[]( )模糊和精确多个匹配情况下,精确优先
--------------------------------------------------------------------------------
* * *
**?代替一个字符:**
/*
-
为当前类的所有的方法的请求地址指定了一个基准路径
-
*/
@Controller
public class userController {
@RequestMapping("/antTest0?")
public String show()
{
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718185542759.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718185551188.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
\*号匹配任意多个字符
@Controller
public class userController {
@RequestMapping("/antTest0*")
public String show()
{
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718185844172.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
\*号代替一层路径,只能代替一层路径
@Controller
public class userController {
@RequestMapping("/*/antTest01")
public String show()
{
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=2021071819002136.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
**只能代替一层路径**
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718190041887.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
\*\*代替多层路径
@Controller
public class userController {
@RequestMapping("/**/antTest01")
public String show()
{
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=2021071819020948.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
[]( )路径上可以有占位符,占位符语法就是在任意路径的地方上写一个{变量名}
-------------------------------------------------------------------------------------------------
[]( )路径上的占位符只能占掉一层路径
------------------------------------------------------------------------------
@Controller
public class userController {
@RequestMapping("/antTest01/{id}")
public String show()
{
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
[]( )获取路径上的占位符-----@PathVariable()
--------------------------------------------------------------------------------------------
[获取路径中的参数值——@PathVariable中的value]( )
@Controller
public class userController {
@RequestMapping("/antTest01/{id}")
public String show(@PathVariable("id")String id)
{
System.out.println("路径上的占位符的值:"+id);
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718190828506.png)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718190837573.png)
### []( )获取路径上的多层占位符
@Controller
public class userController {
@RequestMapping("/ant/{id1}/{id2}")
public String show(@PathVariable("id1")String id1,@PathVariable("id2")String id2)
{
System.out.println("路径上的占位符的值1:"+id1);
System.out.println("路径上的占位符值2:"+id2);
System.out.println("收到请求");
//视图解析器自动拼串
//前缀+返回值+后缀
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718191521999.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718191528719.png)
* * *
[]( )REST风格的URL地址约束
=============================================================================
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718191954450.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718192224163.png)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718192413648.png)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718192240855.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718192313347.png)
* * *
[]( )Rest风格增删改查搭建
===========================================================================
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718192607775.png)
**环境搭建:**
BookController类:
@Controller
public class BookController {
/*处理查询图书的请求*/
@RequestMapping(value = “/book/{bid}”,method = RequestMethod.GET)
public String getBook(@PathVariable(“bid”) Integer id)
{
System.out.println("查询到了"+id+"号图书");
return "Success";
}
/添加图书/
@RequestMapping(value = "/book",method = RequestMethod.POST)
public String addBook()
{
System.out.println("添加了图书");
return "Success";
}
/*删除图书*/
@RequestMapping(value = "/book/{bid}",method = RequestMethod.DELETE)
public String deleteBook(@PathVariable("bid") Integer id)
{
System.out.println("删除了"+id+"号图书");
return "Success";
}
/*删除图书*/
@RequestMapping(value = "/book/{bid}",method = RequestMethod.PUT)
public String updateBook(@PathVariable("bid") Integer id)
{
System.out.println("更新了"+id+"号图书");
return "Success";
}
}
index.jsp:
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<title>小朋友</title>
<%–发起图书的增删改查请求,使用Rest风格的URL地址
请求URL 请求方式 表示含义
/book/1 GET 查询1号图书
/book/1 DELETE 删除1号图书
/book/1 PUT 更新1号图书
/book POST 添加1号图书
–%>
查询图书<%–默认都是GET请求–%>
<input type="submit" value="添加1号图书">
<input type="submit" value="删除1号图书">
<input type="submit" value="更新1号图书">
[]( )从页面发起PUT和DELETE形式的请求,Spring提供了对REST风格的支持
-------------------------------------------------------------------------------------------------------
### []( )SpringMVC中有一个Filter,他可以把普通的请求转化为规定形式的请求
#### []( )在web.xml中配置这个filter
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
<filter-name>HiddenHttpMethodFilter</filter-name>
<!--拦截所有请求-->
<url-pattern>/*</url-pattern>
#### []( )发送其他形式的请求
##### []( )1.创建一个post表单
##### []( )2.在表单中携带一个\_method的参数
##### []( )3.这个\_method的值,就是DELETE,PUT
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<title>小朋友</title>
<%–发起图书的增删改查请求,使用Rest风格的URL地址
请求URL 请求方式 表示含义
/book/1 GET 查询1号图书
/book/1 DELETE 删除1号图书
/book/1 PUT 更新1号图书
/book POST 添加1号图书
–%>
<input type="submit" value="查询1号图书">
<input type="submit" value="添加1号图书">
<%–发送delete请求–%>
<input name="_method" value="delete">
<input type="submit" value="删除1号图书">
<%–发送put请求–%>
<input name="_method" value="put">
<input type="submit" value="更新1号图书">
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718202531425.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718202522846.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
#### []( )高版本tomcat,REST支持有点问题
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718202856685.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
折中解决法: 在要跳转到的页面success,jsp中添加:
isErrorPage=“true”
这样发生异常时也会跳转到该页面
<%@ page contentType=“text/html;charset=UTF-8” language=“java” isErrorPage=“true” %>
<title>Success</title>
Success!!!
* * *
[]( )获取请求参数
=====================================================================
[]( )默认方式获取请求参数
-------------------------------------------------------------------------
**直接给方法入参上写一个和请求参数名相同的变量. 这个变量就来接收请求参数的值**
**带参数有值,没带参数就没值,为null**
index.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<title>小朋友</title>
<input type="text" name="username" value="大忽悠">
<br/>
<input type="submit" value="提交">
userController类:
@Controller
public class userController {
@RequestMapping("/hello")
public String show(String username)
{
System.out.println("用户名为:"+username);
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=2021071820445937.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
[]( )通过@RequestParam注解获取请求参数
--------------------------------------------------------------------------------------
[]( )参数默认是必须带的
------------------------------------------------------------------------
@Controller
public class userController {
@RequestMapping("/hello")
public String show(@RequestParam("username")String name)
{
System.out.println("用户名为:"+name);
return "Success";
}
}
* * *
### []( )@RequestParam注解里面的参数
#### []( )key:指定要获取的参数的key
#### []( )required:这个参数是否必须的
#### []( )defaultValue:默认值,没带默认是null
@Controller
public class userController {
@RequestMapping("/hello")
public String show(@RequestParam(value = "username",required = false,defaultValue = "小朋友")String name)
{
System.out.println("用户名为:"+name);
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718205531206.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
* * *
### []( )获取请求头的信息
@Controller
public class userController {
@RequestMapping("/hello")
public String show(@RequestParam(value = "username",required = false,defaultValue = "小朋友")String name
, @RequestHeader("User-Agent")String userAgent)
{
System.out.println("用户名为:"+name);
System.out.println("请求头中浏览器的信息:"+userAgent);
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718221326189.png)
### []( )如果请求头中没有这个信息会报错
@Controller
public class userController {
@RequestMapping("/hello")
public String show(@RequestHeader("hhht")String userAgent)
{
System.out.println("请求头中浏览器的信息:"+userAgent);
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718221625341.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
### []( )value,required,defaultvalue三个属性与@RequestParam注解里面的参数用法一致
@Controller
public class userController {
@RequestMapping("/hello")
public String show(@RequestHeader(value = "user-agent",required = false,defaultValue = "fireFox")String userAgent)
{
System.out.println("请求头中浏览器的信息:"+userAgent);
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210718221935286.png)
* * *
### []( )@CookieValue获取请求中带来的某个Cookie值
@Controller
public class userController {
@RequestMapping("/hello")
public String show(@CookieValue("JSESSIONID")String cookie){
System.out.println("JSESSIONID:"+cookie);
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210719083316958.png)
* * *
### []( )@CookieValue注解中三个属性: value,defaultValue,required
@Controller
public class userController {
@RequestMapping("/hello")
public String show(@CookieValue(value = "JSESSIONID",required = false,defaultValue = "haha")String cookie){
System.out.println("JSESSIONID:"+cookie);
return "Success";
}
}
* * *
[]( )传入POJO,SpringMVC自动封装—POJO:自定义对象
----------------------------------------------------------------------------------------------
Book类:
public class Book {
/*无参构造不能少*/
private String name;
private Integer price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
index.jsp:
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<title>小朋友</title>
书名:
价格:<input type="text" name="price"/><br>
<input type="submit" value="提交">
BookController类:
@Controller
public class BookController {
@RequestMapping("/book")
public String ShowBook(Book book)
{
System.out.println(book);
return "Success";
}
}
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210719085151455.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210719085500772.png)
### []( )如果我们的请求参数是一个POJO,SpringMVC会帮我们自动赋值,将POJO中的每一个属性,从Request参数中尝试获取出来,并封装即可
### []( )要封装类的无参构造和set,get方法不能少,并且变量名要和请求参数里面的名字相同
[]( )POJO的级联封装,封装POJO成员变量里面的自定义类型
-------------------------------------------------------------------------------------------
Book类:
public class Book {
标签:入门,img,SpringMvc,获千赞,csdnimg,https,public,png,cn 来源: https://blog.csdn.net/m0_60721860/article/details/120177368