springboot笔记_3

第八章 打包

springboot中jsp打包成war

 在pom中需要配置:

1.指定打包名称

<build>
   <!--打包后的文件名称-->
   <finalName>myboot</finalName>
</build>

2.指定打包类型

<packaging>war</packaging>

3.主启动类继承SpringBootServletInitializer

/**
 * SpringBootServletInitializer: 继承这个类, 才能使用独立tomcat服务器
 */
@SpringBootApplication
public class JspApplication  extends SpringBootServletInitializer  {

   public static void main(String[] args) {
      SpringApplication.run(JspApplication.class, args);
   }

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
      return builder.sources(JspApplication.class);
   }
}

然后就可以将war包直接放在tomcat的webapps目录下,tomcat服务器在启动的时候会自动部署这个war项目。

springboot项目打包成jar

包含jsp时需要:

1.指定打包名称

2.指定springboot-maven-pluge版本

<plugins>
   <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <!--打包jar, 有jsp文件时,必须指定maven-plugin插件的版本是 1.4.2.RELEASE-->
      <version>1.4.2.RELEASE</version>
   </plugin>
</plugins>

3.直接在jar包所在目录运行java -jar 包名即可。不依赖于服务器。

第九章 Thymeleaf 模板引擎

 Thymeleaf:是使用java开发出来的模板技术,在服务端运行,把处理后的数据发送给浏览器。

模板在视图层工作,显示数据的。基于html语言。应用在html标签中。springboot框架继承thymeleaf,替代jsp。、

Thymeleaf 的官方网站:Thymeleaf Thymeleaf 官方手册:Tutorial: Using Thymeleaf

9.1 表达式

1.标准表达式

语法: ${key}

获取request等作用域的数据 

 <tr><td>姓名</td><td><a th:text="${user.name}"></a></td></tr>
            <tr><td>id  </td><td><a th:text="${user.id}"></a></td></tr>
            <tr><td>年龄</td><td><a th:text="${user.age}"></a></td></tr>
            <tr><td>性别</td><td><a th:text="${user.sex}"></a></td></tr>

 2.选择变量表达式

语法: *{key}

作用: 获取这个key对应的数据, *{key}需要和th:object 这个属性一起使用。

  <div class="layui-col-md4" th:object="${user}">
        <table class="layui-table" lay-even lay-skin="row" lay-size=lg>
            <tr><td>姓名</td><td><a th:text="*{name}"></a></td></tr>
            <tr><td>id  </td><td><a th:text="*{id}"></a></td></tr>
            <tr><td>年龄</td><td><a th:text="*{age}"></a></td></tr>
            <tr><td>性别</td><td><a th:text="*{sex}"></a></td></tr>
        </table>
    </div>
直接使用*{}的方式:<a th:text="*{user.name}"></a>

3.连接表达式

<table class="layui-table" lay-even lay-skin="row" lay-size=lg>
            <tr><td>连接到百度,绝对地址</td>
                <td><a th:href="@{http://www.baidu.com}" class="layui-btn"></a></td></tr>
            <tr><td>连接到标准表达式,相对地址</td>
                <td><a th:href="@{/biaozhun}" class="layui-btn-danger">11</a></td></tr>
            <tr><td>连接相对地址,并且使用字符串传递连接参数</td>
                <td><a th:href="@{'/chuandi?id='+${user.id}}" class="layui-btn-danger">11</a></td></tr>
            <tr><td>传递参数的另一种方式,可以多个参数</td>
                <td><a th:href="@{/chuancan(id=${user.id},name=${user.name})}" class="layui-btn"></a></td></tr>
        </table>

四种不同的跳转方式,

跳转到外部网站的绝对地址  th:href="@{http://www.baidu.com}" 不要加/,不然就是从本端口号

跳转到本项目相对地址,不带参数th:href="@{/biaozhun}"

跳转到本项目相对地址,带上参数一个th:href="@{'/chuandi?id='+${user.id}}"

跳转到本项目相对地址,带上多个参数th:href="@{/chuancan(id=${user.id},name=${user.name})}"

4.模板属性

属性放在html元素中,加上th的前缀表示属性的值由模板处理,就是可以将属性的值变为变量

 <form class="layui-form" th:action="@{/form}" th:method="${method}">
        <div class="layui-form-item">
            <label class="layui-form-label">请输入姓名</label>
            <div class="layui-input-block">
                <input class="layui-input" th:name="${name}" th:value="${namevalue}">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">请输入姓名</label>
            <div class="layui-input-block">
                <input class="layui-input" th:name="id" th:value="${id}">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <input class="layui-btn" type="submit" value="提交">
            </div>
        </div>
    </form>

比如这里面的一些属性就是由thymeleaf模板来管理的,这样就可以从后端传递数据到前端的一些属性·。

 th:each

 语法:

<div th:each="集合循环成员,循环的状态变量:${key}">
    <p th:text="${集合循环成员}" ></p>
</div>

集合循环成员,循环的状态变量:两个名称都是自定义的。 “循环的状态变量”这个名称可以不定义,默认是"集合循环成员Stat"


用法1:循环list

<tr th:each="student,index:${students}">
                <td th:text="${index.count}+'/'+${index.size}"></td>
                <td th:text="${student.name}">姓名</td>
                <td th:text="${student.id}">id</td>
                <td th:text="${student.age}">年龄</td>
                <td th:text="${student.sex}">性别</td>
                <td th:text="${index.current.name}"></td>
                <td th:text="${index.first}"></td>

            </tr>

each中存在一个标识着每一项信息的参数,名称可以自定义。默认是studentStat(你指定的参数名加上Stat)。然后这个参数有几个属性,(这里是index),指定总数index.count,指定当前数目index.size。指定当前的student对象index.current.属性名。还可以判断是否单双数,是否第一或最后一个数

 用法2:使用each取map值

<tr th:each="map,index:${map}">
                <td th:text="${index.count}+'/'+${index.size}"></td>
                <td th:text="${map.key}"></td>
                <td th:text="${map.value.name}">姓名</td>
                <td th:text="${map.value.id}">id</td>
                <td th:text="${map.value.age}">年龄</td>
                <td th:text="${map.value.sex}">性别</td>
                <td th:text="${index.current.key}"></td>
                <td th:text="${index.first}"></td>
            </tr>

 相同的遍历方式,只不过取值变成了map.key或者map.value(这里的value是一个student对象,多以还可以取对象中的属性)

 用法三:通过list<map<String,Student>>嵌套的方式

<table class="layui-table" lay-even lay-skin="row" lay-size=lg th:each="map:${listmap}">
            <tr><td>序号</td><td>map的key</td><td>姓名</td><td>id</td><td>年龄</td><td>性别</td><td>序号取值</td><td>是否是第一行</td></tr>
            <tr th:each="map,index:${map}">
                <td th:text="${index.count}+'/'+${index.size}"></td>
                <td th:text="${map.key}"></td>
                <td th:text="${map.value.name}">姓名</td>
                <td th:text="${map.value.id}">id</td>
                <td th:text="${map.value.age}">年龄</td>
                <td th:text="${map.value.sex}">性别</td>
                <td th:text="${index.current.key}"></td>
                <td th:text="${index.first}"></td>
            </tr>

        </table>

 只需要在map的基础上再次嵌套一层就可以了,值得注意的是,第一次取出的那个map在第二个each中取出的方式任然是${map}。

 th:if          th:unless          th:switch

  •  "th:if" : 判断语句, 当条件为true, 显示html标签体内, 反之不显示 没有else语句
<!--m.addObject("sex","m");-->
<!--m.addObject("isLogin",true);-->
<!--m.addObject("age",20);-->
<!--m.addObject("name","");-->
<!--m.addObject("isold",null);-->
<div class="layui-container">
    <div th:if="${sex=='m'}" class="layui-btn">性别:男</div>显示
    <div th:if="${isLogin}" class="layui-btn">已登录</div>显示
    <div th:if="${age>20}" class="layui-btn">年龄大于20</div>
    <div th:if="${name}" class="layui-btn">name=null</div>显示
    <div th:if="${isold}" class="layui-btn">isold</div>
</div>

 详解th:if属性:正常的相等判可以;boolean类型的true可以;判断大小可以;字符串可以(包括空的);但是null值判断为假 

  • 还有一个 th:unless 和 th:if相反的行为  
  • <div class="layui-container">
        <div th:unless="${sex=='m'}" class="layui-btn">性别:男</div>
        <div th:unless="${isLogin}" class="layui-btn">已登录</div>
        <div th:unless="${age>20}" class="layui-btn">年龄大于20</div>显示
        <div th:unless="${name}" class="layui-btn">name=null</div>
        <div th:unless="${isold}" class="layui-btn">isold</div>显示
    </div>
  • th:switch 和 java中的swith一样的  
<div class="layui-container" th:switch="${sex}">
    <div th:case="a" class="layui-btn">性别:男</div>
    <div th:case="w" class="layui-btn">已登录</div>
    <div th:case="f" class="layui-btn">年龄大于20</div>
    <div th:case="m" class="layui-btn">name=null</div>
    <div th:case="c" class="layui-btn">isold</div>
</div>

 th:inline

 内联text: 在html标签外,获取表达式的值

<div class="layui-container">
    <div th:inline="text">
        <p>加上th:inline的形式</p>
        <p class="layui-btn" >我是[[${name}]],年龄是[[${age}]]</p>
    </div>
    <div >
        <p>不加上th:inline的形式也可以</p>
        <p class="layui-btn" >我是[[${name}]],年龄是[[${age}]]</p>
    </div>
</div>

在html代码里面,加不加上th:inline都显示。

但是在js语法里面必须加上th;line="javascript"才可以显示

<script type="text/javascript" th:inline="javascript">
    function f() {
        var name=[[${name}]]
        var age=[[${age}]]
        alert("获取到数据"+name+age)
    }
    f()
</script>

 字面量

<div style="margin-left: 400px">
       <h3>文本字面量: 使用单引号括起来的字符串</h3>
       <p th:text="'我是'+${name}+',我所在的城市'+${city}">数据显示</p>

       <h3>数字字面量</h3>
        <p th:if="${20>5}"> 20大于 5</p>

        <h3>boolean字面量</h3>
        <p th:if="${isLogin == true}">用户已经登录系统</p>

        <h3>null字面量</h3>
        <p th:if="${myuser != null}">有myuser数据</p>
    </div>

 文本,数字,boolean

字符串连接

 1) 语法使用 单引号括起来字符串 , 使用 + 连接其他的 字符串或者表达式

  <p th:text="'我是'+${name}+',我所在的城市'+${city}">数据显示</p>

 2)语法:使用双竖线, |字符串和表达式|

<p th:text="|我是${name},我所在城市${city}|">
    显示数据
</p>

9.9 运算符

<div style="margin-left: 400px">
        <h3>使用运算符</h3>
        <p th:text="${age > 10}">年龄大于 10 </p>
        <p th:text="${ 20 + 30 }">显示运算结果</p>
        <p th:if="${myuser == null}">myuser是null</p>
        <p th:if="${myuser eq null}">myuser是null</p>
        <p th:if="${myuser ne null}">myuser不是null</p>

        <p th:text="${isLogin == true ? '用户已经登录' : '用户需要登录'}"></p>
        <p th:text="${isLogin == true ? ( age > 10 ? '用户是大于10的' : '用户年龄比较小') : '用户需要登录'}"></p>

    </div>

三元运算符:
 表达式  ? true的结果 : false的结果

三元运算符可以嵌套

9.10 内置对象

 

#request 表示 HttpServletRequest

#session 表示 HttpSession对象

session 表示Map对象的, 是#session的简单表示方式, 用来获取session中指定的key的值

#session.getAttribute("loginname") == session.loginname

这些是内置对象,可以在模板文件中直接使用。

<table class="layui-table" style="text-align: center">
<!--        #session表示在thymeleaf模板中使用session对象-->
<!--        但是直接的session是将session作用域中所有的值封装为一个map对象,只能用作获取值-->
        <tr><td colspan="2" class="layui-btn">获取内置对象作用域数据</td></tr>
        <tr><td>request作用域数据:</td><td><a th:text="${#request.getAttribute('request')}"></a></td></tr>
        <tr><td>session作用域数据:</td><td><a th:text="${#session.getAttribute('session')}"></a></td></tr>
        <tr><td>session作用域数据:</td><td><a th:text="${session.session}"></a></td></tr>
        <tr><td colspan="2" class="layui-btn">内置对象的使用</td></tr>
        <tr><td>url全路径</td><td th:text="${#request.getRequestURL()}"></td></tr>
        <tr><td>uri资源路径</td><td th:text="${#request.getRequestURI()}"></td></tr>
        <tr><td>获取端口号</td><td th:text="${#request.getServerPort()}"></td></tr>
        <tr><td>获取协议名称</td><td th:text="${#request.getScheme()}"></td></tr>
        <tr><td>获取主机名</td><td th:text="${#request.getServerName()}"></td></tr>
        <tr><td colspan="2" class="layui-btn">param的使用</td></tr>
        <tr><td>获取传递过来的参数</td><td th:text="${param.name}"></td></tr>
        <tr><td>获取传递过来的参数的数量</td><td th:text="${param.size()}"></td></tr>
    </table>

 

 

 

9.11 内置工具类

内置工具类型: Thymeleaf自己的一些类,提供对string, date ,集合的一些处理方法

#dates: 处理日器的工具类

#numbers:处理数字的

#lists: 处理list集合的

<table class="layui-table">
        <tr><td rowspan="6">日期类对象,操作日期格式,后台传递参数为new date:</td><td th:text="${#dates.format(date)}"></td></tr>
        <tr><td th:text="${#dates.format(date,'yyyy-MM-dd:HH-mm-ss')}"></td></tr>
        <tr><td th:text="${#dates.year(date)}"></td></tr>
        <tr><td th:text="${#dates.month(date)}"></td></tr>
        <tr><td th:text="${#dates.day(date)}"></td></tr>
        <tr><td th:text="${#dates.createNow()}"></td></tr>
        <tr><td rowspan="2">操作数字:</td><td th:text="${#numbers.formatCurrency(number)}"></td></tr>
        <tr><td th:text="${#numbers.formatDecimal(number,5,2)}"></td></tr>
        <tr><td rowspan="4">操作字符串:</td><td th:text="${#strings.toUpperCase(string)}"></td></tr>
        <tr><td th:text="${#strings.indexOf(string,'san')}"></td></tr>
        <tr><td th:text="${#strings.substring(string,2,5)}"></td></tr>
        <tr><td th:text="${#strings.concat(string,'连接')}"></td></tr>

    </table>
<h3>处理null</h3>
      <p th:text="${zoo?.dog?.name}"></p>

9.12 自定义模板

模板是内容复用, 定义一次,在其他的模板文件中多次使用。

模板使用:

1.定义模板

2.使用模板

th:fragment="模板自定义名称"

例如:
<div th:fragment="head">
    <p>
        动力节点-java开发
    </p>
    <p>
        www.bjpowernode.com
    </p>
</div>

引用模板语法:

1) ~{templatename :: selector}
   templatename:  文件名称
   selector: 自定义模板名称
2)templatename :: selector
   templatename:  文件名称
   selector: 自定义模板名称

对于使用模板:有包含模板(th:include), 插入模板(th:insert)

第十章 总结

10.1 注解

Spring + SpringMVC + SpringBoot

@Controller:放在控制器对象上的,将控制器注入到容器中

@RestController: 复合注解是@Controller , @ResponseBody,让方法的返回值是数据,而不是视图

@Service : 放在业务层的实现类上面,创建service对象,注入到容器

@Repository : 放在dao层的实现类上面,创建dao对象,放入到容器。 没有使用这个注解,是因为现在使用MyBatis框架,  dao对象是MyBatis通过代理生成的。 不需要使用@Repository、 所以没有使用(基本用不上,除非你自己去写dao层实现类并放入容器管理)

@Component:  放在类的上面,创建此类的对象,放入到容器中。 (单纯的将类放到容器管理,起不到标识的作用,比如service标识这是服务层)

 赋值的:

@Value : 简单类型的赋值, 例如 在属性的上面使用@Value("李四") private String name
          还可以使用@Value,获取配置文件者的数据(properties或yml)。 
          @Value("${server.port}") private Integer port

@Autowired: 引用类型赋值自动注入的,支持byName, byType. 默认是byType 。 放在属性的上面,也可以放在构造方法的上面。 推荐是放在构造方法的上面

@Qualifer:  给引用类型赋值,使用byName方式。   
@Autowird, @Qualifer都是Spring框架提供的。
@Resource : 来自jdk中的定义, javax.annotation。 实现引用类型的自动注入, 支持byName,byType.默认是byName, 如果byName失败, 再使用byType注入。 在属性上面使用 

其他: 

@Configuration : 放在类的上面,表示这是个配置类,相当于xml配置文件 

@Bean:放在方法的上面, 把方法的返回值对象,注入到spring容器中。 (比如在springboot中使用拦截器,过滤器等的时候,定义自己的拦截器需要在config中注册类和方法。后者需要使用这个注解注入容器)

@ImportResource : 加载其他的xml配置文件, 把文件中的对象注入到spring容器中 (手写一个spring的bean文件,然后将这个文件引入到一个config的类配置文件中。)

@PropertySource : 读取其他的properties属性配置文件 (需要扫描一下配置文件的位置,将里面的值取出来)

@ComponentScan: 扫描器 ,指定包名,扫描注解的 (springboot的启动注解中就有这个的整合,可以扫描同级以及所有子包。所以使用spingboot的时候必须注意目录的层级)

@ResponseBody: 放在方法的上面,表示方法的返回值是数据, 不是视图 

@RequestBody : 把请求体中的数据,读取出来, 转为java对象使用。 (可以用于前台返回json接收的问题等)

@ControllerAdvice:  控制器增强, 放在类的上面, 表示此类提供了方法,可以对controller增强功能。 

@ExceptionHandler : 处理异常的,放在方法的上面

@Transcational :  处理事务的, 放在service实现类的public方法上面, 表示此方法有事务(启动类加上一个@EnableTransactionManagement)

SpringBoot中使用的注解

  @SpringBootApplication : 放在启动类上面, 包含了@SpringBootConfiguration
                          @EnableAutoConfiguration, @ComponentScan

MyBatis相关的注解 

@Mapper : 放在类的上面 , 让MyBatis找到接口, 创建他的代理对象    
@MapperScan :放在主类的上面 , 指定扫描的包, 把这个包中的所有接口都创建代理对象。 对象注入到容器中
@Param : 放在dao接口的方法的形参前面, 作为命名参数使用的。 

Dubbo注解

@DubboService: 在提供者端使用的,暴露服务的, 放在接口的实现类上面
@DubboReference:  在消费者端使用的, 引用远程服务, 放在属性上面使用。
@EnableDubbo : 放在主类上面, 表示当前引用启用Dubbo功能。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值