大家不懂得可以留言我,我尽力哈哈哈,这篇博客的所有代码都是延续的上一篇博客:springboot-day01,的代码,也都是继续jar包的maven项目继续开发的,war包的我后面再写.
Web开发_静态资源的访问,这里使用springboot-day01中的代码
静态资源就是指的是我们以前用servlet做web时那些放在webapp下面的什么css啊,静态html啊,js啊,图片啊之类的.
我们创建了一个jar类型和一个war类型的maven项目,这里我们要转换一下思想,就是jar类型的maven项目其实在springboot里也是可以做web开发的,就像我的上一篇博客那样子做的那样: springboot-day01.
springboot默认静态资源位置应该放在classpath(classpath,类路径,也就是src目录)下,
一般我们放在src/resources文件夹/自定义文件夹
下面,且静态资源所在的目录名应该是以下几个:
/static
/public
/resources
/META-INF/resources
例如我们可以在src/main/resources/目录下创建static目录,并且可以在static这个目录下放一个图片
alipay.png
,程序启动后,输入:http://localhost/alipay.png
就会看到图片了.不过要注意哈,放静态资源的文件夹名字,只能是上面那四个当中的一个,你换名字了就找不到了,当你程序运行之后,你会发现
target目录
下的classes目录
下会多一个你的图片文件夹名字命名的文件夹
.如图所示:
web开发_全局异常捕获讲解,延续上一篇博客的代码继续写的
几个有关的注解:
@ExceptionHandler: 表示拦截异常.
@ControllerAdvice: 这是controller的一个辅助注解,最常用的就是将声明了该注解的类作为全局异常处理的切面类,可以指定扫描范围,它约定了几种可行的返回值
- 如果是直接返回model类的话,需要使用
@ResponseBody
进行json转换(就理解为一个toString()方法的作用).使用步骤:
- 先写一个处理全局异常的类,在类中写一个异常处理方法:
/**
* 全局异常处理类
* 用于捕获全局异常,就是他包括的地方处理异常都会跳到这里,就不用在每个出问题的地方都trycatch了
*/
@ControllerAdvice //控制器切面,表示它的切入点是控制器里的方法
public class GlobalExceptionHandler {
/**
* 该方法用于处理出现的异常,当控制器中出现异常以后,就会跳到这里,然后将返回值以json格式输出到页面上
*
*/
@ExceptionHandler({RuntimeException.class, Error.class}) //表示捕获运行时异常和系统异常
@ResponseBody //表示将返回值用json格式输出到页面上
public Map<String, Object> exceptionHandler() {
Map<String, Object> map = new HashMap<>();
map.put("errorCode", "404");
map.put("errorMsg", "路径访问异常");
return map;
}
}
- 这里写完之后,就去启动的控制器APP类中,将这个包也包含在扫描的包里面,即在@ComponentScan中添加一个
springboot.exception
,这样就使得app类启动的时候,会让这个异常处理类也生效,不然虚拟机不知道这个是全局异常类,它不会起到作用
@EnableAutoConfiguration
@ComponentScan(basePackages = {"springboot.controller","springboot.model","springboot.exception"})
public class App {
public static void main(String[] args) {
//启动springboot项目,启动之后,HelloController和UserController都可以运行起来
SpringApplication.run(App.class, args);
}
}
- 我们现在可以在
controller
包下和model
包下任意一个方法中故意写一个异常比如int i= 10/0
,当程序运行到相应的控制器后,页面就会显示{"errorCode":"404", "errorMsg":"路径访问异常"}
这些字样.
渲染web页面
在动态html上springboot依旧可以完美胜任,它提供了多种模板引擎的默认配置支持,主要有以下几种模板引擎:
ThyMeleaf
FreeMarker
Velocity
Groovy
Mustache
注意:
springboot建议使用这些模板引擎,避免使用jsp,如果一定要使用jsp将无法实现springboot的多种属性.
当使用模板引擎中的任何一个,他们的默认配置路径为:
src/main/resources/templates
,当然可以在模板引擎的配置属性中修改这些路径.FreeMarker的使用,这里是在jar包的maven项目下
第一步:在pom.xml中导入FreeMarker的依赖包
<!--导入freemarker的依赖,所有springboot的jar包的groupid都是org.springframework.boot,
即这些jar包所在的包叫org.springframework.boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
第二步,写一个控制器,然后返回一些数据
- 这里需要注意一下
@RestController
和@Controller
的区别用法:
@RestController
是在@Controller
的基础上整合了@ResponseBody
注解的功能,使其可以不声明@ResponseBody
也可以返回json格式,但是@RestController
这个注解多用于写API,也就是给移动客户端提供接口数据的.
@Controller
这个注解多用于写后台,也就是web后台啦哈哈哈,他们是这么说的,我也不晓得嘿嘿,反正功能差不多,用哪个都一样.
@Controller //这里就不要用RestController
@RequestMapping("stu") //访问StudentController的路径为: /student
public class StudentController {
//增加一些数据
@RequestMapping("stuList") //访问这个方法的路径为: /list
public String list(Map<String, Object> map) {
map.put("name", "student");
map.put("age", 18);
List<Student> list = new ArrayList<>();
list.add(new Student("stu1", 99));
list.add(new Student("stu2", 88));
map.put("list", list);
//注意这里的返回值必须和上面的两个地址相同,不然访问不到
return "stu/stuList";//表示调用该方法后,页面会跳转到到src/main/resources/templates/stu下的stuList这个模板页面去
}
}
第三步,写一个ftl文件(先创建html文件再修改后缀为.ftl)获取数据显示
- 这里需要注意,这里有一个
大坑
首先,所有的模板文件都要放在**
src/main/resources/templates
**文件夹下我就不用说了哈.然后,坑的地方来了:,你看上面的控制器的返回值为**“stu/stuList”,那么这里的ftl文件的访问路径就必须为stu文件夹下的stuList.ftl文件,即templates下面必须有一个文件夹名字为返回值中的stu,ftl文件名字必须为stuList.ftl且必须放在stu文件夹下**,不然又会出错,会访问不到.
如果你上面控制器方法的返回值是这样的: return stuList,这就表示**你应该直接创建模板文件stuList.ftl放在templates文件夹下,不能放在自定义文件夹下!!!**不能放在自定义文件夹下!!!不能放在自定义文件夹下!!!不然又得出错
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎 ${name}
<#if age < 18>同学
<#--这里注意要加(),因为它可能把小于符号当成完成的标志-->
<#elseif (age > 30)>大叔
<#else >帅哥
</#if>
登录
<br>
学生列表
<br>
<table border="1">
<tr>
<td>名字</td>
<td>分数</td>
</tr>
<#--遍历map里的list,注意排序的字段必须加双引号-->
<#list list?sort_by("score") as stu>
<tr>
<#--注意这里要这么取值的话,student类中一定要有get和set方法-->
<td>${stu.name}</td>
<td>${stu.score}</td>
</tr>
</#list>
</table>
</body>
</html>
运行后页面就会显示成这样子: