今日内容
1 MVC引言
2 SpringMVC入门演示
3 SpringMVC执行流程
4 注解开发SpringMVC【重点】
1 MVC引言
MVC之前,所有代码全部放在一起,比如Servlet,即要接收请求,获得请求数据,操作数据库,响应页面.
MVC架构: 根据不同的事情由不同的类去处理,内部单一职责
- Model: 模型类,例如封装数据的实体类,业务模型(Service),数据层(Dao)
- View: 视图,展示数据的.HTML
- Controller: 控制器,控制整个流程走向. 决定是否能接收请求,调用哪个业务,跳转哪个页面,Servlet
MVC框架
- 封装了Servlet
- 接收请求方便(一个类中,不同的方法就可以接收不同的请求)
- 接收请求数据方便(自动封装)
- 响应数据方便(自动响应json)
2 SpringMVC执行流程
3 SpringMVC入门演示
入门演示使用配置文件来演示.完全按照springmvc执行流程来操作.
3.1 创建maven-javaweb项目
3.2 导入依赖
<dependencies>
<!-- webmvc依赖以及关联其他spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
3.3 页面请求
<a href="http://localhost:8080/hi.do">发请求,测试</a>
其实也可以不要写页面,直接浏览器地址栏手动发请求也可以
【特别注意:】请求路径最后加.do,因为前端控制器只能匹配.do后缀的请求
3.4 前端控制器
前端控制器(DispatchServlet),核心思想是拦截到请求,然后分发请求,同处理器映射器找到处理器,然后通过处理器适配器执行处理器.
DispatchServlet是一个"大脑",做统一调度,当请求到达时创建,并且要去找springmvc.xml从而通过映射器,适配器,视图解析器来完成后续工作
需要配置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_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 前端发出请求,映射到DispatcherServlet后,就要找HandlerMapping以及HandlerAdapter -->
<!-- 这些组件都在springmvc配置文件中,所以,在这需要加载springmvc.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 将配置文件放置/resources/springmvc.xml -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 请求路径是/,匹配到所有请求,包括html,js,css,图片等请求 -->
<!-- <url-pattern>/</url-pattern>-->
<!-- springmvc的习惯是请求加.do -->
<!-- 这样就会匹配到所有请求中带.do的请求 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.5 springmvc.xml
将配置文件放置/resources/springmvc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1 自定义的Controller -->
<bean id="hiController" class="com.qf.controller.HiController" name="/hi.do" />
<!-- 2 处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 3 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 4 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 用来拼接页面名字的前缀 -->
<property name="prefix" value="/"/>
<property name="suffix" value=".html"/>
<!-- 将后台Controller返回的视图名,组装成完整页面路径: /hi.html -->
</bean>
</beans>
3.6 自定义Controller类
package com.qf.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @desc
*/
public class HiController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 1 接收请求参数
// 2 封装参数
// 3 调用业务层
// 4 响应
System.out.println("HiController执行了......" );
ModelAndView mv = new ModelAndView( );
// 设置视图名(即要跳转的页面名字)
// 后续会经过视图解析器拼接成完成的页面路径
mv.setViewName("hi");
return mv;
}
}
3.7 测试
安装配置Tomcat
部署项目
启动访问
测试完即可,只需要了解这个过程,了解springmvc.xml中关于Handler,HandlerMapping,HandlerAdapter配置,以及HiController实现接口的写法以后都不在使用.后续换成注解开发.
我们这样写的目的
- 为了了解springmvc.xml执行流程
- 为了注解开发做准备
4 注解开发【重点】
4.1 创建web项目
4.2 依赖
同上
4.3 web.xml
在web.xml中配置前端控制器,同上
4.4 springmvc.xml
在springmvc.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 扫描注解 -->
<context:component-scan base-package="com.qf.controller"/>
<!-- mvc注解开发驱动,用来取代映射器,适配器 -->
<mvc:annotation-driven/>
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 用来拼接页面名字的前缀 -->
<property name="prefix" value="/"/>
<property name="suffix" value=".html"/>
<!-- 将后台Controller返回的视图名,组装成完整页面路径: /hi.html -->
</bean>
</beans>
4.5 自定义Controller使用注解
package com.qf.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @desc
*/
@Controller
public class HelloController {
@RequestMapping("/hello.do")
public String hello(){
System.out.println("HelloController.hello()执行了" );
// 页面名字
return "hello";
}
@RequestMapping("/test.do")
public String test(){
System.out.println("HelloController.test()执行了" );
// 页面名字
return "hello";
}
}
4.6 测试
5 @RequestMapping
@RequestMapping,用来指定映射路径.
类名上的@RequestMapping中指定路径与方法上@RequestMapping指定路径,拼接在一起
特殊的用法: 可以拼接请求路径
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/login.do")
// http://localhost:8080/user/login.do
public String login() {
System.out.println("UserController.login()" );
return "hello";
}
// http://localhost:8080/user/logout.do
@RequestMapping("/logout.do")
public String logout() {
System.out.println("UserController.logout()" );
return "hello";
}
// http://localhost:8080/user/add.do
@RequestMapping("/add.do")
public String userAdd() {
System.out.println("UserController.userAdd()" );
return "hello";
}
}
@RequestMapping默认可以GET和POST等请求方式发出的请求(基本上都可以接收)
@RequestMapping注解中可以定义一些参数,用来指定只接收单一请求方式
@RequestMapping(value = "/login",method = RequestMethod.GET) // 只能接收get请求,
c String userAdd() {
System.out.println(“UserController.userAdd()” );
return “hello”;
}
}
> @RequestMapping默认可以GET和POST等请求方式发出的请求(基本上都可以接收)
>
> @RequestMapping注解中可以定义一些参数,用来指定只接收单一请求方式
>
> ```java
> @RequestMapping(value = "/login",method = RequestMethod.GET)
> // 只能接收get请求,
> ```