SpringMVC概述及入门

SpringMVC是一种基于java实现MVC设计模式的请求驱动类型的轻量级Web框架。是Spring FrameWord的后续产品,Spring框架提供了构建Web应用程序的全功能MVC模块,使用Spring可插入MVC架构。从而在使用Spring进行Web开发时,可以选用Spring的SpringMVC框架或者其他MVC开发框架等。

SpringMVC程序入门

1.工程创建

通过IDEA创建SpringMVC工程,创建工程时,选用了骨架,如下图所示在这里插入图片描述
当创建项目完成后,发现项目目录不完整,需要进行补充,添加如下图目录
在这里插入图片描述

2.代码编写

  • 编写index.jsp页面
<%@page contentType="text/html; charset=UTF-8" language="java" %>

<html>
    <head>

    </head>
    <body>
        <h2>SpringMVC入门案例</h2><br/>
        <a href="hello">入门程序</a><br/>
    </body>
</html>
  • 引入项目所需jar包(pom.xml)
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source><!--编译版本-->
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--版本锁定-->
  <spring.version>5.2.1.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
  </dependencies>

此处引入jar包,我只引入了spring-webmvc的jar包,但是有的人同时也引入了spring-web这个jar包,其实spring-webmvc依赖于spring-web,这样引入spring-webmvc的jar包会间接的添加了spring-web,而不必显式的去添加spring-web

  • 配置核心控制器——DispatcherServlet(web.xml)
<!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>
  <!--配置SpringMVC的核心控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <!--配置初始化参数,用于读取SpringMVC的配置文件 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!--配置servlet对象创建时间点:应用启动时加载这个Servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
  • 创建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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd">
    <!--配置SpringMVC创建容器时需要扫描的包-->
    <context:component-scan base-package="com.liang"></context:component-scan>
    <!--配置视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>
  • 编写控制器并使用注解配置
package com.liang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping(path = "/hello")
    public String sayHello(){
        System.out.println("HelloController控制器的syaHello方法执行了...");
        return "success";
    }

}
  • 编写success.jsp页面(WEB-INF/pages/success.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>入门程序</title>
</head>
<body>
    入门程序执行成功
</body>
</html>

完成后的工程目录如下图
在这里插入图片描述

入门程序执行过程图

在这里插入图片描述
从入门程序执行过程图中可以看出:浏览器发送请求,被DispatcherServlet捕获,该Servlet不处理请求,而是将请求进行转发,转发的路径是根据请求URL匹配@RequestMapping中的内容;匹配成功后,执行对应方法,该方法存在返回值;根据该返回是,借助InternalResourceViewResolver找到对应的结果视图;渲染结果视图,响应到浏览器。

SpringMVC组件了解

DispatcherServlet

DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户请求,DispatcherServlet的存在降低了组件之间的耦合性。其主要职责是调度工作。

通过HandlerMapping,将请求映射到处理器。
通过HandlerAdapter支持多种类型的处理器。
通过视图解析器解析逻辑视图名到对应的视图。
文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
HandlerMapping

负责根据用户请求找到对应的Handler,SpringMVC提供了不用的映射器实现不同的映射方式。

Handler

开发中编写的棘突业务控制器,由DispatcherServlet把用户请求转发到Handler,由Handler对具体的用户请求做处理。

HandlerAdapter

用于对handler进行执行,通过扩展handlerAdapter可以对更多类型的handler进行处理

ViewResolver

负责将处理结果生成View视图,ViewResolver根据逻辑视图名解析成具体的页面地址(物理视图名),再生成View视图对象,最后将View视图进行渲染将处理结果通过页面展示给用户。

@Controller 注解

此注解用于标记在一个类上,使用此标记的类将成为一个SpringMVC Controller对象。基于注解的控制器不需要在配置文件中部署映射,仅需要使用@RequestMapping注解方法进行请求处理;在SpringMVC的配置文件中,用context:component-scan/启动包扫描功能,以便注册带有@Controller,@Service,@repository,@Component等注解的类成为Spring的Bean。

@RequestMapping注解

用于建立请求URL和处理请求方法之间的对应关系。次注解可以标记在类或者方法上,当标记在类上时,表示请求URL的一级访问目录,此处若不写,则相当于应用的根目录,写的话必须以/开头,主要目的是为了使我们的URL可以按照模块化管理;当标记出现在方法上,表示请求URL的第二级访问目录

属性 功能
path 用于指定请求的URL,和value属性作用一样
method 用于指定请求方式
params 用于指定限制请求参数的条件,支持简单的表达式

@RequestMapping注解使用示例

编写JSP代码

<%@page contentType="text/html; charset=UTF-8" language="java"  isELIgnored="false" %>

<html>
    <head>
        <title>requestMapping的使用</title>
    </head>
    <body>
        <!--第一种访问方式-->
        <a href="${pageContext.request.contextPath}/account/findAccount">查询账户</a><br/>
        <!--第二种访问方式-->
        <a href="account/findAccount">查询账户</a><br/><br/>

        <!--请求方式不同-->
        <a href="account/saveAccount">保存账户,get请求</a><br/>
        <form action="account/saveAccount" method="post">
            <input type="submit" value="保存账户,post请求"/>
        </form>

        <!--params属性示例-->
        <a href="account/deleteAccount?accountName=zhangshan&money=100">删除账户,金额100</a><br/>
        <a href="account/deleteAccount?accountName=zhangshan&money=1000">删除账户,金额1000</a><br/>
    </body>
</html>

编写Controller的代码

package com.liang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller("accountController")
@RequestMapping(path = "/account")
public class AccountController {

    /**
     * 查询所有账户
     * @return
     */
    @RequestMapping(path = "/findAccount")
    public String findAccount(){
        System.out.println("查询了账户...");
        return "success";
    }

    /**
     * 保存账户 只接受 post 方式请求
     * @return
     */
    @RequestMapping(path = "/saveAccount", method = RequestMethod.POST)
    public String saveAccount()
    {
        System.out.println("保存账户");
        return "success";
    }

    /**
     * 删除用户  用于测试 params 参数
     * @return
     */
    @RequestMapping(path = "/deleteAccount", params = {"accountName","money!=100"})
    public String deleteAccount()
    {
        System.out.println("删除用户");
        return "success";
    }
}

上述代码需要注意的是: 1.保存账户使用get请求的超链接点击后会出现如下页面在这里插入图片描述
这是由于保存账户的方法设置了请求方式,只允许post请求方式。
2.删除用户,金额100的超链接点击后会出现以下页面在这里插入图片描述
这是由于删除账户需要传递满足条件的参数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章