springboot-day01_2

大家不懂得可以留言我,我尽力哈哈哈,这篇博客的所有代码都是延续的上一篇博客: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>

运行后页面就会显示成这样子:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值