Spring MVC 5 + Thymeleaf 基于Java配置和注解配置

Spring MVC 5 + Thymeleaf 注解配置

Spring的配置方式一般为两种:XML配置和注解配置

Spring从3.0开始以后,推荐使用注解配置,这两种配置的优缺点说的人很多,我就不说了,自行体会,下面就用注解配置实现一个Spring MVC Web Demo

先看看项目结构:

278758-20180608211153825-1782161460.jpg

可以看到没有任何XML配置文件,全都是Java代码实现。

  1. 使用 Maven 新建一个项目,当然你用IEDA,Eclipse新建一个空的项目一样的,然后添加依赖,依赖下面直接给出:

    4.0.0
    spring-mvc
    spring-mvc
    1.0-SNAPSHOT
    war

        <name>Spring-mvc Maven Webapp</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><failOnMissingWebXml>false</failOnMissingWebXml><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><spring.version>5.0.6.RELEASE</spring.version><thymeleaf.version>3.0.9.RELEASE</thymeleaf.version></properties><dependencies><!--spring相关包--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--j2ee相关包 servlet、jsp、jstl--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>${thymeleaf.version}</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.5</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!--配置热启动--><configuration><fork>true</fork></configuration></plugin><!--servlet容器 tomcat 插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build>
    </project>
  2. 新建 MvcWebConfig 配置类 实现WebMvcConfigurer接口,重写configureViewResolvers 方法即可,并且使用 @Configuration、@ComponentScan 注解 MvcWebConfig 类,下面我给出主要代码,然后说明代码的作用。

        /*** STEP 1 - 创建模版解析器*/@Beanpublic ITemplateResolver templateResolver() {SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();templateResolver.setApplicationContext(applicationContext);templateResolver.setPrefix("/WEB-INF/templates/");templateResolver.setSuffix(".html");templateResolver.setCharacterEncoding("UTF-8");templateResolver.setTemplateMode(TemplateMode.HTML);templateResolver.setCacheable(false);return templateResolver;}/*** STEP 2 - 创建模版引擎* 并为模板引擎注入模板解析器*/@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());templateEngine.setEnableSpringELCompiler(true);return templateEngine;}/*** STEP 3 - 注册 Thymeleaf 视图解析器* 并为解析器注入模板引擎*/@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setTemplateEngine(templateEngine());viewResolver.setCharacterEncoding("UTF-8");registry.viewResolver(viewResolver);}
    • templateResolver 方法和XML配置的类似
    • 中文会有乱码问题,需要设置 "UTF-8",两个地方必须都要设置,否则会显示乱码
  3. 新建 MvcWebAppInitializer 类 extends 抽象类 AbstractAnnotationConfigDispatcherServletInitializer,重写以下几个方法
    @Override
    protected Class<?>[] getRootConfigClasses() {
    return null;
    }

        @Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{MvcWebConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();encodingFilter.setEncoding("UTF-8");encodingFilter.setForceRequestEncoding(true);return new Filter[]{encodingFilter};}

    至此,配置已经全部完成。

  4. 新建 HomeController ,新建 index 视图先看看,能不能跑起来
    • index :
      @RequestMapping(value = "/", method = RequestMethod.GET)
      public String index() {
      return "index";
      }
    • 在 \WEB-INF\templates 目录下新建页面 index.html,并使用thymeleaf 模板引擎
<!DOCTYPE html><html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Spring Index</title><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" crossorigin="anonymous"></head><body><div class="container" style="margin-top: 40px;"><div class="jumbotron"><h1>Spring Mvc 5 + Thymeleaf</h1><p>出现此页面,说明配置成功,弃用xml配置,使用注解方式实现</p><p>mvn tomcat7:run</p><p><a class="btn btn-primary btn-lg" th:href="@{/home/user}" role="button">Learn more</a></p></div></div><script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.slim.min.js" crossorigin="anonymous"></script><script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script></body></html>

/home/user 页面如下:
278758-20180608211338936-1600557741.jpg

至此页面已经完成,现在使用Maven 跑一下,命令:mvn tomcat7:run
当然你也可以用IDEA 的 Edit Configurations 新建一个Maven,如下图:

278758-20180608211052471-467720478.jpg
看一下效果:
278758-20180608211105584-1614690458.jpg

没有使用任何XML文件,Spring MVC跑起来了,再试试返回json数据

  1. 在 HomeController 新建userList 方法,返回List数组
    @ResponseBody
    @RequestMapping(value = "/home/userList", method = RequestMethod.GET)
    public List userList() {
    List userList = new ArrayList<>();
    userList.add(new UserInfo(1001, "龙傲天", 23, "成都省"));
    userList.add(new UserInfo(1002, "曹孟德", 33, "河北市"));
    userList.add(new UserInfo(1003, "Chris", 32, "高新市"));
    userList.add(new UserInfo(1003, "Evans", 17, "绵阳市"));

            return userList;}
    • Spring 返回 json数据 直接使用 @ResponseBody 注解杰克
    • @ResponseBody 依赖 com.fasterxml.jackson
  2. 看下返回json数据的效果
    278758-20180608211121637-1577783693.jpg

没有使用任何XML文件,实现了一个Web 程序。
Ps:博客园的这个markdown 编辑器有问题,我用Typora写好了复制过来,总有些问题,将就着看吧

转载于:https://www.cnblogs.com/softmax/p/9157584.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[js] 你是如何比较js函数的执行速度的?

[js] 你是如何比较js函数的执行速度的&#xff1f; 采用chrome performance apiconsole.time(flag); console.timeEnd(flag);performance api比较精准的 console.time(flag); 也行 搭配timelog 多次测量个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

docker镜像无法删除 Error:No such image:xxxxxx

1、前言 docker镜像无法删除&#xff0c;通过 docker images 查看镜像明明存在就是删除不了。 删除提示&#xff1a;Error&#xff1a;No such image&#xff1a;xxxxxxx 具体截图内容如下&#xff1a; 2、解决方法 进入目录&#xff1a; cd /var/lib/docker/image/over…

[js] axios拦截器原理是什么?

[js] axios拦截器原理是什么&#xff1f; 拦截器原理其实就是用use添加用户自定义的函数到拦截器的数组中。 最后把他们放在拦截器请求前&#xff0c;请求后。组成promise链式调用。 // 组成Promise链// Hook up interceptors middleware// 把 xhr 请求 的 dispatchRequest 和…

python中集合set,字典dict和列表list的区别以及用法

python中set代表集合&#xff0c;list代表列表,dict代表字典 set和dict的区别在于&#xff0c;dict是存储key-value&#xff0c;每一个key都是唯一的&#xff0c;set相对于dict存储的是key&#xff0c;且key是唯一的,list除了变量外都可以存储 dict{"a":1,"b&qu…

[js] fetch和axios请求的原理都是基于XMLHttpRerequst吗?

[js] fetch和axios请求的原理都是基于XMLHttpRerequst吗&#xff1f; axios是基于XMLHttpRequest的封装&#xff0c;而fetch是js原生支持的网络请求api&#xff0c;这在浏览器底层进行了支持。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#x…

LeetCode(81): 搜索旋转排序数组 II

Medium&#xff01; 题目描述&#xff1a; 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如&#xff0c;数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true&#xff0c;否则返回 false。 示…

网站三级分销数据库如何设计,简单案例

一、问题产生 有小伙伴微信私信我&#xff0c;说老板想设计一套三级返佣的微信淘宝客裂变系统&#xff0c;然后问我怎么搞… 咳咳&#xff0c;对于三级分销的数据库设计&#xff0c;相信很多小伙伴头疼的可能不是设计上&#xff0c;而是查询上&#xff0c;因为通常涉及到会员…

[js] 举例说明面向对象编程有什么缺点?

[js] 举例说明面向对象编程有什么缺点&#xff1f; 有实例化开销&#xff0c;内存消耗比较大&#xff0c;性能消耗比较大个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端…

第6课 仿Siri机器人-语音朗读和语音识别

一、功能设计输入文本&#xff0c;单击“朗读”按钮&#xff0c;由手机读出该文本&#xff08;如果没有输入文本&#xff0c;则弹出消息框警告“请输入文本&#xff09;&#xff1b;单击“识别”按钮&#xff0c;读入语音&#xff0c;从文本框中输出文字。&#xff08;另&#…

口述完SpringMVC执行流程,面试官就让同事回家等消息了

Srping MVC 执行流程真的是老生常谈的话题了&#xff0c;最近同事小刚出去面试&#xff0c;前面面试官相继问了几个 Spring 相关的问题&#xff0c;但当面试官问他&#xff0c;你知道 Srping MVC 的执行流程吗&#xff1f;小刚娴熟的巴拉巴拉回答完后&#xff0c;面试官就让他回…

[js] 使用js实现一个循环队列

[js] 使用js实现一个循环队列 const queue [] let queueRunning false let loopTimer null const loop task > {// do something...console.log(task)if (isQueueHasTask()) {// you can add new tasks in the middle of the queue.loopTimer setTimeout(() > {loo…

iview-cli 采坑记录

1.iview-cli 关于跨域的问题&#xff1a; 使用 webpack-devServer 启动 node 服务器可以通过配置 proxy 对象实现跨域&#xff1a; let proxyUrl http://dev.api.wankaonline.gm825.net;devServer: {proxy: {/index: {target: proxyUrl,pathRewrite: {^/index : /index},ws: t…

如何关闭线程池?会创建不会关闭?调用关闭方法时线程池里的线程如何反应?

前言 相信大家在面试的时候经常会遇到「线程池」相关的问题&#xff0c;比如&#xff1a; 什么是线程池&#xff1f;线程池的优点&#xff1f;有哪几种创建线程池的方式&#xff1f;四种创建线程池的使用场景&#xff1f;线程池的底层原理&#xff1f;线程池相关的参数&#…

[js] Number()的存储空间是多大?假如接口返回一个超过最大字节的数字怎么办?

[js] Number()的存储空间是多大&#xff1f;假如接口返回一个超过最大字节的数字怎么办&#xff1f; Number类型的最大值为2的53次方&#xff0c;即9007199254740992&#xff0c;如果超过这个值&#xff0c;比如900719925474099222&#xff0c;那么得到的值会不精确&#xff0…

C++ 判断系统大小字节序

bool IsLitterEndian() {union UTest{std::uint16_t t;std::uint8_t c;} endianTest{ 0x01 };return (endianTest.c 0x01); } 转载于:https://www.cnblogs.com/fluteary/p/9178627.html

macos brew zookeeper,安装后zookeeper启动失败?

一、Zookeeper安装流程 执行如下安装命令&#xff1a; brew install zookeeper执行截图如下&#xff1a; 安装后查看 zookeeper 安装信息&#xff08;默认拉取最新版本&#xff09; brew info zookeeper执行截图如下&#xff1a; 二、Zookeeper启动、状态查询、及关闭 启…

[js] alert如何让文本换行?

[js] alert如何让文本换行&#xff1f; 先考虑兼容性的问题&#xff0c;再使用转义字符 ie&#xff1a; alert("A\r\nB"); //chrome也可以实现 chrome&#xff1a; alert("A\nB");个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易…

批量更新数据(BatchUpdate)

批量更新数据&#xff08;BatchUpdate&#xff09; /// <summary> /// 批量更新数据&#xff0c;注意&#xff1a;如果有timestamp列&#xff0c;要移除 /// </summary> /// <param name"sourceTable">源数据</param> /// <param name&qu…

[js] 一个api接口从请求数据到请求结束共与服务器进行了几次交互?

[js] 一个api接口从请求数据到请求结束共与服务器进行了几次交互&#xff1f; API是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。如果已经建立了连接&#xff0c;那么单次请求数据到请求结束应该是一次交互&#xff1b;如果没有建立连接&#xff0c;根…

为什么SimpleDateFormat不是线程安全的?

一、前言 日期的转换与格式化在项目中应该是比较常用的了&#xff0c;最近同事小刚出去面试实在是没想到被 SimpleDateFormat 给摆了一道… 面试官&#xff1a;项目中的日期转换怎么用的&#xff1f;SimpleDateFormat 用过吗&#xff1f;能说一下 SimpleDateFormat 线程安全问…