SpringMVC的配置与应用
1. SpirngMVC概述
什么是SpringMVC?
SpringMVC是Spring 提供的一个实现了Web MVC设计模式的轻量级Web框架。它与Strust2框架一样,都属于MVC框架,但其使用和特性方面比Strusts2更加优异。
SpringMVC具有以下特点
- 是Spring框架的一部分,可以方便得利用Spring所提供的其他功能。
- 灵活性强,易于与其他框架集成。
- 提供了一个前端控制器DispatcherServlet, 使开发人员无需额外开发控制器对象。
- 可自动绑定用户输入,并能正确的转换数据类型。
- 内置了常见的校验器,可以校验用户输入。如果校验不能过,那么就会重定向到输入表单。
- 支持国际化。可以根据用户区域显示多国语言。
- 支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。
- 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序。
2.创建Spring程序
1.使用idea创建maven工程
技术支持:由于有些IDEA或者Eclipse 版本或者安装问题,不能在本地的 .m2仓库中找到settings文件,所以在设置maven驱动的时候,要选择本地自己安装的maven驱动下的settings文件路径。 关于如何搭建maven在之前的博客中已经介绍了。
2.导入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spirng.version>5.0.16.RELEASE</spirng.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 添加 servlet 依赖 -->
<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.1</version>
<scope>provided</scope>
</dependency>
<!-- ioc 相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spirng.version}</version>
</dependency>
<!--aop 相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spirng.version}</version>
</dependency>
<!-- aop**** aspectj 相关 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>
<!-- springmvc 相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spirng.version}</version>
</dependency>
</dependencies>
3.导入第2步的依赖后,IDEA自动创建srcjava,resource文件夹,并标注
4.com.aaa.springmvc.controller 下创建HelloServlet控制器
代码
配置tomcat就能自动跳转到该页面显示helloword
package com.aaa.springmvc.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* ClassName:helloController
* Package:com.aaa.springmvc.controller
* Description:
*
* @date:2020/7/20 19:34
* @author:lee907463383@qq.com
*/
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.src/main/webapp/WEB-INF/web.xml
声明DispatcherServlet 前端控制器,springmvc 容器配置默认文件名 springmvc-servlet.xml
/ springmvc 会拦截 /下路径,如果 /路径没有找到对应servlet 就走当前/servlet 相当于默认路径
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.aaa.springmvc.controller.HelloServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- springmvc 容器配置默认文件名 springmvc-servlet.xml
如果不是 springmvc-servlet.xml 必须在<init-param> 配置contextConfigLocation
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
<!-- 进行过滤拦截,也就是说只要是经过该路径都要用前端控制器 DispatcherServlet -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
6.springmvc-servlet.xml 配置
1.包扫描路径 让注解生效,
2.配置mvc 注解驱动,
3.将路径 /helloController 和 HelloController 控制器进行绑定,
4.那么springmvc 在初始化时, 会默认给我们在容器中注入以下三个bean,BeanNameUrlHandlerMapping(映射处理器),SimpleControllerHandlerAdapter(处理器配置器),InternalResourceViewResolver(视图解析器),
5.为返回的jsp路径增加前缀和后缀
<?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" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 包扫描路径 让注解生效 -->
<context:component-scan base-package="com.aaa.springmvc.controller"></context:component-scan>
<!-- 配置mvc 注解驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!--将路径 /helloController 和 HelloController 控制器进行绑定-->
<!-- 访问页面路径 name="/helloController" 得到的都是controller层处理过的数据,然后渲染了的jsp页面 算是静态的
name="/helloController" 是指访问controller 层HelloController的路径
以前都是从***.jsp中访问控制器,现在直接从name路径访问控制层 -->
<bean name="/helloController" class="com.aaa.springmvc.controller.HelloController">
</bean>
<!-- 如果开发者,没有明示写出这三个Bean, 那么springmvc 在初始化时, 会默认给我们在容器中注入以下三个bean -->
<!-- 将bean的name作为路径 key 和 Controller value 做一个map映射 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 向容器注入一个处理器配置器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--向容器注入视图解析器 将model解析为浏览器识别的html-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- <!–为返回的jsp路径配置前缀–>
<property name="prefix" value="/jsp/"></property>
<!–为返回的jsp配置后缀–>
<property name="suffix" value=".jsp"></property>-->
</bean>
</beans>
7.com.aaa.springmvc.controller层,创建HelloController 控制器
** 个人理解:通过设置的 在springmvc-servlet.xml,中创建的bean对象: ,去控制层,然后跳转到jsp页面,否则只单独的跳转到jsp/hello.jsp页面,里面是没有数据的 **
获取数据的流程图
package com.aaa.springmvc.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ClassName:HelloController
* Package:com.aaa.springmvc.controller
* Description:
*
* @date:2020/7/20 20:18
* @author:lee907463383@qq.com
*/
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
/*ModelAndView 模板和视图类 idea自带自带的类 声明一个modelAndView对象 set路径,add(kev,value)*/
ModelAndView modelAndView = new ModelAndView();
/*连接jsp前台页面的路径*/
modelAndView.setViewName("/jsp/hello.jsp");
/*给前台页面数据赋值*/
modelAndView.addObject("msg","helloController");
return modelAndView;
}
}
8.创建src/main/webapp/jsp/hello.jsp
<%--
Created by IntelliJ IDEA.
User: 90746
Date: 2020/7/20
Time: 20:21
To change this template use File | Settings | File Templates.
--%>
<%-- isELIgnored 解决el表达式不生效问题--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
msg:${msg}
</body>
</html>
9.com.aaa.springmvc.controller层,创建FirstController控制器(使用了注解)
在springmvc-servlet.xml编写代码
<!-- 配置包扫描路径 让注解生效 -->
<context:component-scan base-package="com.aaa.springmvc.controller"></context:component-scan>
<!-- 配置mvc 注解驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
**FirstController层代码: 用到的注解:
1.@Controller //标记当前类是个控制类,
2.@RequestMapping("/test") //标记在类上, 表示当前类下所有的映射路径 都在前面追加路径 /test/firstA, **
3. @RequestMapping("/first") //将我们对应处理器 配置一个路径 绑定DispatcherServlet处理器,
5. @RequestMapping(value = {"/firstA","/firstB"}) //可以为一个处理器 配置多个路径,
6. @RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET) //标记当前method方法只支持get,改成POST也没用会报错,
6. @GetMapping(path = {"/secondA","/secondB"}) //要求处理器支持method=get 请求,等价于@RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET),
7. 带有HttpServletRequest 请求意味这能得到前台 所有的数据 (HttpServletRequest servletRequest)
8. @GetMapping("/third") 有参数(HttpServletRequest servletRequest, Model model, Map map) //返回值 string 代表返回时的 jsp 的路径,
9. @GetMapping("/four") 有参数 httpServletResponse.getWriter().println(“four1111”);
10. @GetMapping("/forwardTest") 转发 返回Sting 是url 1.发生在应用内部,2浏览器url没有改变 3可以通过HttpServletRequst 增加属性
11. @GetMapping("/redirectTest") 重定向: 1.url 改变(将url发给客户端,客户端重新发起请求) 2.参数丢失 3.访问外部项目
package com.aaa.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* ClassName:FirstController
* Package:com.aaa.springmvc.controller
* Description:
*
* @date:2020/7/20 20:57
* @author:lee907463383@qq.com
*/
@Controller //标记当前类是个控制类
@RequestMapping("/test") //标记在类上, 表示当前类下所有的映射路径 都在前面追加路径 /test/firstA
public class FirstController {
// @RequestMapping("/first") //将我们对应处理器 配置一个路径 绑定DispatcherServlet处理器
// @RequestMapping(value = {"/firstA","/firstB"}) //可以为一个处理器 配置多个路径
@RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET) //标记当前method方法只支持get,改成POST也没用会报错
public ModelAndView first(){
/*ModelAndView 模板和视图类 idea自带自带的类 声明一个modelAndView对象 set路径,add(kev,value)*/
ModelAndView modelAndView = new ModelAndView();
/*连接jsp前台页面的路径*/
modelAndView.setViewName("/jsp/hello.jsp");
/*给前台页面数据赋值*/
modelAndView.addObject("msg","helloController");
return modelAndView;
}
@GetMapping(path = {"/secondA","/secondB"}) //要求处理器支持method=get 请求,等价于@RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET)
public ModelAndView second(HttpServletRequest servletRequest){
/*这里添加了参数 HttpServletRequest servletRequest
* 有了servletRequest 请求就意味这能得到前台 所有的数据
*
* */
String param = servletRequest.getParameter("param");
/*ModelAndView 模板和视图类 idea自带自带的类 声明一个modelAndView对象 set路径,add(kev,value)*/
ModelAndView modelAndView = new ModelAndView();
/*连接jsp前台页面的路径*/
modelAndView.setViewName("/jsp/hello.jsp");
/*给前台页面数据赋值*/
modelAndView.addObject("msg","second --- param:"+param);
return modelAndView;
}
@GetMapping("/third")
//返回值 string 代表返回时的 jsp 的路径
public String third(HttpServletRequest servletRequest, Model model, Map map){
//向jsp传递属性
servletRequest.setAttribute("msg","servletRequest");
//通过model 向jsp传递属性 本质也是向 HttpServletRequest写入属性
// model.addAttribute("msg","model");
map.put("msg","map");
return "/jsp/hello.jsp";
}
@GetMapping("/four")
public void four(HttpServletRequest servletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.getWriter().println("four1111");
}
@GetMapping("/forwardTest")
//转发 返回Sting 是url
//1.发生在应用内部,2浏览器url没有改变 3可以通过HttpServletRequst 增加属性
public String forwardTest(){
return "forward:/test/firstA";
}
@GetMapping("/redirectTest")//重定向: 1.url 改变(将url发给客户端,客户端重新发起请求) 2.参数丢失 3.访问外部项目
public String redirectTest(){
return "redirect:https://www.baidu.com";
}
}
注意: 1.这里路径没有增加返回jsp路径的前后缀,
2.有些引入一定要选带有mvc字样的包接口或者实现类,
3.本节很基础,但是涉及了工程的搭建和注解的使用,以及访问的流程如下图。(要会背!!! 面试会问。 所以放下边 - -、、、)
*重点:springmvc的启动流程
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截
器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View.
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
本文地址:https://blog.csdn.net/nnnnnnnnnnii/article/details/107470164