博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SpringMVC - 01SpringMVC入门

Posted on 2020-11-21 19:48  Kingdomer  阅读(153)  评论(0编辑  收藏  举报

SpringMVC - 01SpringMVC入门

 

(1)SpringMVC概述

SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合到Spring Web Flow中。

SpringMVC已经成为目前最主流的MVC框架之一,随着Spring3.0的发布,全面超越Struts2,成为最优秀的MVC框架。

它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时还支持RESTful编程风格的请求。

 

(2)SpringMVC快速入门

需求: 客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。

(2.1)导入坐标

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.10.RELEASE</version>
        </dependency>

(2.2)web.xml配置SpringMVC核心控制器DispatcherServlet

    <servlet>   
        <servlet-name>DispatcherServlet</servlet-name>   // 配置SpringMVC的前端控制器
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

(2.3)创建Controller类和视图页面

public class UserController {
public String save(){
        System.out.println("Controller save running......");
        return "success.jsp";
    }
}

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
     <h1>成功!!!</h1>
     <hr/>
</body>
</html>

(2.4)使用注解配置Controller类中业务方法的映射地址

@Controller
@RequestMapping("/user")
public class UserController {
    // 请求地址: http://localhost:8080/user/quick?username=zhangsan
    @RequestMapping(value = "/quick", method=RequestMethod.GET, params = {"usernmae"})
    public String save(){
        System.out.println("Controller save running......");
        return "success.jsp";
    }
}

(2.5)配置SpringMVC核心文件spring-mvc.xml

    <!--Controller组件扫描-->
    <context:component-scan base-package="com.bearpx.spring.mvc">
//        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

// 在web.xml中加入spring-mvc.xml

(2.6)客户端发起请求测试

21-Nov-2020 17:34:26.815 璀﹀憡 [http-nio-8080-exec-6] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException Resolved [org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "username" not met for actual request parameters: ]
Controller save running......

(2.7)IDEA启动tomcat后console界面中文乱码

 

将IDEA常见配置都修改为UTF-8之后,不启作用。

(idea64.exe.vmoptions / EditConfigurations - TomcatServer / settings - FileEncoding / settings - Java Compiler )

修改本地tomcat文件夹下log.properties的java.util.logging.ConsoleHandler.encoding=GBK,原为UTF-8。成功!!!。

 

(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进行渲染视图(即将模型数据填充到视图中)。DispatcherServlet响应用户。

 

(4)SpringMVC初识

(4.1)注解: @RequestMapping

作用:用来建立请求URL和处理请求方法之间的对应关系

位置:

   > 类上, 请求URL的第一级访问目录。 此处不写的话,相当于应用的根目录

   > 方法上,请求URL的第二级访问目录。与类上的使用@RequestMapping标注的一级目录一起组成访问虚拟路径

属性:

   > value: 用于指定请求的URL。它和path属性的作用是一样的。

   > method:用于指定请求的方式。RequestMethod.GET/POST/ PUT/ HEAD/ PATCH/ DELETE/ OPTIONS/ TRACE。

   > params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。

   例如:  params={"accountName"},表示请求参数必须有accountName; params={"money!100"},表示请求参数中money不能是100

   

21-Nov-2020 19:14:29.477 警告 [http-nio-8080-exec-5] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException Resolved [org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "username" not met for actual request parameters: ]

(4.2)SpringMVC注解解析

> 引入mvc命名空间和约束地址 xmlns:context / xmlns:mvc="http://www.springframework.org/schema/mvc"

> 组件扫描:

SpringMVC基于Spring容器,在进行SpringMVC操作时,需要将Controller存储到Spring容器中。

如果使用@Controller注解标注的话,需要使用<context:component-scan base-package="com.bearpx.spring.mvc"/>进行组件扫描。

(4.3)视图解析器配置:  forward和redirect

查看spring-webmvc-5.0.10.RELEASE.jar文件中org.springframework.web.servlet包下的DispatcherServlet.properties 文件org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

 

> 使用forward 方式:

    @RequestMapping(value = "/quick", method = RequestMethod.GET, params = {"username"})
    public String save(){
        System.out.println("Controller save running......");
        return "forward:/success.jsp";
    }

结果: 返回结果,网址未发生变化, 产生了一次请求

> 使用redirect方式:

    @RequestMapping(value = "/quick", method = RequestMethod.GET, params = {"username"})
    public String save(){
        System.out.println("Controller save running......");
        return "redirect:/success.jsp";
    }

测试结果: 返回结果,网址发生变化, 产生了两次请求

> 设置视图前缀和后缀 

将webapp/success.jsp 调整到 webapp/jsp/success.jsp, 修改代码,return "/jsp/success.jsp"报错。

设置web.xml 配置

    <!--配置内部资源视图解析器-->   // /jsp/success.jsp
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>