[Spring入门学习笔记][创建网站URL]
设计网站的URL
现代的Web站点都会设计一套拥有明确意义,方便用户记忆的URL,不论是域名还是路径,以天码营为例:
- http://tianmaying.com/courses表示网站下所有的课程列表
- http://tianmaying.com/course/web-development表示当前我们正在学习的这门课程
在HTML和CSS的学习中,我们创建了个人博客网站的基本页面,如果需要将他们放在Internet中让其他人可以访问,就必须为它们设计一套URL,现在假设我们的网站通过http://localhost:8080/可以访问:
- http://localhost:8080/是网站首页,同时也应该对应当前的文章列表
- http://localhost:8080/posts/create,创建新文章页面
- http://localhost:8080/posts/{id}/,显示某一篇文章页面
- http://localhost:8080/posts/{id}/edit,编辑某一篇文章页面
定义URL处理方法
在Spring WebMVC框架中,使用@RequestMapping
注解可以将URL与处理方法绑定起来,例如:
@Controller
public class IndexController { @RequestMapping("/")
@ResponseBody
public String index() {
return "index";
} @RequestMapping("/hello")
@ResponseBody
public String hello() {
return "hello";
}
}
IndexController
类中的两个方法都被@RequestMapping
注解,当应用程序运行后,在浏览器中访问http://localhost:8080/
,请求会被Spring MVC框架分发到index()
方法进行处理。同理,http://localhost:8080/hello
会交给hello()
方法进行处理。
@ResponseBody
注解表示处理函数直接将函数的返回值传回到浏览器端显示。同时,不要忘记给IndexController
类加上@Controller
注解。
@RequestMapping
注解同样可以加在类上:
@Controller
@RequestMapping("/posts")
public class AppController { @RequestMapping("/create")
public String create() {
return "mapping url is /posts/create";
}
}
create()
绑定的URL路径是/posts/create。
URL变量
在Web应用中URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL: http://weibo.com/user1
,http://weibo.com/user2
。我们不可能对于每一个用户都编写一个被@RequestMapping
注解的方法来处理其请求,Spring MVC提供了一套机制来处理这种情况:
@RequestMapping("/users/{username}")
public String userProfile(@PathVariable("username") String username) {
return String.format("user %s", username);
} @RequestMapping("/posts/{id}")
public String post(@PathVariable("id") int id) {
return String.format("post %d", id);
}
在上述例子中,URL中的变量可以用{variableName}
来表示,同时在方法的参数中加上@PathVariable("variableName")
,那么当请求被转发给该方法处理时,对应的URL中的变量会被自动赋值给被@PathVariable
注解的参数(能够自动根据参数类型赋值,例如上例中的int)。
返回HTML
在之前所有的@RequestMapping
注解的方法中,返回值字符串都被直接传送到浏览器端并显示给用户。但是为了能够呈现更加丰富、美观的页面,我们需要将HTML代码返回给浏览器,浏览器再进行页面的渲染、显示。 一种很直观的方法是在处理请求的方法中,直接返回HTML代码:
@RequestMapping("/posts/{id}")
public String post(@PathVariable("id") int id) {
return "<html><head><title>Title</title></head><body><h2>This is a Post</h2><p>This is content of the post."</p></body></html>;
}
显然,这样做的问题在于——一个复杂的页面HTML代码往往也非常复杂,并且嵌入在Java代码中十分不利于维护。
更好的做法是将页面的HTML代码写在模板文件中,然后读取该文件并返回。Spring天然支持这种非常常见的场景,需要先在pom.xml引入Thymeleaf依赖(接下来的学习中会重点讲到):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
将HTML文本保存在src/main/resources/templates/post.html
下:
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>This is title</h1>
<p> This is Content</h2>
</body>
</html
Controller
中可以去掉@ResponseBody
注解,并将URL处理函数的返回值设为刚刚保存在templates/
文件夹中的文件名(不需要扩展名):
@RequestMapping("/posts/{id}")
public String post(@PathVariable("id") int id) {
return "post";
}
Spring框架在发现返回值是"post"
后,就会去src/main/resources/templates/
目录下读取post.html文件并将它的内容返回给浏览器。
[Spring入门学习笔记][创建网站URL]的更多相关文章
- [Spring入门学习笔记][静态资源]
遗留问题 在上一节课的作业中,我们一定遇到了一点问题——虽然将页面内容正确的返回给了浏览器,但是浏览器显示的样式却是不正确的,这是因为在HTML的\标签中我们这样引入了CSS资源: <link ...
- [spring入门学习笔记][spring的IoC原理]
什么叫IoC 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...
- Spring入门学习笔记(4)——JDBC的使用
目录 Spring JDBC框架概览 JdbcTemplate类 配置数据源 数据访问对象(Data Access Object,DAO) 执行SQL命令 Spring JDBC框架概览 使用传统的J ...
- [Spring入门学习笔记][Spring的AOP原理]
AOP是什么? 面向切面编程 软件工程有一个基本原则叫做“关注点分离”(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题.这年头互联网也 ...
- [Spring入门学习笔记][Spring Boot]
什么是Spring Boot Spring Boot正是在这样的一个背景下被抽象出来的开发框架,它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架 ...
- Spring入门学习笔记(2)——基于Java的配置
目录 基于Java的配置 @Configuration & @Bean Annotations Example 注入Bean依赖 @Import注解 Lifecycle Callbacks(声 ...
- Spring入门学习笔记(1)
目录 Spring好处 依赖注入 面向面编程(AOP) Spring Framework Core Container Web Miscellaneous 编写第一个程序 IoC容器 Spring B ...
- Spring入门学习笔记(3)——事件处理类
目录 Spring中的事件处理 Spring内建事件 监听Context事件 Example 自定义Spring事件 Spring中的事件处理 ApplicationContext 是Spring的核 ...
- [Spring入门学习笔记][maven]
什么是maven? 我的理解: 一个项目有一大堆依赖包的时候,没必要下下来,可以利用maven中的pom.xml 指定需要那些依赖包,让maven去本地中央库(如果没找到)->网上仓库库帮你调用 ...
随机推荐
- 中控考勤机-C#操作
引用:Interop.zkemkeeper.dll 实例化: public zkemkeeper.CZKEM axCZKEM1 = new zkemkeeper.CZKEM(); 首先从数据库中获取考 ...
- C# byte[]与char[]、string与char[]、byte[] 与 string 互转
1. byte array -> char array Byte[] b=new byte[5]{0x01,0x02,0x03,0x04,0x05}; Char[] c=Encoding.AS ...
- KindEditor放在包含模版页的页面里不显示解决方案
由于用了母版页,内容页服务器控件(是服务器控件哦)的id会被重写,我这里运行中查看源代码,控件的id变成了“ContentPlaceHolder1_content1”. <asp:TextBox ...
- iOS — Autolayout之Masonry解读
前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...
- hdu EXCEL排序
Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<= ...
- Hibernate学习笔记(一):mycelipse建立项目流程(未完成)
1.部署数据库: 2.部署项目: 3.引入Hibernate: 4.url配置
- Scala学习文档-各种使用模式的情况
模式在变量定义中 在定义val或者var的时候,可以使用模式替代简单的标识符,如可以使用模式拆分元组,并把每个值分配给变量 val myTuple = (123,"abc") va ...
- C语言解析日志,存储数据到伯克利DB
编译命令 gcc -o dbwriter dbwriter.c -ldb dbwriter.c #include <assert.h> #include <stdlib.h> ...
- 微软在MSDN中更新了Win8.1批量授权版镜像(中文版更新完毕&版本说明)
微软在MSDN中更新了Win8.1大客户专业版和企业版镜像,零售版镜像(即专业版+核心版二合一镜像)没有更新,依然是9月份发布的版本.已证实,新的批量授权版镜像是集成了GA Rollup A更新,并且 ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅳ
2.4.4 堆的算法 我们用长度为 N + 1的私有数组pq[]来表示一个大小为N的堆,我们不会使用pq[0],堆元素放在pq[1]至pq[N]中.在排序算法中,我们只能通过私有辅助函数less()和 ...