打造功能完整的博客系统:Spring MVC实战入门

By David 课程任务:14 个 学习人数: 100+

Spring MVC实战入门训练,以一个博客系统为例,将Spring MVC的核心知识融入到实战当中,让你真正掌握基于Spring MVC开发实战项目的能力。请参考天码营学员的成长和作品

超级名师

导师来自北京大学计算机专业的老师和业界一流的工程师,帮助你快速成长

求职必备

导师们最大的烦恼就是每天各路公司求他们推荐程序员,帮帮他们吧,快到碗里来

实战导向

图文、代码与视频有机结合的实战课程内容,打造真实的项目,最佳实践一网打尽

专业工具

随时随地学习在线学习,记录完整的学习过程与轨迹,沉淀终生受益的代码和内容

David

北大教师,曾创办OSGi中文社区和软件开发协工具onboard

Ricky

天码营技术总监,全栈程序员, DevOps,超级工具控

Harttle

北大物理系出身的Linux极客,追求极致简单,武术发烧友

Cliff

传说中的快刀手,北大计算机应用与设计协会前理事长

Michael

Google工程师,北大信息科学技术学院本硕

Bob

Facebook工程师,北大信息科学技术学院本硕

Hash

北大数字艺术专业毕业,十年设计经历,极限运动爱好者

Li

任职于Twitter、Airbnb,德州扑克世界赌王大赛冠军

登录发表评论 登录 注册

Toder
Toder 于 19 天前

文本教程是一样的,区别在于提供覆盖核心知识点的代码任务、参考代码以及专业的代码答疑指导。

请问¥149付费的和这个文本教程有区别吗?

@chrdwh

chrdwh
chrdwh 于 20 天前

请问¥149付费的和这个文本教程有区别吗?

frankie
frankie 于 2 个月前

我这个已经实现了分页的功能为什么提交上去后一直报错呢?

frankie
frankie 于 2 个月前

如何渲染页面把整个文章列表显示出来?

frankie
frankie 于 2 个月前

1个测试已通过,1个测试未通过(共花费2117ms)

  • 成功获取用户的博客列表

第三章的代码这个错误怎么解决?

dh98224
dh98224 于 2 个月前

a7.png



第十课的这个要求。前端html的action该怎么写?

<form th:action="@{/comments}" method='post' >

如果写成这样的话,只会跳转到......./comments.

而不是......./blogs/id/comments.

<form th:action="@{comments}" method='post' >

如果写成这样的话,就只能跳转到..../blogs/comments

David
David 于 2 个月前

把tianmaying拖进com里头就行

席暖
席暖 于 3 个月前

只能建立两个平行的包结构,不能建立子包。

问题是什么?

Clipboard Image.png

.

├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └── com
│   │           └── tianmaying
│   │               └── TblogApplication.java
为什么没办法在包里建立子包,建完都是平行的了。
我已经设置hierarchical了,为什么还是不行呢

@席暖

@David

David
David 于 3 个月前

问题是什么?

Clipboard Image.png

.

├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └── com
│   │           └── tianmaying
│   │               └── TblogApplication.java
为什么没办法在包里建立子包,建完都是平行的了。
我已经设置hierarchical了,为什么还是不行呢

@席暖

席暖
席暖 于 3 个月前

Clipboard Image.png

.

├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └── com
│   │           └── tianmaying
│   │               └── TblogApplication.java
为什么没办法在包里建立子包,建完都是平行的了。
我已经设置hierarchical了,为什么还是不行呢
camel117
camel117 于 3 个月前

终于完成了第一个课程,学习到了很多知识点。
现在报了整个课程,继续学习中,谢谢www.tianmaying.com的老师们smiley

Toder
Toder 于 5 个月前

现在应该OK拉~

Byboy_cn
Byboy_cn 于 5 个月前

router.zip下载超时,无法下载作业中的图片,怎么办

?

chrrscc
chrrscc 于 5 个月前

没有~可能是其它兼容性问题吧

你是不是禁用了cookie,或者使用无痕浏览之类功能。

还是会的

点击一下我知道了,就不会弹了

我发现一个问题哦,每次进入课程首页都会弹这个框,提示个一两次就可以吧grin

Clipboard Image.png

@chrrscc

@Toder

@chrrscc

@Toder

Toder
Toder 于 5 个月前

你是不是禁用了cookie,或者使用无痕浏览之类功能。

还是会的

点击一下我知道了,就不会弹了

我发现一个问题哦,每次进入课程首页都会弹这个框,提示个一两次就可以吧grin

Clipboard Image.png

@chrrscc

@Toder

@chrrscc

chrrscc
chrrscc 于 5 个月前

还是会的

点击一下我知道了,就不会弹了

我发现一个问题哦,每次进入课程首页都会弹这个框,提示个一两次就可以吧grin

Clipboard Image.png

@chrrscc

@Toder

Toder
Toder 于 5 个月前

点击一下我知道了,就不会弹了

我发现一个问题哦,每次进入课程首页都会弹这个框,提示个一两次就可以吧grin

Clipboard Image.png

@chrrscc

chrrscc
chrrscc 于 5 个月前

我发现一个问题哦,每次进入课程首页都会弹这个框,提示个一两次就可以吧grin

Clipboard Image.png

Toder
Toder 于 5 个月前

教程有点问题,按照Eclipse的提示来grin

但是教程里的示例好像不需要导入这个包哦

使用了@Controller标注,自然需要导入哪 @chrrscc 

@Toder

@chrrscc

chrrscc
chrrscc 于 5 个月前

但是教程里的示例好像不需要导入这个包哦

使用了@Controller标注,自然需要导入哪 @chrrscc 

@Toder

Toder
Toder 于 5 个月前

使用了@Controller标注,自然需要导入哪 @chrrscc 

chrrscc
chrrscc 于 5 个月前

我运行程序时出现了一个问题,只有额外导入下图所示controller包时@Controller才不会报错,请问这是怎么回事啊?1..jpg

Toder
Toder 于 5 个月前

对的,应该是index

这里的greeting应该是index吧?

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello";
    }

@afu1982

afu1982
afu1982 于 5 个月前

这里的greeting应该是index吧?

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello";
    }
Toder
Toder 于 5 个月前

设置正确的模板路径和名称,就能返回模板的HTML内容。

不能返回HTML的内容啊

@malachi9999

malachi9999
malachi9999 于 5 个月前

不能返回HTML的内容啊

runMark
runMark 于 6 个月前

第11课的作业我本地都能执行成功,为什么提交了还是有问题呢?能帮我看下吗?

Toder
Toder 于 6 个月前

说的对,改过来了!

本课作业中的提示说「更新博客页面和新建博客页面可以共用同一个模板item.html」,这个地方应该是 create.html 吧?

@runMark

runMark
runMark 于 6 个月前

本课作业中的提示说「更新博客页面和新建博客页面可以共用同一个模板item.html」,这个地方应该是 create.html 吧?

David
David 于 6 个月前

一种是Post/Redirect/GET的模式,另一种是在当前这个Controller渲染页面,一般这种情况是做redirect,你没必要在当前Controller再做一遍重复的事情。

第7课 返回博客创建页面 中,最后为什么 return "redirect:/blogs/" + blog.getId();  而不是直接  return "/blogs/" + blog.getId();  ,这样业务逻辑上不是一样的吗?为什么非得要进行 redirect ?

@runMark

runMark
runMark 于 6 个月前

第7课 返回博客创建页面 中,最后为什么 return "redirect:/blogs/" + blog.getId();  而不是直接  return "/blogs/" + blog.getId();  ,这样业务逻辑上不是一样的吗?为什么非得要进行 redirect ?

Kiyonami
Kiyonami 于 6 个月前

有问题:

第7课时的作业 : 登录失败同样应该给出提示——参考用户注册部分

但是用户注册部分并不是动态生成的呀.........expressionless

不能根据实际情况弹出提示..@Toder 

Toder
Toder 于 6 个月前

欢迎欢迎grin

哈哈 刚刚买了教程试试水 希望最后真的能写出一个博客玩 @David老师  请多关照grin

@Kiyonami

Kiyonami
Kiyonami 于 6 个月前

哈哈 刚刚买了教程试试水 希望最后真的能写出一个博客玩 @David老师  请多关照grin

Toder
Toder 于 6 个月前

应该是URL地址不对,或者@ResponseBody用的有误。

第7课 返回博客创建页面

com.gargoylesoftware.htmlunit.TextPage cannot be cast to com.gargoylesoftware.htmlunit.html.HtmlPage

这是什么情况?

@jy

jy
jy 于 6 个月前

第7课 返回博客创建页面

com.gargoylesoftware.htmlunit.TextPage cannot be cast to com.gargoylesoftware.htmlunit.html.HtmlPage

这是什么情况?

David
David 于 6 个月前

可快可慢,永久有效。

付费之后必须要等14天才能学完吗?还是说看个人进度可快可慢?

@runMark

runMark
runMark 于 6 个月前

付费之后必须要等14天才能学完吗?还是说看个人进度可快可慢?

zwh8800
zwh8800 于 6 个月前

文中有个小错误: `%E4%B8%AD%E5%9B%BD` 并不是 base64 编码,而是 urlencoded 编码

Toder
Toder 于 6 个月前

@Byboy_cn 这要看代码具体分析了

Byboy_cn
Byboy_cn 于 6 个月前

Controller中可以去掉@ResponseBody标注

这个东西已经去掉了,但是还是显示文本呀...

修改了一下,你再看看。

您好~Controller中可以去掉@ResponseBody标注,并将URL处理函数的返回值设为刚刚保存在templates/文件夹中的文件名(不需要扩展名):这句话是什么意思呢?我访问/blogs 返回的只是文本形式的blog

@Byboy_cn

@Toder

Toder
Toder 于 6 个月前

修改了一下,你再看看。

您好~Controller中可以去掉@ResponseBody标注,并将URL处理函数的返回值设为刚刚保存在templates/文件夹中的文件名(不需要扩展名):这句话是什么意思呢?我访问/blogs 返回的只是文本形式的blog

@Byboy_cn

Byboy_cn
Byboy_cn 于 6 个月前

您好~Controller中可以去掉@ResponseBody标注,并将URL处理函数的返回值设为刚刚保存在templates/文件夹中的文件名(不需要扩展名):这句话是什么意思呢?我访问/blogs 返回的只是文本形式的blog

marswing
marswing 于 6 个月前

老师你好,课程三中,实战任务.有这么一段

使用@ResponseBody标注,Spring会将List<Blog>对象JSON序列化后的字符串返回浏览器并显示.意思是说直接return List集合吗


你styles.css放的路径是?

我试了,<link rel="stylesheet" href="/css/style.css">访问不了.

@marswing 默认情况下,Spring Boot会将类路径上的/static/目录的内容Serve起来,意思就是对静态资源的请求,都会返回/static/目录中对应路径的文件内容,在/static/目录中的文件,可以通过类似http://localhost:8080/css/style.css这样的方式来访问它们使得我们的页面正确显示。

@Toder

@marswing

@Toder

Toder
Toder 于 6 个月前

你styles.css放的路径是?

我试了,<link rel="stylesheet" href="/css/style.css">访问不了.

@marswing 默认情况下,Spring Boot会将类路径上的/static/目录的内容Serve起来,意思就是对静态资源的请求,都会返回/static/目录中对应路径的文件内容,在/static/目录中的文件,可以通过类似http://localhost:8080/css/style.css这样的方式来访问它们使得我们的页面正确显示。

@Toder

@marswing

marswing
marswing 于 6 个月前

我试了,<link rel="stylesheet" href="/css/style.css">访问不了.

@marswing 默认情况下,Spring Boot会将类路径上的/static/目录的内容Serve起来,意思就是对静态资源的请求,都会返回/static/目录中对应路径的文件内容,在/static/目录中的文件,可以通过类似http://localhost:8080/css/style.css这样的方式来访问它们使得我们的页面正确显示。

@Toder

Toder
Toder 于 6 个月前

@marswing 默认情况下,Spring Boot会将类路径上的/static/目录的内容Serve起来,意思就是对静态资源的请求,都会返回/static/目录中对应路径的文件内容,在/static/目录中的文件,可以通过类似http://localhost:8080/css/style.css这样的方式来访问它们使得我们的页面正确显示。

marswing
marswing 于 6 个月前

老师你好,静态资源这块我看了很久,也在网上查了资料,感觉没有错,但就是访问不了

我导入包GetMapping了,就解决了。

不好意思这两天没有上网,你问题解决了没

我也遇到了同样的问题。

导入的包

import org.springframework.web.bind.annotation.GetMapping;

我的以@GetMapping的方式进行注解,无法识别。请问是需要引用jar包吗

@marswing

@amwangke

@marswing

@amwangke

amwangke
amwangke 于 7 个月前

@David 登录页面,进入后,使用userService(email,password)返回的user为什么是空?

下面是登录页面

@Controller
@RequestMapping("/login")
public class LoginController {

@Autowired
UserService userService;

@GetMapping
String login() {
return "login";
}

@PostMapping
String post(@RequestParam("email") String email, @RequestParam("password") String password, Model model) {

User user = userService.login(email, password);

if (user != null) {
return "redirect:/" + user.getName();
}
else {
model.addAttribute("user", user);
return "redirect:/login";
}
}
}

这里是注册页面

@Controller
@RequestMapping("/register")
public class RegisterController {



private final UserService userService;

private final BlogService blogService;

@Autowired
public RegisterController(UserService userService, BlogService blogService) {
this.userService = userService;
this.blogService = blogService;
}


@GetMapping
public String get() {

return "register";
}

@PostMapping
public String post(@RequestParam("username")String username,
@RequestParam("email")String email,
@RequestParam("password")String password) {



User user = new User(username,password,email);
user=userService.register(user);


Blog blog = new Blog("title1", "content1", user);
blogService.createBlog(blog);


return "redirect:/"+username;


}
}
David
David 于 7 个月前

因为Servlet的API就是通过input的name来获取参数的,不是id

@David @天码营 register.html中的form如下:

<input type="text" name="username" class="form-control" placeholder="用户名" required="" autofocus="">

为什么 form中 name=“username”, name换成id,则spring boot 无法识别RequestParam(“username”)?

@PostMapping
public String post(@RequestParam("username")String username,
@RequestParam("email")String email,
@RequestParam("password")String password) {


ps:我后来换成name就可以了。

@amwangke

amwangke
amwangke 于 7 个月前

@David @天码营 register.html中的form如下:

<input type="text" name="username" class="form-control" placeholder="用户名" required="" autofocus="">

为什么 form中 name=“username”, name换成id,则spring boot 无法识别RequestParam(“username”)?

@PostMapping
public String post(@RequestParam("username")String username,
@RequestParam("email")String email,
@RequestParam("password")String password) {


ps:我后来换成name就可以了。

amwangke
amwangke 于 7 个月前

我导入包GetMapping了,就解决了。

不好意思这两天没有上网,你问题解决了没

我也遇到了同样的问题。

导入的包

import org.springframework.web.bind.annotation.GetMapping;

我的以@GetMapping的方式进行注解,无法识别。请问是需要引用jar包吗

@marswing

@amwangke

@marswing

marswing
marswing 于 7 个月前

不好意思这两天没有上网,你问题解决了没

我也遇到了同样的问题。

导入的包

import org.springframework.web.bind.annotation.GetMapping;

我的以@GetMapping的方式进行注解,无法识别。请问是需要引用jar包吗

@marswing

@amwangke

amwangke
amwangke 于 7 个月前

分页获取用户的博客列表

fromIndex = -5

这个是什么问题呢?

原来要设置page和size都大于0才行。

Toder
Toder 于 7 个月前

@marswing @amwangke 你们看看是不是依赖的Spring版本不对。

Toder
Toder 于 7 个月前

这里@Controller也没有问题,注意有一个@ResponseBody标注。


@SpringBootApplication
@Controller//这里应该是@RestController
public class TblogApplication

@amwangke

amwangke
amwangke 于 7 个月前

我也遇到了同样的问题。

导入的包

import org.springframework.web.bind.annotation.GetMapping;

我的以@GetMapping的方式进行注解,无法识别。请问是需要引用jar包吗

@marswing

amwangke
amwangke 于 7 个月前
@SpringBootApplication
@Controller//这里应该是@RestController
public class TblogApplication 
marswing
marswing 于 7 个月前

我的以@GetMapping的方式进行注解,无法识别。请问是需要引用jar包吗

Toder
Toder 于 7 个月前

永久能看。

购买了后,14天后就不能看了吗

@hust1994

hust1994
hust1994 于 7 个月前

购买了后,14天后就不能看了吗

Toder
Toder 于 7 个月前

已解决

老师 您好 由于我昨晚没有激活邮箱,但是我付款了 现在我的账号里没有课程。能给我解决一下吗、?

@1182715087

1182715087
1182715087 于 7 个月前

老师 您好 由于我昨晚没有激活邮箱,但是我付款了 现在我的账号里没有课程。能给我解决一下吗、?

David
David 于 7 个月前

是的默认情况下,以下四个文件夹内的文件都是静态资源。

  • /META-INF/resources/
  • /resources/
  • /static/
  • /public/

如果希望自己配置,那就在自定义的WebMvcConfigurerAdapter类中进行配置:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (!registry.hasMappingForPattern("/your_pattern/**")) {
        registry.addResourceHandler("/your_pattern/**").addResourceLocations(
                "classpath:/your_location/");
    }
}

resources 和 static 文件夹等于是框架约定的了?

可以通过配置修改么?

@chn126943

chn126943
chn126943 于 7 个月前

resources 和 static 文件夹等于是框架约定的了?

可以通过配置修改么?

Toder
Toder 于 8 个月前

Spring Boot的配置文件通常在/resources根目录下,以application.properties命名,没有这个这个文件则创建一个。

看到了~

spring.thymeleaf.mode=LEGACYHTML5

添加在哪里 哦

@岑凯伦_走遍世界

岑凯伦_走遍世界
岑凯伦_走遍世界 于 8 个月前

看到了~

spring.thymeleaf.mode=LEGACYHTML5

添加在哪里 哦

cser
cser 于 8 个月前

正在冲关。就是看课程内容,然后做实战任务,任务布置得非常详细,闯关非常有赶脚啊~~在线IDE也很酷,可以在线编程,最酷的是可以直接部署看效果,秀给同学看,哈哈。

请问这类课程是付费后立即开始吗?还是会有统一的开始时间?


另外请问如何查看每种课程的开始时间?

@Jonathan

David
David 于 8 个月前

付费后立即开始,闯关训练

请问这类课程是付费后立即开始吗?还是会有统一的开始时间?


另外请问如何查看每种课程的开始时间?

@Jonathan

Jonathan
Jonathan 于 8 个月前

请问这类课程是付费后立即开始吗?还是会有统一的开始时间?


另外请问如何查看每种课程的开始时间?

Toder
Toder 于 8 个月前

现在还没有开设直播课,付费的服务包括:

  • 精心设计的参考代码
  • 锻炼实战能力的闯关实战任务
  • 一流导师24小时内答疑解惑
  • 强大的在线编程环境
  • 自动化的专业技能测试和评估

付费之后是在线直播课吗?

@weixiny

weixiny
weixiny 于 8 个月前

付费之后是在线直播课吗?

weixiny
weixiny 于 8 个月前

这个课程的内容很赞呐!

咨询老师