SpringMVC框架 学习DAY_01:框架概括 / 简易应用 / 核心执行流程图 /在框架下显示HTML模板页面/ 接受请求

1. SpringMVC框架的作用

MVC = Model(数据模型) + View(视图) + Controller(控制器)

SpringMVC框架主要解决了接收请求与处理响应的问题,也可以认为是解决了V-C交互的问题,与M其实没有关系。

在传统的Java EE的开发模式下,可能存在Servlet组件数量太多的问题,会导致项目的管理难度太大,且运行时,会有大量的Servlet对象长期占用内存的问题!

另外,传统的Java EE开发模式下,数据的处理过程中代码量相对较大,而SpringMVC非常大极度的简化了开发量!

2. SpringMVC HelloWorld

2.1. 案例目标

最终程序运行后,打开浏览器,输入http://localhost:8080/项目名/hello.do即可看到自定义输出的内容。

2.2. 在Eclipse中添加Server

打开Eclipse的Servers面板,添加Tomcat,当添加成功后,在Eclipse的项目列表中,会出现Servers项目,在需要使用Tomcat时,必须保证该项目是存在且打开的状态。

2.3. 创建项目

创建Maven ProjectGroup Idcn.teduArtifact Idspringmvc01Packaing必须选择war

当项目创建出来后,对项目名称点右键,在项目属性的Targeted Runtimes中勾选Tomcat。

刚刚创建好的项目的pom.xml会报错,因为缺少web.xml文件,并且<failOnMissingWebXml>节点默认为true,结合指定Java版本的代码,在pom.xml中添加:

<properties>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

然后,还需要在pom.xml中添加spring-webmvc的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.5.RELEASE</version>
    </dependency>
</dependencies>
2.4. 创建初始化类

创建cn.tedu.spring包,在这个包中创建SpringMvcConfig配置类,并在这个类上配置组件扫描:

package cn.tedu.spring;

import org.springframework.context.annotation.ComponentScan;

/**
 * SpringMvc的配置类
 */
@ComponentScan("cn.tedu.spring")
public class SpringMvcConfig {

}

在这个包中创建SpringMvcInitializer类,作为整个项目的初始化类,该类需要继承自AbstractAnnotationConfigDispatcherServletInitializer类,并重写该类中的抽象方法,在重写的getServletConfigClasses()方法中,返回以上SpringMvcConfig类,在重写的getServletMappings()方法中,返回的字符串数组中配置"*.do"即可:

package cn.tedu.spring;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * 项目的初始化类
 */
public class SpringMvcInitializer extends
	AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return null;
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		// 当项目初始化时,会加载当前方法的返回值
		// 类似于创建了AnnotationConfigApplicationContext的对象,并且把当前方法的返回值作为构造方法参数
		return new Class[] { SpringMvcConfig.class };
	}

	@Override
	protected String[] getServletMappings() {
		// 所有以 .do 为后缀的请求都由SpringMVC框架处理
		// 之所以使用 .do 是因为它不是一个正常的扩展名
		// 可以与访问普通的文件区分开来
		// 也可以换成其它后缀,例如 .action
		return new String[] { "*.do" };
	}

}

以上2个类都可以不必放在cn.tedu.spring包中,但是,应该为这2个类确定一个合理的包名。

2.5. 使用控制器接收并处理请求

在组件扫描的cn.tedu.spring包中创建HelloController类,并在类的声明之前添加@Controller注解:

package cn.tedu.spring;

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

/**
 * 控制器类,SpringMVC框架中的控制器的名称是自定义的,并且,不需要继承自某个类,也不需要实现某个接口
 */
@Controller
public class HelloController {

}

然后,在这个中添加以下代码:

// @RequestMapping用于配置请求路径
// 后续,当项目运行时,按照这个路径来访问
// 就会导致接下来的方法被执行
// 接下来的方法就相当于Servlet中的service()方法
@RequestMapping("hello.do")
// @ResponseBody表示响应正文
// 会导致接下来的方法的返回值会直接响应到客户端去
@ResponseBody
public String hello() {
    // 注意:不要返回中文或中文的标点符号,默认不支持
    return "Hello, SpringMVC!!!";
}

3. SpringMVC框架的核心组件

在这里插入图片描述

  • DispatcherServlet:前端控制器,负责接收所配置的所有请求(假设配置为*.do,则它将接收所有以.do为后缀的请求),并负责分发这些请求;
  • HandlerMapping:记录了请求路径与处理请求的Controller或其方法的对应关系,
  • Controller:控制器,负责处理具体的请求,每个项目中可能有若干个Controller组件,每个Controller组件中可以有若干个处理请求的方法;
  • ModelAndView:控制器处理完请求后得到的结果,该结果可以包含数据与视图名称;
  • ViewResovler:视图解析器,可以根据视图名称来确定具体的视图组件。

4. 显示html模版页面

先在src/main/resources下创建templates文件夹,然后,在该文件夹创建register.html页面,页面的内容可以自行设计。

然后,在控制器中,将处理请求的方法之前的@ResponseBody注解去掉,并将方法的返回值改为register(HTML文件的名称),例如:

// 【显示注册页面】
@RequestMapping("reg.do")
public String reg() {
    return "register";
}

最后,在pom.xml中添加thymeleafthymeleaf-spring4/thymeleaf-spring5的依赖:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

并在SpringMvcConfig中添加关于ViewResolver的配置:

private String characterEncoding = "utf-8";

@Bean
public ViewResolver viewResolver() {
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setCharacterEncoding(characterEncoding);
    templateResolver.setCacheable(false);
    templateResolver.setTemplateMode("HTML");
    templateResolver.setPrefix("/templates/"); // 前缀
    templateResolver.setSuffix(".html"); // 后缀

    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);

    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setCharacterEncoding(characterEncoding);
    viewResolver.setTemplateEngine(templateEngine);
    return viewResolver;
}

在以上配置中,需要关注的就是配置“前缀”和“后缀”的2条配置!SpringMVC框架在使用以上视图解析器时,会将“前缀”、“控制器方法返回的视图名称”、“后缀”拼接起来,得到具体用于显示的视图组件,以上代码中,拼接起来的值就是/templates/register.html,能够指向所设计的网页文件!当然,也可以采取其它的组件方式,例如“前缀”和“后缀”都配置为空字符串,而方法的返回值直接返回"/templates/register.html"也是可以的!

另外,以上代码中使用到了ClassLoaderTemplateResolver模版解析器,该模版解析器在工作时,默认会在项目的src/main/resources下查找视图组件,所以,视图文件(HTML)文件必须放在这个位置!还可以使用ServletContextTemplateResolver模版解析器,其查找视图组件的位置是在webapp下。

5. 接收客户端提交的请求参数

在SpringMVC框架中,将“客户端提交的请求参数”直接声明为“处理请求的方法的参数”即可,甚至,还可以将参数直接声明为所期望的类型,例如:

// 【处理注册请求】
@RequestMapping("handle_reg.do")
@ResponseBody
public String handleReg(String username, String password, Integer age, String phone, String email) {
    System.out.println("UserController.handleReg()");

    System.out.println("username=" + username);
    System.out.println("password=" + password);
    System.out.println("age=" + age);
    System.out.println("phone=" + phone);
    System.out.println("email=" + email);

    return "Over";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值