application.properties存储着Spring Boot应用运行后可以读取的配置
以#号开始的行是注释
每一行的形式为:属性名=属性值
表示同一组属性,则需要采用点分的形式
version=3.14
student.name=tom
student.password=abc
Envirroment类——负责读配置文件
Public String getProperty(String propertyName)
@Autowired
功能:在适当的时候创建或复用对象并初始化env,以便提高性能。
在Spring中称为控制反转(Inversion of Control,IoC)或依赖注入(Dependency Injection)
@Autowired
private Environment env;
@Value
功能:注解一个String类型的域,Spring自动初始化该域为配置文件中的某个属性值。
相当于@Autowire注解Enviroment类型域后,又调用了getProperty()方法的简写形式
@Value(“${属性名}”)
private String a;
@ConfigurationProperties
功能:将配置文件的一组属性映射到一个类的各域
@Component
//属性prefix:令配置文件中以student为前缀的属性映射到类Student
@ConfigurationProperties(prefix = "student")
public class Student {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password= password;
}
}
@Component
要进行依赖注入的类,必须用@Component注解。
意思是让Spring来管理Student对象的生命期,这样类才能用作依赖注入。
Enviroment类的提供者已经把它注解成@Component了。
能够用@Component注解的类,要交给SpringBoot管理,因此它必然要遵从一些规范:
各域私有,每各域要有setter、getter方法。
获取表单信息
在控制器中,用@RequestMapping注解的方法,默认情况下不加区分地处理GET与POST请求,要获得GET或POST方法传过来的信息,让来自客户端的信息映射到被注解的方法的参数即可。
方法一:
表单组件名映射方法的参数名:
网页中的表单组件都设置name属性
在对应的处理方法中,让方法的参数名称与表单组件的name属性值一致即可
使用@RestController注解的控制器类,实际使用时一般返回JSON格式的字符串
@RequestParam(“表单组件名”)
使用@RequestParam(“表单组件名”)来注解参数,这样参数就可以自由命名了
方法二:
方法参数类型为自定义类:
自定义类的各字段名与表单组件名一一对应时
可用这个类声明@RequestMapping注解方法的参数;
这样,Spring调用该方法前,会先创建自定义类的对象
保存表单信息到它的各域,然后传递给该方法;
获取url路径中的信息
@PathVariable——获取url的信息
@RequestMapping注解里,将多个url的可变部分,用一个通配符(花括号里的内容)替代
用@PathVariable注解方法的参数,则该参数就取得了url中的信息。
@RequestMapping("/answer/{page}")
public String getPage(@PathVariable("page") int page){
return ""+ page+"";
}
“会话”(Session):浏览器打开一个网站,浏览其中数个网页,然后关闭浏览器
Spring管理着Session对象
只要让@RequestMapping注解的方法,具有一个HttpSession类型的形参
那么调用方法时,Spring就会把Session对象传过来
public String getId() //返回Session的唯一标识,它是包含在通信双方HTTP请求头中的
//相同ID的请求属于同一会话
public String setAttribute(String name,Object obj) //将属性存到Session中,属性名是name
//属性值为obj,可以为任何Java类型
public Object getAttribute(String name)//取出名称为name的属性值
eg:
@RequestMapping("/page2")
public String getMsg2(HttpSession session){
Integer count=(Integer) session.getAttribute("myCount");
count=(count==null)?1:count+1;
session.setAttribute("myCount", count);
return ""+count;
}
MVC开发模式
Controller:“控制器”的功能限于处理url映射;
Model:“模型”负责数据的处理;
View:“视图”负责生成HTML文档。
基于Servlet的程序,接收来自客户端的HTTP请求,然后调用了MVC的3个模块,返回生成的Web页面给客户端。大部分情况下,Model与View都由Spring产生和管理。控制器Controller令Model取得期望的数值,并从视图模板(还有可变成分的HTML文档)库中选择一个模板,提交给模板引擎,把Model中的数据与模板渲染成最终的Web页面。
Spring 推荐使用模板引擎Thymeleaf
application.properties,增加了Thymleaf的相关配置,其中有一个条目是:spring.thymeleaf.cache=true
将模板渲染的结果缓存,用户访问同一url时,不重复渲染,这适合生产环境
开发环境设为false
@Controller
注解Controller类,返回视图模板
@Controller
public class MyController {
@RequestMapping("/")
public String homePage(){
return "index";//模板文件的扩展名是固定的".html",Spring会自动加上,开发者不能加
}
}
@RequestMapping("/answer")
//Model类是Spring 定义的,生命期由Spring管理
//只要加上这个参数,Spring调用该方法的时候,就会传递一个Model对象过来。
public String getMsg(@RequestParam("yourName") String name,
@RequestParam("Gender") String gender, Model model){
model.addAttribute("myName",name);
model.addAttribute("myGender",gender);
return "answer";
}
}
answer.html
<!DOCTYPE html>
//设置xmlns:th属性值,输入th:text等Thymeleaf的自定义属性时,会有智能提示
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
//th:text:HTML元素的内容取它的属性值
//${...}里面放置的就是来自Model的属性
<p>Name:<span th:text="${myName}"></span></p>
<p>Gender:<span th:text="${myGender}"></span></p>
</body>
</html>