S

1

点赞

1

回复

416

浏览

MyBatis入门实例:整合Spring MVC与MyBatis开发问答网站

开发目标 今天我们使用MyBatis和Spring MVC开发一个简单的问答网站,你可以使用Markdown来发布问题和答案。完整的教程请参考 《基于MyBatis和Spring MVC搭建问答网站》 https://course.tianmaying.com/spring mvc mybatis qa 。 这篇文章可以教会你以下知识: MyBatis配置和使用最简单的姿势 MyBatis+Spring MVC实现一个简单的Web页面 MyBatis的核心类是干嘛用的( SqlSessionFactoryBuilder 、 SqlSessionFactory 和 SqlSession ) MyBatis Spring如何使用,帮你做了哪些工作? MyBatis Spring Boot Starter如何支持MyBatis,让你使用MyBatis的门槛降到最低 相信看完本身是你开始使用MyBatis的一个非常棒的开始! 最终的效果图如下: Web端的开发我们使用Spring MVC,对Spring MVC还不太熟悉的同学,可以看看天码营的 Spring MVC实战练习 https://course.tianmaying.com/spring mvc 。当然,Spring MVC的部分不是这个练习的重点,也基本不影响大家的理解和练习。 这样一个系统麻雀虽小,五张俱全,会涉及MyBatis的很多核心知识。MyBatis确实是一个非常简单易学的ORM框架,很适合作为你学习的第一款Java ORM框架。 ORM是什么? ORM是Object Relation Mapping的缩写,顾名思义,即对象关系映射。 ORM是一种以面向对象的方式来进行数据库操作的技术。Web开发中常用的语言,都会有对应的ORM框架。而MyBatis就是Java开发中一种常用ORM框架。 简单地理解,通过Java进行数据库访问的正常流程可以分为以下几步: 1. 准备好SQL语句 2. 调用JDBC的API传入SQL语句,设置参数 3. 解析JDBC返回的结果 这个过程实际上非常麻烦,比如: 在Java代码中拼接SQL非常麻烦,而且易于出错 JDBC的代码调用有很多重复性的代码 从JDBC返回的结果转换成领域模型的Java对象很繁琐 而使用ORM框架,则可以让我们用面向对象的方式来操作数据库,比如通过一个简单的函数调用就完成上面整个流程,直接返回映射为Java对象的结果。这个流程中很大一部分工作其实交给ORM自动化地帮我们执行了。 MYBATIS简介 MyBatis的入门知识最好的材料是其 官方网站 http://www.mybatis.org/mybatis 3/ ,而且其绝大部分内容都有中文版本。 官方网站上如下介绍MyBatis: MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或标注,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 简单地理解,你可以认为MyBatis将SQL语句,以及SQL返回结果到Java对象的映射,都放到了一个易于配置的XML文件里了,你的Java代码就会变得异常简单。当然,除了XML,MyBatis同时也支持基于标注的方式,但是功能上会有一些限制。总体来说,我们推荐使用XML方式,一些简单的SQL使用标注会更方便一些。 开发环境 工欲善其事,必先利其器 首先让我们搭建好本地的开发环境,这里不会事无巨细地描述环境中每一种工具的安装步骤和用法,你可以从参考材料以及Google中获取有用的信息。 JAVA 我们推荐安装 JavaSE Development Kit 8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8 downloads 2133151.html 。 参考 Java开发环境安装与配置 https://course.tianmaying.com/java basic/lesson/java environment IDE IDE我们推荐使用 Eclipse http://www.eclipse.org/home/index.php 或 IntelliJ IDEA https://www.jetbrains.com/idea/ (当然还有很多别的选择),它们对Maven项目的支持非常完善,自动提示、补全功能异常强大,对于开发效率的提升非常明显。 参考 Eclipse安装和使用 https://course.tianmaying.com/java basic/lesson/eclipse 0 MAVEN Maven是Java世界中最流行的项目构建工具,理论上来说在安装了IDE后,IDE内部会自带一个Maven的安装版本,如果想在命令行工具中使用Maven命令,可以单独进行安装。 参考: Maven基本概念 http://www.tianmaying.com/tutorial/maven basic 如何通过Maven构建项目 http://www.tianmaying.com/tutorial/maven demo 通过Maven进行项目构建与管理 http://www.tianmaying.com/tutorial/maven project management 如果想深入了解,推荐 Maven实战 https://book.douban.com/subject/5345682/ 。 H2 我们使用内嵌的数据库H2,如果希望转换成其他数据库,比如MySQL,只需修改数据库连接串即可。当然别忘了要在依赖中增加相应的数据库访问驱动包。H2数据库不需要你任何额外的安装工作。 创建项目 接下来我们开始创建第一个MyBatis项目吧。新建一个Maven项目,项目结构如下: ....

spring-mvcmybatisspring

9

点赞

2

回复

4417

浏览

用Java实现网易云音乐爬虫

起因 前两天在知乎上看到一个帖子《 网易云音乐有哪些评论过万的歌曲? https://www.zhihu.com/question/31677442 》,一时技痒,用Java实现了一个简单的爬虫,这里简单记录一下。 最终的结果开放出来了,大家可以随意访问, 请戳这里 网易云音乐爬虫结果 http://grri94kmi4.app.tianmaying.com/songs 。 爬虫简介 网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,一个通用的网络爬虫大致包含以下几个步骤: 网络爬虫的大致流程如上图所示,无论你是做什么样的爬虫应用,整体流程都是大同小异。现在,我们就根据网易云音乐来定制一个专门爬取音乐评论数量的特定网络爬虫。 前期准备 网页类型分析 首先,我们需要对 网易云音乐 http://music.163.com/ 整个网站有个大致的了解,进入 网易云音乐首页 http://music.163.com/ ,浏览后发现其大概有这么几种类型的URL: 推荐页面 排行榜列表以及排行榜页面 歌单列表以及歌单页面 主播电台列表以及主播电台页面 歌手列表以及歌手页面 专辑列表(新碟上架)以及专辑页面 歌曲页面 我们最终需要爬取的数据在歌曲页面中,该页面里包含了歌曲的名称以及歌曲的评论数量。 另外,我们还需要尽可能多的获取歌曲页面,这些信息我们可以从前面6种类型的页面拿到。其中,歌单列表以及歌单页面结构最简单,歌单列表直接分页就可以拿到。因此,我们选择歌单页面作为我们的初始页面,然后歌单列表 歌单 歌曲一路爬下去即可。 设计数据模型 通过上述分析,我们可以知道我们要做两件事情,一是爬取页面歌单列表 歌单 歌曲,二是将最终的结果存储起来。因此,我们只需要两个对象,一个用来存储页面相关的信息,url、页面类型、是否被爬过(html和title作为临时数据存储),另外一个用来存储歌曲相关信息,url、歌曲名,评论数。因此,model类如下: public class WebPage {...

爬虫spring-mvcjava

1

点赞

0

回复

457

浏览

Spring MVC@RequestMapping 方法所支持的参数类型和返回类型详解

使用 @RequestMapping 标注的处理方法可以拥有非常灵活的方法签名,它支持的方法参数及返回值类型种类极其丰富。大多数参数都可以任意的次序出现,除了唯一的一个例外: BindingResult 参数。 支持的方法参数类型 @RequestMapping 方法方法所支持的常见参数类型: 请求或响应对象(Servlet API)。可以是任何具体的请求或响应类型的对象,比如, ServletRequest 或 HttpServletRequest 对象。 HttpSession 类型的会话对象(Servlet API)。使用该类型的参数将要求这样一个session的存在,因此这样的参数永不为 null 。 当前请求的地区信息 java.util.Locale ,由已配置的最相关的地区解析器解析得到。在MVC的环境下,就是应用中配置的 LocaleResolver 或 LocaleContextResolver 与当前请求绑定的时区信息 java.util.TimeZone (java 6以上的版本)/ java.time.ZoneId (java 8),由 LocaleContextResolver 解析得到 org.springframework.http.HttpMethod 。可以拿到HTTP请求方法 包装了当前被认证用户信息的 java.security.Principal 带 @PathVariable 标注的方法参数,其存放了URI模板变量中的值。 带 @RequestParam 标注的方法参数,其存放了Servlet请求中所指定的参数。参数的值会被转换成方法参数所声明的类型。 带 @RequestHeader 标注的方法参数,其存放了Servlet请求中所指定的HTTP请求头的值。参数的值会被转换成方法参数所声明的类型。 带 @RequestBody 标注的参数,提供了对HTTP请求体的存取。参数的值通过 HttpMessageConverter 被转换成方法参数所声明的类型。 带 @RequestPart 标注的参数,提供了对一个"multipart/form data请求块(request part)内容的存取。 HttpEntity 类型的参数,其提供了对HTTP请求头和请求内容的存取。请求流是通过 HttpMessageConverter 被转换成entity对象的。 java.util.Map / org.springframework.io.Model / org.springframework.ui.ModelMap 类型的参数,用以增强默认暴露给视图层的模型(model)的功能 org.springframework.web.servlet.mvc.support.RedirectAttributes 类型的参数,用以指定重定向下要使用到的属性集以及添加flash属性(暂存在服务端的属性,它们会在下次重定向请求的范围中有效)。 命令或表单对象,它们用于将请求参数直接绑定到bean字段(可能是通过setter方法)。你可以通过 @InitBinder 标注和/或 HanderAdapter 的配置来定制这个过程的类型转换。 RequestMappingHandlerAdapter 类 webBindingInitializer 属性的文档。这样的命令对象,以及其上的验证结果,默认会被添加到模型model中,键名默认是该命令对象类的类名——比如, some.package.OrderAddress 类型的命令对象就使用属性名 orderAddress 类获取。 ModelAttribute 标注可以应用在方法参数上,用以指定该模型所用的属性名 org.springframework.validation.Errors / org.springframework.validation.BindingResult 验证结果对象,用于存储前面的命令或表单对象的验证结果(紧接其前的第一个方法参数)。 org.springframework.web.bind.support.SessionStatus 对象,用以标记当前的表单处理已结束。这将触发一些清理操作: @SessionAttributes 在类级别标注的属性将被移除 org.springframework.web.util.UriComponentsBuilder 构造器对象,用于构造当前请求URL相关的信息,比如主机名、端口号、资源类型(scheme)、上下文路径、servlet映射中的相对部分(literal part)等 BINDINGRESULT的特殊性 在参数列表中, Errors 或 BindingResult 参数必须紧跟在其所绑定的验证对象后面。这是因为,在参数列表中允许有多于一个的模型对象,Spring会为它们创建不同的 BindingResult 实例。因此,下面这样的代码是不能工作的: BindingResult与@ModelAttribute错误的参数次序 @RequestMapping(method = RequestMethod.POST)...

spring-mvcspring

1

点赞

0

回复

516

浏览

Spring MVC @ModelAttribute详解

方法使用@MODELATTRIBUTE标注 @ModelAttribute 标注可被应用在方法或方法参数上。 标注在方法上的 @ModelAttribute 说明方法是用于添加一个或多个属性到model上。这样的方法能接受与 @RequestMapping 标注相同的参数类型,只不过不能直接被映射到具体的请求上。 在同一个控制器中,标注了 @ModelAttribute 的方法实际上会在 @RequestMapping 方法之前被调用。 以下是示例: // Add one attribute...

spring-mvcspring

0

点赞

0

回复

1002

浏览

Spring MVC中映射请求路径:@RequestMapping标注详解

@REQUESTMAPPING的基本用法 可以使用 @RequestMapping 标注来将请求URL,如 /appointments 等,映射到整个类上或某个特定的处理器方法上。一般来说,类级别的标注负责将一个特定(或符合某种模式)的请求路径映射到一个控制器上,同时通过方法级别的标注来细化映射,即根据特定的HTTP请求方法(“GET”和“POST”方法等)、HTTP请求中是否携带特定参数等条件,将请求映射到匹配的方法上。 @Controller...

spring-mvcspring

0

点赞

0

回复

786

浏览

Spring MVC DispatcherServlet详解

SPRING MVC的特点 Spring MVC框架是围绕 DispatcherServlet 来设计的,这个 Servlet 会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染和文件上传等功能。 处理器是应用中注解了 @Controller 和 @RequestMapping 的类和方法,Spring为处理器方法提供了非常多样灵活的配置。 Spring 3.0以后提供了 @Controller 注解机制、 @PathVariable 注解以及一些其他的特性,你可以使用它们来进行RESTful web站点和应用的开发。 Spring MVC具有以下特性: 清晰的职责分离。每个角色——控制器,验证器,命令对象,表单对象,模型对象, DispatcherServlet ,处理器映射,视图解析器,等等许多——的工作,都可以由相应的对象来完成。 强大、直观的框架和应用bean的配置。这种配置能力包括能够从不同的上下文中进行简单的引用,比如在web控制器中引用业务对象、验证器等。 强大的适配能力、非侵入性和灵活性。Spring MVC支持你定义任意的控制器方法签名,在特定的场景下你还可以添加适合的注解(比如 @RequestParam 、 @RequestHeader 、 @PathVariable 等) 可复用的业务代码,使你远离重复代码。你可以使用已有的业务对象作为命令对象或表单对象,而不需让它们去继承一个框架提供的基类。 可定制的数据绑定和验证。类型不匹配仅被认为是应用级别的验证错误,错误值、本地化日期、数字绑定等会被保存。你不需要再在表单对象使用全String字段,然后再手动将它们转换成业务对象。 可定制的处理器映射和视图解析。处理器映射和视图解析策略从简单的基于URL配置,到精细专用的解析策略,Spring全都支持。在这一点上,Spring比一些依赖于特定技术的web框架要更加灵活。 灵活的模型传递。Spring使用一个名称/值对的Map来做模型,这使得模型很容易集成、传递给任何类型的视图技术。 可定制的本地化信息、时区和主题解析。支持用/不用Spring标签库的JSP技术,支持JSTL,支持无需额外配置的Velocity模板,等等。; 一个简单但功能强大的JSP标签库,通常称为Spring标签库,它提供了诸如数据绑定、主题支持等一些特性的支持。这些定制的标签为标记(markup)你的代码提供了最大程度的灵活性。 一个Spring 2.0开始引入的JSP表单标签库。它让你在JSP页面中编写表单简单许多。 新增生命周期仅绑定到当前HTTP请求或HTTP会话的Bean类型。 DISPATCHERSERVLET的工作流程 Spring MVC框架是请求驱动的:所有设计都围绕着一个中央 Servlet 来展开,它负责把所有请求分发到控制器;同时提供其他Web应用开发所需要的功能。 DispatcherServlet 与Spring IoC容器做到了无缝集成,这意味着,Spring提供的任何特性在Spring MVC中你都可以使用。 下图展示了Spring Web MVC的 DispatcherServlet 处理请求的工作流, DispatcherServlet 应用的其实就是一个“前端控制器”的设计模式: 基于 Spring Boot http://www.tianmaying.com/tutorial/spring boot overview ,可以直接使用Spring MVC,除非有非常个性化的要求,相关配置不需要手动配置。 DISPATCHERSERVLET的配置 DispatcherServlet 其实就是个 Servlet (它继承自 HttpServlet 基类),同样也需要在你Web应用的 web.xml 配置文件下声明。你需要在 web.xml 文件中把你希望 DispatcherServlet 处理的请求映射到对应的URL上去。这就是标准的Java EE Servlet配置;下面的代码就展示了对 DispatcherServlet 和路径映射的声明: ...

springspring-mvc

2

点赞

0

回复

1281

浏览

Spring MVC中创建URL路由

设计网站的URL 现代的Web站点都会设计一套拥有明确意义,方便用户记忆的URL,不论是域名还是路径,以天码营为例: http://tianmaying.com/courses http://tianmaying.com/courses 表示网站下所有的课程列表 http://tianmaying.com/course/web development http://tianmaying.com/course/web development 表示当前我们正在学习的这门课程 在HTML和CSS的学习中,我们创建了个人博客网站的基本页面,如果需要将他们放在Internet中让其他人可以访问,就必须为它们设计一套URL,现在假设我们的网站通过 http://localhost:8080/ http://localhost:8080/ 可以访问: http://localhost:8080/ http://localhost:8080/ 是网站首页,同时也应该对应当前的文章列表 http://localhost:8080/posts/create http://localhost:8080/posts/create ,创建新文章页面 http://localhost:8080/posts/{id}/ http://localhost:8080/posts/){id}/ ,显示某一篇文章页面 http://localhost:8080/posts/){id}/edit http://localhost:8080/posts/){id}/edit ,编辑某一篇文章页面 定义URL处理方法 在Spring WebMVC框架中,使用 @RequestMapping 注解可以将URL与处理方法绑定起来,例如: @Controller...

springjavaspring-mvc

7

点赞

16

回复

30848

浏览

基于Spring MVC的 Websocket在线聊天室

每天大家都在使用QQ等即时聊天工具,今天我们就使用Spring框架以及websocket技术在网页端简单的实现一个在线聊天的功能。 关于Spring MVC的知识这里不会详述,请大家参考 Spring MVC实战入门训练 https://course.tianmaying.com/spring mvc 。 添加MAVEN依赖 在线聊天室使需要使用到的技术或者框架包括: maven作为构建工具 spring boot作为后端框架 spring websocket作为即时消息通讯工具 thymeleaf作为模板引擎 angular作为前端框架 因此,我们首先在 pom.xml 中添加上述依赖: ...

javaspring-mvcspringboot

0

点赞

3

回复

3956

浏览

测试Spring MVC应用

Spring的依赖注入使得我们的代码非常容易进行单元测试—— @Controller , @Service , @Entity 等注解标注的类基本都是POJO(plain old Java object),也就是说很少依赖于Spring容器本身的API。我们可以非常容易地使用 JUnit http://junit.org/ 或 TestNG http://testng.org/ 编写测试代码。另一方面,对于三层架构的Spring Web应用(Controller, Service, DAO),使用Mock活Stub方法也能够更好的来测试我们的代码逻辑。例如Service层代码的单元测试中,依赖的DAO(或Repository)对象都是根据应用测试需求Mock出来的,而不需要真正去访问数据库。 SPRING WEB测试 在对Spring Web应用中的 @Controller 代码进行单元测试的过程中,一般的方法是创建 @Controller 对象,同时将它依赖的一些Mock对象——例如 MockHttpServletRequest , MockHttpServletResponse (都由 spring test 模块提供,无需自己编写)作为 @Controller 方法的参数。但是对于处理Web请求的 @Controller 代码来说,仅仅测试Handler方法里的代码是远远不够的,对于一个处理HTTP请求的 @Controller ,我们还需要测试: @RequestMapping 路由是否正确 数据绑定、类型转换、校验逻辑是否正确——数据包括URL参数、表单、 @PathVariable 等 @InitBinder , @ModelAttribute , @ExceptionHandler 等注解的方法或属性计算过程 上述过程贯穿于HTTP请求处理的生命周期中,所以对于Spring Web应用中 @Controller 代码单元测试的概念,应该做一些扩充——不仅仅局限于代码本身,也要结合MVC框架中的各个处理过程。 本文接下来的内容代码,都以Spring Boot为例,首先假设我们通过Spring Boot创建了一个最简单的Web Mvc应用——包含了一个最简单的Conroller,处理 /users/{id} 对应的HTTP请求,返回值是 id={id} (通过 String.format() 方法),那么可以为它创建如下测试代码: import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;...

springspringbootspring-mvcjava

11

点赞

7

回复

13888

浏览

基于Spring的微信第三方登录实现

在前几篇文章中,我们介绍了 OAuth2.0认证和授权机制讲解 http://tianmaying.com/tutorial/oAuth login ,并实现了 基于Spring的Github第三方登录 通用化的第三方登陆实现 http://tianmaying.com/tutorial/OAuth login impl ,之后,我们基于该通用化的框架,介绍了国内的两个比较流行的第三方登录平台: 基于Spring的新浪微博第三方登录实现 http://tianmaying.com/tutorial/OAuth login weibo 和 基于Spring的QQ第三方登录实现 http://tianmaying.com/tutorial/OAuth login QQ 。以上几个第三方登录平台都严格遵守了OAuth2.0协议。但是,近来作者发现微信的第三方登录确不是那么严格的遵守通用化的OAuth2.0协议,有些细节实现不太一样(例如获取AccessToken时其他OAuth平台用的字段名为client_id,但是微信中是appid),这就导致了之前的通用化框架在微信登录时遇到了很多问题,今天我们就来介绍一下微信的第三方登录,并重构一下我们的通用化框架,使之在遇到其他不那么严格遵守OAuth协议的平台依然简单实用。 申请第三方应用 接下来我们首先来看看如何在 微信开放平台 https://open.weixin.qq.com 中申请一个第三方应用。 首先,我们需要完善开发者资质认证,在导航栏选择【账号中心】,然后选择【开发者资质认证】,我们会看到如下页面: 从页面信息介绍中的第二点我们可以知道,通过开发者资质认证后,我们就能够获得微信第三方登录的能力。需要注意:个人是不能申请第三方认证的,必须为以下机构或者团体才能进行认证,每次审核需要花费300元: 开发者资质认证提交并缴费后,会在两个工作日内进行审核,如果有问题会有客服人员电话沟通。 审核完成后,进入【管理中心】 【网站应用】。 点击【创建网站应用】,按照其提示填写相关内容即可: 提交完成后,如果你的开发者资质已经通过,就可以直接进行开发上线啦。现在,让我们看看如何添加微信第三方登录的代码。 第三方登录通用架构 现在,我们将 基于Spring的Github第三方登录 通用化的第三方登陆实现 https://open.weixin.qq.com/cgi bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=78aa41f9fac1f47ca6d3bd20fe9e2ad7681e9e3c&lang=zh_CN 中的通用化架构添加到代码中来,以此为基础添加微信登录的相关功能: 微信第三方登录服务分析 首先,让我们我们看看 微信登录开发文档 https://open.weixin.qq.com/cgi bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=78aa41f9fac1f47ca6d3bd20fe9e2ad7681e9e3c&lang=zh_CN ,看过之后,我们发现微信登录虽然是基于OAuth2.0协议,但是API的参数确不一样。之前我们做过github、微博、QQ其获取Access Token时所需的参数为 client_id 以及 client_secret ,Scribe默认的OAuthService在处理也是同样的参数,因此我们可以通过其默认的 OAuth20ServiceImpl 来处理OAuth的相关操作。 但是微信中 client_id 、 client_secret 两个参数统一用的是: appid 、 secret 。这也就意味着我们需要实现自己的 WeixinOAuth20Service 来对这些细节进行处理。同时,添加完成后,我们还需要添加一个 WeixinOAuthDeractorService 来适配 通用化的第三方登陆实现 https://open.weixin.qq.com/cgi bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=78aa41f9fac1f47ca6d3bd20fe9e2ad7681e9e3c&lang=zh_CN 中的设计。 但是 WeixinOAuth20Service 以及 WeixinOAuthDeractorService 实际上功能是一样的,只是我们需要一个CustomOAuthService来对OAuthService进行管理。如果我们通过一个接口对OAuthService进行管理的话,我们就只需要添加一个类 WeixinOAuthService 即可,同时这也符合依赖于接口而不是实现的最佳原则。 通过接口管理OAUTHSERVICE 我们首先来添加一个接口 CustomOAuthService : publicinterfaceCustomOAuthServiceextendsOAuthService{...

oauthspringjavaspringbootspring-mvc

18

点赞

7

回复

108284

浏览

Spring Boot——开发新一代Spring Java应用

Spring官方网站 http://spring.io 本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系。随着Spring 3.0的发布,Spring IO团队逐渐开始摆脱XML配置文件,并且在开发过程中大量使用“约定优先配置”(convention over configuration)的思想来摆脱Spring框架中各类繁复纷杂的配置(即时是Java Config)。 Spring Boot http://projects.spring.io/spring boot/ 正是在这样的一个背景下被抽象出来的开发框架,它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out of the box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。 Spring Boot的一个比较完整的例子请见 Spring Boot博客系统 https://course.tianmaying.com/spring mvc 。 HELLO WORLD 传统基于Spring的Java Web应用,需要配置 web.xml , applicationContext.xml ,将应用打成war包放入应用服务器(Tomcat, Jetty等)中并运行。如果基于Spring Boot,这一切都将变得简单: 以Maven项目为例,首先引入Spring Boot的开发依赖: ...

spring-mvcspring-bootjava

6

点赞

9

回复

17276

浏览

使用Spring Security进行Spring MVC的权限验证

Spring Security,这是一种基于Spring AOP和Servlet过滤器的安全框架。它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权。在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术。今天我们就来学习一下如何利用Spring security方便的进行权限验证。 添加依赖 首先还是先定义我们所需要的依赖: ...

javaspring-mvc

2

点赞

10

回复

22791

浏览

Spring MVC快速入门教程

今天给大家介绍一下Spring MVC,让我们学习一下如何利用Spring MVC快速的搭建一个简单的web应用。 更深入地学习Spring MVC,请大家参考 Spring MVC实战入门训练 https://course.tianmaying.com/spring mvc 。 参考代码请戳右上角,下载下来后可以在Eclipse或者IntelliJ中导入为一个Maven项目。 环境准备 一个称手的文本编辑器(例如Vim、Emacs、Sublime Text)或者IDE(Eclipse、Idea Intellij) Java环境(JDK 1.7或以上版本) Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用IDE并且不使用命令行工具可以不安装) 一个最简单的WEB应用 使用Spring Boot框架可以大大加速Web应用的开发过程,首先在Maven项目依赖中引入 spring boot starter web : pom.xml ...

javaspring-mvcspringboot

4

点赞

3

回复

19889

浏览

整合Spring Data JPA与Spring MVC: 分页和排序

之前我们学习了 如何使用Jpa访问关系型数据库 http://tianmaying.com/tutorial/spring boot jpa 。比较完整Spring MVC和JPA教程请见 Spring Data JPA实战入门 https://course.tianmaying.com/spring data jpa , Spring MVC实战入门 https://course.tianmaying.com/spring mvc 。 通过Jpa大大简化了我们对数据库的开发工作。但是,之前的例子中我们只提到了最简单的CRUD(增删改查)操作。实际上,Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学习如何通过 Pageable 来对数据库进行分页查询。 添加MAVEN依赖 首先我们需要引入Jpa,数据库直接使用 hsqldb 内存数据库就可以了: project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema instance"...

spring-datajavaspringbootspring-mvcspring

新建主题 记录代码

学员动态

  • S**S评论了k**e在课程中的作业:不要修改返回值类型 ...
  • f**o在课程作业中回复了老师:空格键暂停是不是要通...
  • s**8添加了笔记:定义成员变量时,可以...
  • k**e添加了笔记:讲集合的时候,我们说...
  • f**o向课程作业中提交了代码
  • w**3评论了2**b在课程中的作业:对的 就像高中数学的...
  • w**3评论了2**b在课程中的作业:在每个数字后面加上d...
  • k**e在课程作业中回复了老师:com.tianma...
  • 喵**咪在课程中提出了问题:这个括号里面的内容是...
  • k**e添加了笔记:如果一个类的方法或者...
  • e**1向课程作业中提交了代码
  • k**e添加了笔记:反射是一种动态获取信...
  • S**S评论了f**o在课程中的作业:这里的if语句也可以...
  • 天**君评论了2**b在课程中的作业:我建议你再看看教程,...
  • 1**9在课程作业中回复了老师:。。。老师我的功能实...
  • w**3评论了2**b在课程中的作业:精度不对,你先让 a...
  • 蓝**社向课程作业中提交了代码
  • t**1向课程作业中提交了代码
  • k**e添加了笔记:一个方法被覆盖时,覆...
  • s**u向课程作业中提交了代码
  • c**8向课程作业中提交了代码
  • k**e在课程中提出了问题:package co...
  • k**e向课程作业中提交了代码
  • v**l在课程中提出了问题:心疼认真看《如何开始...
  • 1**7添加了笔记:类使用impleme...
  • 2**b在课程作业中回复了老师:还是显示错误,老师您...
  • 天**君回复了T**r在课程中的问题:欢迎来到天码营学习,...
  • S**r添加了笔记:一个浮点数字面量默认...
  • k**e添加了笔记:final变量的所有...
  • 天**君回复了v**l在课程中的问题:后面的项目课程会用到...
  • 天**君回复了v**l在课程中的问题:克隆什么仓库? gi...
  • k**e向课程作业中提交了代码
  • s**u向课程作业中提交了代码
  • S**S回复了c**8在课程中的问题:我的QQ是54905...
  • w**3评论了2**b在课程中的作业:花括号前面不用分...
  • S**S回复了c**3在课程中的问题:多看几遍教程中的强制...
  • k**e向课程作业中提交了代码
  • k**e向课程作业中提交了代码
  • 天**君评论了f**o在课程中的作业:也可以用天码营的前端...
  • c**3在课程中提出了问题:老师,不修改给出的那...
  • 天**君回复了1**9在课程中的问题:欢迎来到天码营学习,...
  • S**S评论了y**n在课程中的作业:for循环输出所有 ...
  • z**7评论了:类名.属性的方式访问...
  • w**7在课程中提出了问题:package co...
  • s**k向课程作业中提交了代码
  • c**3向课程作业中提交了代码
  • s**k向课程作业中提交了代码
  • w**3回复了w**7在课程中的问题:read() : 从...
  • S**r添加了笔记:Java声明变量的时...
  • S**S评论了f**o在课程中的作业:这里不用做判断...
  • t**1向课程作业中提交了代码
  • 2**b在课程作业中回复了老师:老师,系统出错了吗。...
  • k**e向课程作业中提交了代码
  • S**S评论了f**o在课程中的作业:你只需要 满足 作业...
  • S**r添加了笔记:用包package来...
  • S**r添加了笔记:先声明对象名称,空格...
  • z**6向课程作业中提交了代码
  • 2**b在课程作业中回复了老师:噢噢噢噢噢噢噢噢,我...
  • 2**b在课程中提出了问题:Integer in...
  • k**e添加了笔记:使用final修饰方...
  • c**8向课程作业中提交了代码
  • w**7在课程中提出了问题:在程序的20行,用c...
  • 喵**咪添加了笔记:所有的标识符都应该以...
  • S**S评论了w**7在课程中的作业:对象需要实例化 才能...
  • w**7在课程中提出了问题:length是什么方...
  • k**e向课程作业中提交了代码
  • c**8在课程中提出了问题:实战任务的参考代码怎...
  • c**8向课程作业中提交了代码
  • s**k向课程作业中提交了代码
  • 1**2评论了:...
  • c**8在课程中提出了问题:UP.directi...
  • 2**b在课程作业中回复了老师:老师,还是报错。。您...
  • c**8在课程中提出了问题:我点Java Web...
  • y**n在课程中提出了问题:请您再看一下我的显示...
  • f**o在课程作业中回复了老师:如何开启下一节课的作...
  • 2**b在课程作业中回复了老师:我写的是Math.s...
  • 2**b向课程作业中提交了代码
  • t**1向课程作业中提交了代码
  • S**S评论了f**o在课程中的作业:if(grid.ne...
  • c**8在课程中提出了问题:买了Java Web...
  • 天**君回复了1**8在课程中的问题:欢迎来到天码营学习,...
  • 1**9在课程作业中回复了老师:感谢老...
  • t**1向课程作业中提交了代码
  • 天**君回复了2**b在课程中的问题:欢迎来到天码营学习,...
  • v**l在课程中提出了问题:好哒 应该是到时候会...
  • 2**b在课程作业中回复了老师
  • k**e在课程中提出了问题:temp 不能这么声...
  • 2**b添加了笔记:if (str.eq...
  • y**n向课程作业中提交了代码
  • 天**君回复了v**l在课程中的问题:Java基础课程不需...
  • 喵**咪添加了笔记
  • w**3评论了k**e在课程中的作业:StringBuil...
  • h**i向课程作业中提交了代码
  • 天**君回复了c**8在课程中的问题:directionC...
  • S**S回复了喵**咪在课程中的问题:这里是个简单的事例。...
  • 喵**咪添加了笔记:单行注释:在注释内容...
  • k**e向课程作业中提交了代码
  • c**8向课程作业中提交了代码
  • f**o向课程作业中提交了代码
  • z**6向课程作业中提交了代码
反馈意见