目录
2.梳理 Spring SpringMVC SpringBoot 的关系
3.4配置applicationContext-mvc.xml(配置视图解析器)
2.3@RequestMapping 可指定 params 和 headers 支持简单表达式
2.4@RequestMapping 支持 Ant 风格资源地址
2.5 @RequestMapping 可配合 @PathVariable 映射 URL 绑定的占位符
一.基本介绍
1.SpringMVC 特点&概述
1. SpringMVC 从易用性,效率上 比曾经流行的 Struts2 更好
2.梳理 Spring SpringMVC SpringBoot 的关系
二.SpringMVC-快速入门
1.需求说明/图解
需求说明: 完成一个最基本的测试案例,登录案例, 使用 SpringMVC 完成
2.SpringMVC 登录流程分析
3.SpringMVC 登录-代码实现
3.1配置前端控制器
<!-- 配置前端控制器/中央控制器/分发控制器
1.用户的应用请求都会经过它的处理
-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置属性 : 指定DispatcherServlet去操作的spring配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mvc.xml</param-value>
</init-param>
<!-- 在web项目启动时,就自动加载DispatcherServlet对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- 这里我们配置的url-pattern表示用户的请求都经过DispatcherServlet处理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
3.2网页页面 login.jsp
<%--
User:海绵hong
Date: 2022/10/25
Time: 18:55
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录页面</h1>
<form action="login">
u: <input name="name" type="text">
p: <input name="pwd" type="password">
<input type="submit"value="登录">
</form>
</body>
</html>
3.3写UserServlet.java
package com.hong;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 海绵hong
* @version 1.0
* 说明
* 1. 如果我们使用了SpringMVC, 在一个类上标识@Controller
* 2. 表示将该类视为一个控制器,注入到容器
* 3. 比原生servlet开发要简化很多
*/
@Controller
public class UserServlet {
//编写方法,响应用户的请求
/**
* 解读
* 1. login() 方法是用于响应用户的登录请求
* 2. @RequestMapping(value = "/login") 类似我们以前在原生的Servlet
* 配置 url-pattern, 就是给方法配置一个url映射
* 3. 即当用户在浏览器输入 http://localhost:8080/web工程路径/login 就能够访问到login()
* 4. return "login_ok"; 表示返回结果给视图解析器(InternalResourceViewResolver)
* , 视图解析器会根据配置,来决定跳转到哪个页面
*
* <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
*
* <property name="prefix" value="/WEB-INF/pages/"/>
* <property name="suffix" value=".jsp"/>
* </bean>
*
* 根据上面的配置 return "login_ok"; 就是转发到 /WEB-INF/pages/login_ok.jsp
*/
@RequestMapping(value = "/login")
public String login() {
System.out.println("login ok.......");
return "login_ok";
}
}
3.4配置applicationContext-mvc.xml(配置视图解析器)
<!-- 配置自动扫描包-->
<context:component-scan base-package="com.hong.web"/>
<!--配置视图解析器[默认视图解析器]-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置属性suffix 和 prefix-->
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
<!--调整优先级-->
<property name="order" value="10"/>
</bean>
3.5login_ok.jsp
<%--
User:海绵hong
Date: 2022/10/25
Time: 19:11
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功</title>
</head>
<body>
<h1>恭喜你!登录成功!!</h1>
</body>
</html>
3.6案例总结
首先我们去配置中央处理器DispatcherServlet,所有的应用请求都要经过它的处理,并且要在其中配置指定DispatcherServlet去操作的spring配置文件,然后写一个jsp网页代码。接下来便是重中之重了,创建一个Java类,同时写上注解让spring读取。在这个类中调用@RequestMapping(value = "/login")注解,@RequestMapping(value = "/login") 类似我们以前在原生的Servlet 配置 url-pattern, 就是给方法配置一个url映射。即当用户在浏览器输入 http://localhost:8080/web工程路径/login 就能够访问到login()。再就是扫描这个类,并配置视图解析器
* <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
*
* <property name="prefix" value="/WEB-INF/pages/"/>
* <property name="suffix" value=".jsp"/>
* </bean>
就是一个拼接: 根据上面的配置 return "login_ok"; 就是转发到 /WEB-INF/pages/login_ok.jsp。
3.7注意事项和细节说明
![](https://i-blog.csdnimg.cn/blog_migrate/e5ce8b99af3d20a2c2635a662f9117b3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c5b383fb36a9e08fc453870ad3d23cbb.png)
1) 修改 web.xml, 注销 init-param 配置节点
三.SpingMVC 执行流程
1.一图胜千言![](https://i-blog.csdnimg.cn/blog_migrate/a6b6907a3d054d081d1918d325baa7f3.png)
由浏览器发出请求到前端控制器,在由前端控制器调用处理器映射器,处理器映射器根据浏览器发出的请求去分析,返回处理器执行链(对象:拦截器和目标Handler[@Controller]),接下来调用处理器适配器去调用真正的目标Handler(也就是Controller),接下来就是去调用service,再由service调用Dao,Dao去操作数据库,然后再将数据(ModelAndView)返回去,,继续将ModelAndView返回给前端控制器。而前端控制器会去调用视图解析器去解析ModelAndView,会返回一个视图(View以对象的形式)给前端控制器。再由前端服务器会进行视图的渲染,即将Model中的数据填充到View,最后再将这个结果返回给浏览器。
四.@RequestMapping
1.基本使用
2.@RequestMapping 注解其它使用方式
2.1@RequestMapping 可以修饰方法和类
@RequestMapping(value = "/user")
@Controller
public class UserHandler {
/**
* 解读
* 1. method=RequestMethod.POST: 表示请求 buy 目标方法必须是 post
* 2. RequestMethod 四个选项 POST, GET, PUT, DELETE
* 3. SpringMVC 控制器默认支持 GET 和 POST 两种方式
* @return
*/
@RequestMapping(value = "/buy",method = RequestMethod.GET)
public String buy() {
System.out.println("购买商品");
return "success";
}
}
这个Java类文件是关键,其他的就不写了,在这个类中可以看出来一个jsp文件调用user/buy方法,放回的时候会直接跳转到success.jsp页面中(之前配的springDispatcherServlet-servlet.xml文件)
2.2@RequestMapping 可以指定请求方式
2.3@RequestMapping 可指定 params 和 headers 支持简单表达式
/**
* 解读
* 1. params="bookId" 表示请求该目标方法时,必须给一个bookId参数, 值没有限定
* 2. search(String bookId): 表示请求目标方法时, 携带的bookId=100, 就会将请求携带的 bookId对应的
* 值 100, 赋给 String bookId
* 3. params = "bookId=100" 表示必须给一个bookId参数, 而且值必须是100
*
* @return
*/
@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
public String search(String bookId) {
System.out.println("查询书籍 bookId= " + bookId);
return "success";
}
@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
@RequestMapping(value = "/find", params = "bookId!=100", method = RequestMethod.GET)
2.4@RequestMapping 支持 Ant 风格资源地址
2.5 @RequestMapping 可配合 @PathVariable 映射 URL 绑定的占位符
//要求: 我们希望目标方法获取到 username 和 userid, value="/xx/{username}" - @PathVariable("username")..
//前端页面: <a href="user/reg/kristina/300">占位符的演示</a>
//(value = "/reg/{username}/{userid}"): 表示kristina->{username} 300=>{userid}
@RequestMapping(value = "/reg/{username}/{userid}")
public String register(@PathVariable("username") String name,
@PathVariable("userid") String id) {
System.out.println("接收到参数--" + "username= " + name + "--" + "usreid= " + id);
return "success";
}
2.6 注意事项和使用细节
@GetMapping(value = "/hello3")
public String hello3(String email) {
System.out.println("hello3 " + email);
return "success";
}
hello3(String email): 如果我们的请求参数有 email=xx, 就会将传递的值,赋给String email,要求名称保持一致, 如果不一致,那么接收不到数据, 而是null
就是我们在浏览器输入地址的时候如果在之后会输入email,如果和参数名一样,那么就会将这个值传入到这个参数