第二节 HelloWorld
1、功能需求
①访问首页
②在首页点超链接
2、搭建环境
①导入依赖
②日志配置文件
③web.xml
④Spring配置文件
3、代码实现
①创建请求处理器类
[1]名称
[2]创建
②实现访问首页
[1]创建 handler 方法
[2]在首页编写超链接
③实现点击超链接
[1]加入日志记录仪
[2]声明 handler 方法
[3]创建目标页面
④整体流程解析
关于DispatcherServlet的

第二节 HelloWorld

1、功能需求

①访问首页

02.HelloWorld - 图1

②在首页点超链接

02.HelloWorld - 图2

2、搭建环境

①导入依赖




org.springframework
spring-webmvc
5.3.1


ch.qos.logback
logback-classic
1.2.3


javax.servlet
javax.servlet-api
3.1.0
provided


org.thymeleaf
thymeleaf-spring5
3.0.12.RELEASE

由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠传递性导入。
02.HelloWorld - 图3

②日志配置文件

<?xml version=”1.0” encoding=”UTF-8”?>


class=”ch.qos.logback.core.ConsoleAppender”>



[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n

  1. <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR --><br /> <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 --><br /> <root level="INFO"><br /> <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender --><br /> <appender-ref ref="STDOUT" /><br /> </root>
  2. <!-- 根据特殊需求指定局部日志级别 --><br /> <logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG" />

③web.xml



DispatcherServlet

  1. <!-- DispatcherServlet的全类名 --><br /> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  2. <!-- 通过初始化参数指定SpringMVC配置文件位置 --><br /> <init-param>
  3. <!-- 如果不记得contextConfigLocation配置项的名称,可以到DispatcherServlet的父类FrameworkServlet中查找 --><br /> <param-name>contextConfigLocation</param-name>
  4. <!-- 使用classpath:说明这个路径从类路径的根目录开始才查找 --><br /> <param-value>classpath:spring-mvc.xml</param-value><br /> </init-param>
  5. <!-- 作为框架的核心组件,在启动过程中有大量的初始化操作要做,这些操作放在第一次请求时才执行非常不恰当 --><br /> <!-- 我们应该将DispatcherServlet设置为随Web应用一起启动 --><br /> <load-on-startup>1</load-on-startup>


DispatcherServlet

  1. <!-- 对DispatcherServlet来说,url-pattern有两种方式配置 --><br /> <!-- 方式一:配置“/”,表示匹配整个Web应用范围内所有请求。这里有一个硬性规定:不能写成“/*”。只有这一个地方有这个特殊要求,以后我们再配置Filter还是可以正常写“/*”。 --><br /> <!-- 方式二:配置“*.扩展名”,表示匹配整个Web应用范围内部分请求 --><br /> <url-pattern>/</url-pattern><br /></servlet-mapping>
  • 观察源码,会发现HttpServlet是DispatcherServlet的上级类。DispatcherServlet是SpringMVC的总控制器。(在SpringMVC中,只需要这一个Servlet就够了,不需要去创建更多的Servlet,哪怕有很多的功能)。
  • 通过调用public void setContextConfigLocation(…. ) { }指定SpringMVC配置文件的名字。名称和位置其实没有统一要求,比如文件中的:classpath:springmvc.xml。
  • 过滤路径是.action,表示DispatcherServlet只过滤以.action结尾的请求。(其实还可以是*.do,.abc等,后面开发中遵守该约定即可)

④Spring配置文件









  1. <!-- 视图前缀 --><br /> <property name="prefix" value="/WEB-INF/templates/"/>
  2. <!-- 视图后缀 --><br /> <property name="suffix" value=".html"/><br /> <property name="templateMode" value="HTML5"/><br /> <property name="characterEncoding" value="UTF-8" /><br /> </bean><br /> </property><br /> </bean><br /> </property><br /></bean>

3、代码实现

①创建请求处理器类

[1]名称

SpringMVC 对处理请求的类并没有特殊要求,只要是 POJO 即可。我们自己习惯上有两种命名方式:

  • XxxHandler:意思是 Xxx 处理器的意思
  • XxxController:意思是 Xxx 控制器的意思

这只是一个命名的习惯,不是语法要求。所以往往把处理请求的类叫做『Handler类』,处理请求的方法叫做『Handler方法』。

[2]创建

02.HelloWorld - 图4

@Controller
public class Demo01HelloHandler {

}

②实现访问首页

[1]创建 handler 方法

@Controller
public class Demo01HelloHandler {

  1. // @RequestMapping注解在请求地址和Java方法之间建立映射关系<br /> @RequestMapping("/")<br /> public String showPortal() {<br /> return "portal";<br /> }

}

[2]在首页编写超链接

02.HelloWorld - 图5

<!DOCTYPE html>





<h1>首页</h1>

<!-- 以后我们会越来越倾向于用一句话来作为请求的URL地址,在这样的一句话中使用“/”分隔各个单词 --><br />    <!-- say hello to spring mvc --><br />    <!-- /say/hello/to/spring/mvc --><br />    <a th:href="@{/say/hello/to/spring/mvc}">HelloWorld</a><br/>


③实现点击超链接

[1]加入日志记录仪

在 handler 类中声明一个成员变量:
private Logger logger = LoggerFactory.getLogger(this.getClass());

  • Logger:org.slf4j.Logger
  • LoggerFactory:org.slf4j.LoggerFactory

使用日志而不是 sysout 的方式在控制台打印,好处在于:根据日志的级别可以非常方便的控制某些日志是否打印。
不管 sysout 还是日志,只要是在控制台打印数据,底层都是 I/O 操作。在项目中,访问数据库和 I/O 都是典型的高消耗型的操作。
在控制台打印的数据,用户看不到,打印它肯定是为了调试程序等类似需求。所以在项目上线的时候,用于调试程序的控制台打印都应该去掉。
如果我们是通过 sysout 方式打印,那么它们会分散在项目中的各个地方,想要通过手动方式删除会很繁琐也可能会有遗漏。
而使用日志的方式,只要在配置文件中修改一下日志级别,就能全面控制某个级别的日志打印或者不打印。
而且日志框架通常都能够指定日志保存的位置,如果有需要可以将日志数据保存到数据库等位置。

[2]声明 handler 方法

// 以后我们会越来越倾向于用一句话来作为请求的URL地址
// 在这样的一句话中使用“/”分隔各个单词
@RequestMapping(“/say/hello/to/spring/mvc”)
public String sayHello() {

// 方法内部打印日志,证明 SpringMVC 确实调用了这个方法来处理请求<br />    logger.debug("我是 SpringMVC 的 Hello world。");

return "target";<br />}

[3]创建目标页面

02.HelloWorld - 图6

<!DOCTYPE html>





<h1>目标页面</h1>

<a th:href="@{/}">回首页</a>


④整体流程解析

02.HelloWorld - 图7

关于DispatcherServlet的

  1. 第一种:.action(或者.do,都是从Struts延续过来的写法)。最传统的方式,最简单也最实用。只有.action结尾的请求会由DispatcherServlet进行解析。
  2. 第二种:/* 这种配置方式不对,使用这种配置,当我们访问到一个JSP、HTML、CSS等时,也会经过DispatcherServlet进行解析,将不能正常显示,会报错。
  3. 第三种:/ 所有访问地址(除.jsp、.jspx之外)都由DispatcherServlet进行解析,使用这种方法可以实现越来越流行的RESTful风格。这种使用越来越多了。

如果采用 / 这种方式,对于静态文件解析需要配置,不让DispatcherServlet进行解析,否则将无法访问到。配置方式有多种,最简单的方式就是在springmvc.xml中添加注解:

作用详解:配置后,会在SpringMVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler。它会像一个检查员,对进入DispatcherServlet的URL进行筛查。

  • 如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet(对应Tomcat是org.apache.catalina.servlets.DefaultServlet)处理
  • 如果不是静态资源的请求,才由DispatcherServlet继续处理。

上一节 回目录 下一节