JAVA架构之路之SpringMVC,通俗易懂的掌握SpringMVC。

本文详细介绍了SpringMVC的定义、用途、快速入门步骤,包括配置web工程、引入依赖、创建控制层、配置SpringMVC、设置前端控制器、处理请求参数、返回页面数据、处理静态资源、异常处理、拦截器工作原理等核心概念和实践操作。通过实例展示了SpringMVC在实际开发中的应用。
摘要由CSDN通过智能技术生成

1.正文

1. 什么是MVC架构?
2. 什么是springMVC框架?
3. 为什么使用springMVC架构?
4. 快速入门springMVC?
5. springMVC的流程。
6. springMVC如何接受请求的参数。
7. springMVC如何把控制层的参数转发到前端页面?

2. 什么是MVC架构?

 

3. 什么是springMVC?

 springmvc是spring框架的一种分支。SpringMVC 是类似于 Struts2 的一个 MVC 框架,在实际开发中,==接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示==,但是上手难度却比 Struts2 简单多了。而且由于 Struts2 所暴露出来的安全问题,SpringMVC 已经成为了大多数企业优先选择的框架。

4. 为什么使用springMVC?

 

 

5.快速入门springMVC

(1)创建一个web工程

                        

 (2)引入springmvc的依赖。

<!--maven可以把该依赖相关的依赖都引入。-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.9.RELEASE</version>
</dependency>

(3) 创建控制层。


@Controller
public class HelloController {
    @RequestMapping("/hello01") //根据请求路径映射响应的方法。
    public String hello01(){
        return "/views/hello01.jsp";
    }
    
}

(4)配置springmvc的配置文件。

<?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
       https://www.springframework.org/schema/context/spring-context.xsd">

    <!--1.包扫描 扫描我们自己的控制层类所在的包或者父包-->
    <context:component-scan base-package="com.ykq.controller"/>
</beans>

(5)引入前端控制器 web.xml

<!--注册servlet-->
<servlet>
    <servlet-name>springmvc01</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加载springmvc的配置文件-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc01.xml</param-value>
    </init-param>
</servlet>

<!--servlet映射路径
      /: 表示所有的控制层路径 以及静态资源
      /*: 表示全部 包含jsp网页
-->
<servlet-mapping>
    <servlet-name>springmvc01</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

(6)测试。

 

6. springmvc的流程

*     1. 客户端发生请求http://localhost:8080/145springmvc01/hello01
 *     2. 来的tomcat服务器。
 *     3. springmvc的前端控制器DipatcherServlet接受所有的请求。
 *     4. 查看你的请求地址和哪个@RequestMaping匹配。
 *     5. 执行对应的方法。方法会返回一个字符串。springmvc把该字符串解析为要转发的网页。
 *     6. 把该字符串经过视图解析器拼接。
 *     7. 拿到拼接的地址,找到对应的网页。

7. springmvc如何接受请求参数

7.1 接受参数个数少的

 

7.2 接受的参数

比如:表单提交时 注册 添加。

解决: 可以把所有的请求参数封装到一个实体类对象中。

 

7.3 接受日期类型的参数

 解决办法:

 

8. 处理静态资源

什么是静态资源: 比如: css, js, img,html

 

 解决方案:

 

9.如何把控制层的数据渲染到页面

思考:原来在讲servlet时我们把数据保存在哪些对象中。

request, 同一个请求内有效。 ---->EL表达式 获取相应范围的对象数据。

session: 同一个会话有效。

@Controller
@RequestMapping("/hello03")
public class HelloController03 {

    @RequestMapping("/index03") 
    public String index03(Model model){ //model对象可以理解为request对象。凡是在该对象中保存的数据,作用范围同一个请求有效。
        User user=new User("张三",1,"120",17,new Date());
        model.addAttribute("user",user);
        return "index03";//springmvc采用请求转发的跳转。
    }

    @RequestMapping("index04")
    public String index04(HttpServletRequest request){
        User user=new User("张三2",0,"120",18,new Date());
        request.setAttribute("user2",user);
        return "index03";//springmvc采用请求转发的跳转。
    }
    ///上面两种方法的作用是一样 都是保存在request范围。
    @RequestMapping("index05")
    public String  index05(HttpSession session){
        User user=new User("李四",0,"130",19,new Date());
        session.setAttribute("user05",user);
        return "index03";
    }
}

 

10.返回json数据

(1)里面自带了转换---引入它的依赖。jackson依赖 

<!--jackson依赖 可以整合springmvc把java对象转换为json对象-->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.4</version>
</dependency>

(2) 控制层直接返回对应的对象类型。(3)@ResponseBody--->把java对象转换为json对象。  

 

 

解决办法:

 

 

11.定义全局异常处理

一旦后台出现异常时,网页会显示很丑的异常信息。 为了可以显示好看,我们定义一个统一的异常处理类。

异常的结构:

​ Throwable: 异常的根类。

​ Error: 错误。这个错误程序员无法解决。

​ Exception:异常。

​ 编译异常:

​ 运行时异常: RuntimeException: 只会在运行的时候出现。

(1)自定义一个全局异常处理类

@ControllerAdvice //该类为异常处理类。
public class MyHandler {

    //ExceptionHandler异常发生时执行的方法。
    @ExceptionHandler(value = ArithmeticException.class) //如果不使用value默认处理Throwable异常。
    public String handlerException(){
        System.out.println("!~~~~~~~~~~~~~~~~~~");
        return "error";
    }

}

 注意: 一定要让springmvc扫描到该异常处理类。

 

12. 拦截器

回顾: 过滤器: 拦截器所有的资源.[jsp,servlet,css,js,img]

拦截器: 只会拦截springmvc的控制层接口路径。

流程:

 

 

如何定义拦截器:

(1)自定义一个拦截器类。

public class MyInterceptor implements HandlerInterceptor {

    //拦截器方法。如果该方法返回true则是放行   如果返回false 则是拦截。
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~拦截器~~~~~~~~~~~~~~~~~~~~~~~");
        return true;
    }
}

(2) 把自定义的拦截器声明到springmvc容器中。---springmvc.xml

 <!--声明拦截器-->
<!-- <mvc:interceptors>
     <mvc:interceptor>
         <mvc:mapping path="拦截器的路径"/>
         <mvc:exclude-mapping path="不拦截的路径"/>
         <bean class="自定义拦截器的全路径"/>
     </mvc:interceptor>
 </mvc:interceptors>-->

 <mvc:interceptors>
     <mvc:interceptor>
         <!--/*: 一层路径 /hello
             /**: 多层路径
         -->
         <mvc:mapping path="/**"/>
         <mvc:exclude-mapping path="/hello04/json01"/>
         <bean class="com.ykq.interceptor.MyInterceptor"/>
     </mvc:interceptor>
 </mvc:interceptors>

13.springmvc的流程

 

第一步:用户发送请求到前端控制器(DispatcherServlet)。

第二步:前端控制器请求 HandlerMapping 查找 Handler,可以根据 xml 配置、注解进行查找。

第三步: 处理器映射器 HandlerMapping 向前端控制器返回 Handler

第四步:前端控制器调用处理器适配器去执行 Handler

第五步:处理器适配器执行 Handler

第六步:Handler 执行完成后给适配器返回 ModelAndView

第七步:处理器适配器向前端控制器返回 ModelAndView

    ModelAndView 是SpringMVC 框架的一个底层对象,包括 Model 和 View

第八步:前端控制器请求试图解析器去进行视图解析

    根据逻辑视图名来解析真正的视图。

第九步:试图解析器向前端控制器返回 view

第十步:前端控制器进行视图渲染

    就是将模型数据(在 ModelAndView 对象中)填充到 request 域

第十一步:前端控制器向用户响应结果
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值