第二节 HelloWorld
1、功能需求
①访问首页
②在首页点超链接
2、搭建环境
①导入依赖
②日志配置文件
③web.xml
④Spring配置文件
3、代码实现
①创建请求处理器类
[1]名称
[2]创建
②实现访问首页
[1]创建 handler 方法
[2]在首页编写超链接
③实现点击超链接
[1]加入日志记录仪
[2]声明 handler 方法
[3]创建目标页面
④整体流程解析
关于DispatcherServlet的
第二节 HelloWorld
1、功能需求
①访问首页
②在首页点超链接
2、搭建环境
①导入依赖
由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠传递性导入。
②日志配置文件
<?xml version=”1.0” encoding=”UTF-8”?>
<!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR --><br /> <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 --><br /> <root level="INFO"><br /> <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender --><br /> <appender-ref ref="STDOUT" /><br /> </root>
<!-- 根据特殊需求指定局部日志级别 --><br /> <logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG" />
③web.xml
<!-- DispatcherServlet的全类名 --><br /> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过初始化参数指定SpringMVC配置文件位置 --><br /> <init-param>
<!-- 如果不记得contextConfigLocation配置项的名称,可以到DispatcherServlet的父类FrameworkServlet中查找 --><br /> <param-name>contextConfigLocation</param-name>
<!-- 使用classpath:说明这个路径从类路径的根目录开始才查找 --><br /> <param-value>classpath:spring-mvc.xml</param-value><br /> </init-param>
<!-- 作为框架的核心组件,在启动过程中有大量的初始化操作要做,这些操作放在第一次请求时才执行非常不恰当 --><br /> <!-- 我们应该将DispatcherServlet设置为随Web应用一起启动 --><br /> <load-on-startup>1</load-on-startup>
<!-- 对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配置文件
<!-- 视图前缀 --><br /> <property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 --><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]创建
@Controller
public class Demo01HelloHandler {
}
②实现访问首页
[1]创建 handler 方法
@Controller
public class Demo01HelloHandler {
// @RequestMapping注解在请求地址和Java方法之间建立映射关系<br /> @RequestMapping("/")<br /> public String showPortal() {<br /> return "portal";<br /> }
}
[2]在首页编写超链接
<!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]创建目标页面
<!DOCTYPE html>
<h1>目标页面</h1>
<a th:href="@{/}">回首页</a>
④整体流程解析
关于DispatcherServlet的
- 第一种:.action(或者.do,都是从Struts延续过来的写法)。最传统的方式,最简单也最实用。只有.action结尾的请求会由DispatcherServlet进行解析。
- 第二种:/* 这种配置方式不对,使用这种配置,当我们访问到一个JSP、HTML、CSS等时,也会经过DispatcherServlet进行解析,将不能正常显示,会报错。
- 第三种:/ 所有访问地址(除.jsp、.jspx之外)都由DispatcherServlet进行解析,使用这种方法可以实现越来越流行的RESTful风格。这种使用越来越多了。
如果采用 / 这种方式,对于静态文件解析需要配置,不让DispatcherServlet进行解析,否则将无法访问到。配置方式有多种,最简单的方式就是在springmvc.xml中添加注解:
作用详解:配置
- 如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet(对应Tomcat是org.apache.catalina.servlets.DefaultServlet)处理
- 如果不是静态资源的请求,才由DispatcherServlet继续处理。