>
快捷搜索:

赢得授权

- 编辑:皇家国际app -

赢得授权

Thymeleaf是二个XML/XHTML/HTML5模板引擎,可用以Web与非Web意况中的应用开荒。它是三个开源的Java库,基于Apache License 2.0特许,由DanielFernández创造,该作者照旧Java加密库Jasypt的撰稿人。

<bean > <property name="prefix" value="/WEB-INF/templates/"/> <property name="suffix" value=".html"/> <property name="templateMode" value="HTML5"/> <!-- 缓存--><property name="cacheable" value="false"/></bean><bean > <property name="templateResolver" ref="templateResolver"/></bean><bean > <property name="templateEngine" ref="templateEngine"/> <property name="order" value="1"/> <property name="characterEncoding" value="UTF-8"/></bean>

使用HttpEntity

HttpEntity和诉求体、响应体那八个类似,能够在多个地点还要管理央求和响应。上面是Spring官方的二个例子,获取了须要HttpEntity,管理现在回到贰个响应HttpEntity。Spring会利用HttpMessageConverter做供给的转移。

@RequestMapping("/something")public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException { String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader")); byte[] requestBody = requestEntity.getBody(); // do something with request header and body HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.set("MyResponseHeader", "MyValue"); return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);}

code — OAuth 2.0 授权代码。

聚合函数

Query query = session.createQuery("select count from Customer");Object obj = session.uniqueResult();Long count =  obj;int sum = count.intValue();

package cn.itcast.hibernate.test;import java.util.Arrays;import java.util.List;import org.hibernate.Criteria;import org.hibernate.Query;import org.hibernate.SQLQuery;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.criterion.Order;import org.hibernate.criterion.Restrictions;import org.junit.Test;import cn.itcast.onetomany.Customer;import cn.itcast.onetomany.Orders;import cn.itcast.utils.HibernateUtils;/** * 演示hql多表查询操作 */public class HibernateManyTable { //6.聚集函数使用 @Test public void testSQL8() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //count函数 // count记录 sum 求和 avg平均数 min最小值 max最大值 Query query = session.createQuery("select count from Customer"); Object obj = query.uniqueResult(); //可以获取不同类型 //变成long类型 Long count =  obj; //变成int类型 int sum = count.intValue(); System.out.println; //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //6.投影查询 //查询customer表里面所有cname和address的值 @Test public void testSQL7() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //可以查询一个字段也可以查询多个字段,多个字段逗号隔开 Query query = session.createQuery("select cname,address from Customer"); List<Object[]> list = query.list(); for (Object[] objects : list) { System.out.println(Arrays.toString; } //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //投影查询 //查询customer表里面所有cname的值 @Test public void testSQL6() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); Query query = session.createQuery("select cname from Customer"); List<Object> list = query.list(); System.out.println; //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //5.右外连接查询 @Test public void testSQL5() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); Query query = session.createQuery("from Customer c right outer join c.setOrders"); List<Object[]> list = query.list(); //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //4.迫切左外连接查询 @Test public void testSQL4() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); Query query = session.createQuery("from Customer c left outer join fetch c.setOrders"); //加入fetch 返回list集合每部分结构是对象 List list = query.list(); //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //3.左外连接查询 @Test public void testSQL3() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); Query query = session.createQuery("from Customer c left outer join c.setOrders"); //返回list集合每部分结构是数组 List<Object[]> list = query.list(); //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //2.迫切内连接查询 @Test public void testSQL2() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //只是在代码中加入fetch Query query = session.createQuery("from Customer c inner join fetch c.setOrders"); List<Customer> list = query.list(); //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //1.内连接查询 @Test public void testSQL1() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //from Customer c inner join c.setOrders //Customer表与orders表关联部分 后面是写的Customer表的set集合名称 Query query = session.createQuery("from Customer c inner join c.setOrders"); //返回list集合每部分是数组 List<Object[]> list = query.list(); for (Object[] objects : list) { System.out.println(Arrays.toString; } //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } }}

Controller类及HTML页面

Java生态圈分布,自然有多数视图框架,除了JSP之外,还应该有Freemarker、Velocity、Thymeleaf等很多框架。Thymeleaf的亮点是它是依附HTML的,尽管视图未有渲染成功,也是一个正式的HTML页面。由此它的可读性很准确,也能够看成统一筹算原型来选拔。并且它是截然独立于Java EE容器的,意味着我们得以在别的索要渲染HTML的地方使用Thymeleaf。

暗中认可情状下@RequestMapping会管理全部央求,借使期望只处理GET只怕POST等乞请,能够行使@RequestMapping的method属性。

GET须要地址:

QBC检索格局

​ 使用QBC(Query By Criterial)API来搜寻对象,这种API封装了依照字符串情势的查询语言,提供了更上一层楼面向对象的询问语言。

Thymeleaf提供了一个用以整合Spring MVC的可选模块,在动用开垦中,你能够选用Thymeleaf来完全代表JSP或任何模板引擎,如Velocity、Free马克尔等。Thymeleaf的要紧指标在于提供一种可被浏览器精确展现的、格式优异的模版成立形式,因而也足以看成静态建立模型。你能够运用它创制经过验证的XML与HTML模板。相对于编写逻辑或代码,开垦者只需将标签属性增多到模板中就可以。接下来,那几个标签属性就能在DOM上实施预先制订好的逻辑。

compile group: 'org.thymeleaf', name: 'thymeleaf-spring4', version: '3.0.3.RELEASE'
@RequestMapping(value = "/index", method = {RequestMethod.GET})public String index() { return "index";}

图片 1

第两种方法:依照参数的称号传递参数值

Query query = session.createQuery("from Customer c where c.cid = :ccid and c.cname = :ccname");//setParameter设置参数//第一个参数:后面的名称//第二个参数:值query.setParameter("ccid", 2);query.setParameter("ccname", "郭靖");

package cn.itcast.hibernate.test;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.junit.Test;import cn.itcast.onetomany.Customer;import cn.itcast.onetomany.Orders;import cn.itcast.utils.HibernateUtils;/** * 演示hql操作 */public class HibernateHQLDemo1 { //6.根据参数名称传递参数值 @Test public void testSelect7() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //查询cid=2并且cname=尹志平的记录 Query query = session.createQuery("from Customer c where c.cid=:ccid and c.cname=:ccname"); //设置参数值 //setParameter有两个参数 //第一个参数 冒号:后面的名称 //第二个参数 表里具体的值 query.setParameter("ccid", 2); query.setParameter("ccname", "尹志平"); List<Customer> list = query.list(); System.out.println; //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //6.根据参数的位置传递参数值 @Test public void testSelect6() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //查询cid=1 并且cname=杨过的记录 Query query = session.createQuery("from Customer c where c.cid=? and c.cname=?"); //设置参数值 //类型通用setParameter两个参数 //******第一个参数:?位置,开始位置从 0 开始 //第二个参数:具体的参数值 表里数据值 query.setParameter; query.setParameter; List<Customer> list = query.list(); System.out.println; //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //5.唯一对象查询 @Test public void testSelect5() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //查询cid=2的记录 Query query = session.createQuery("from Customer c where c.cid=2"); //使用对象接收返回数据 Customer c =  query.uniqueResult(); System.out.println; //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //4.分页查询 @Test public void testSelect4() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //查询orders表里面前四条记录 Query query = session.createQuery("from Orders"); //设置开始位置 query.setFirstResult; //设置获取几条记录 query.setMaxResults; List<Orders> list = query.list(); for (Orders orders : list) { System.out.println; } //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //3.排序查询 @Test public void testSelect3() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //对customer表里面的数据,按照cid进行升序排列 //Query query = session.createQuery("from Customer c order by c.cid asc"); //对customer表里面的数据,按照cid进行降序排列 Query query = session.createQuery("from Customer c order by c.cid desc"); //调用query里面list方法 List<Customer> list = query.list(); for (Customer customer : list) { System.out.println; } //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //2.演示别名查询 @Test public void testSelect2() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //使用session创建query对象 c是别名 //c.cid : 不是表字段名称,而是实体类属性名称 //建议实体类属性名称与表字段名一致 Query query = session.createQuery("from Customer c where c.cid=1"); //调用query里面list方法 List<Customer> list = query.list(); for (Customer customer : list) { System.out.println; } //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } //1.简单查询 //查询customer表里面的所有数据 @Test public void testSelect1() { Session session = null; Transaction tx = null; try { //获取到session session = HibernateUtils.getSession(); //开启事务 tx = session.beginTransaction(); //使用session创建query对象 from后面是实体类名称 Query query = session.createQuery("from Customer"); //方法链编程 List<Customer> list1 = session.createQuery("from Customer").list(); //调用query里面list方法 List<Customer> list = query.list(); for (Customer customer : list) { System.out.println; } //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); } } }

图片 2图一

Criteria criteria = session.createCriteria(Customer.class);//调用criteria的list方法List<Customer> list = criteria.list();

//升序Criteria criteria = session.createCriteria(Customer.class);criteria.addOrder(Order.asc;//Order类里面的方法asc,asc里面参数是实体类属性名称//降序criteria.addOrder(Order.desc;

Criteria criteria = session.createCriteria(Customer.class);//设置开始位置criteria.setFirstResult;//设置查询记录数criteria.setMaxResults;

Criteria criteria = session.createCriteria(Customer.class);//设置条件criteria.add(Restrictions.gt("price", 3));

SQLQuery sqlQuery = session.createSQLQuery("select * from customer");List<Object[]> list = sqlQuery.list();for(Object[] objects : list) { System.out.println(Arrays.toString;}

图片 3Thymeleaf模板maven依赖

代码段

先是大家来定义一个代码段。假如文件名字为做_header.html,该文件的内容如下。在文书中大家运用th:fragment概念了一个代码段。

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head th:fragment="header"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link th:href="@{/static/css/bootstrap.css}" rel="stylesheet"/> <link th:href="@{/static/css/bootstrap-theme.css}" rel="stylesheet"/> <script th:href="@{/static/js/jquery.js}"></script> <script th:href="@{/static/js/bootstrap.js}"></script> </th:block></head><body></body></html>

然后在其他地方,大家就足以应用th:insertth:replace来插入代码段了。那三头的区分是th:insert会将代码段插入该因素内部,而th:replace会将整个因素交替为要插入的代码块。在此地又并发了一种新语法~{file :: fragment},表示援用文件的某部代码块。

<head th:replace="~{_header :: head}">

另外~{..}是可选的,所以地方的代码还足以写为上面包车型大巴款型。

<head th:replace="_header :: head">

代码段表明式的率先个参数能够归纳(~{::selector})或然写为this(~{this::selector}),表示要援用的代码段就在如今文件中。表明式的第贰个参数能够是代码段的名目,也得以是CSS选取器(~{file::#form}。假诺不内定第二个参数的话,就能够引入整个文件(~{templatename})。

代码段能够有参数,折让它装有类似函数的一颦一笑。上边是三个例子。

<head th:fragment="header"> <title th:text="${title}"></title></head>

要引进代码块的时候,同样钦赐参数就能够。

<head th:replace="_header::header"></head>

如果有多少个参数,用逗号分隔就可以。在动用代码块的时候,不只能够依照岗位传入参数,也得以遵守名称传入参数。

<div th:replace="::frag (${value1},${value2})">...</div><div th:replace="::frag (onevar=${value1},twovar=${value2})">...</div>

前边的代码段全体在有些页面成分中。假诺代码块是有个别同级的要素,又该如何做吧?Thymeleaf提供了独一的五个Thymeleaf块级成分<th:block>,能够扶持我们实现这一职业。首先创设贰个_footer.html文件,在个中使用<th:block>创制叁个代码块。

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head></head><body><th:block th:fragment="footer"> <br> <p>这是页脚</p></th:block></body></html>

接下来在别的地点一样接纳就可以。Thymeleaf模板引擎在拍卖<th:block>的时候会删掉它自个儿,而保留其剧情。

<div th:replace="_footer::footer"></div>

Thymeleaf的那几个特色让它能够布置特别灵活的代码段。来拜会Thymeleaf的这些事例。首先我们定义三个公用代码段。注意这里的links,它是八个Thymeleaf块,会被实际传入的参数代替。

<head th:fragment="common_header(title,links)"> <title th:replace="${title}">默认标题</title> <!-- 公用CSS和JS文件 --> <!--/* 各页面单独的文件 */--> <th:block th:replace="${links}" /></head>

然后引用代码段。小心这里的四个代码块参数,会间接选择本页面的有着题目和link标签,然后将它们传播公用代码段中。最生平成的结果大家能够虚构一下,是或不是特别的灵敏呢?

<head th:replace="base :: common_header(~{::title},~{::link})"> <title>Awesome - Main</title> <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}"> <link rel="stylesheet" th:href="@{/themes/smoothness/jquery-ui.css}"></head>

抑或地方这几个事例。要是大家传入空代码段,那么实际上结果中相应的地点就能为空。

<head th:replace="base :: common_header(~{::title},~{})">

即使接纳无操作符,那么实际上变化的代码相应部分不会做其余Thymeleaf替换,也正是说会大家会获取暗许标题。

<head th:replace="base :: common_header(_,~{::link})">

以下是Thymeleaf的一个例子。我们得以应用th:remove来删除钦点的局地,那在原型设计和调节和测验的时候很有用。

 <tr th:remove="all"> <td>Mild Cinnamon</td> <td>1.99</td> <td>yes</td> <td> 3 comment/s <a href="comments.html">view</a> </td> </tr>

th:remove可承受的值有5个:

  • all: 移除标签和全体子成分
  • body: 移除全部子成分,保留标签
  • tag: 移除标签,保留子成分
  • all-but-first: 保留第三个子成分,移除全体其余
  • none : 什么也不做。那个值在动态求值的时候会有效应

由于Thymeleaf的用法非常多,这里无法完全写下,所以自个儿就不写了。前边那一个本该能够满意基本须求了。若是须求任何特色的话请看官方文书档案吧。这里大概的辨证一下未详细介绍的别的特色。

处理application/x-www-form-urlencoded数据

浏览器会使用GET大概POST方法发送数据,非浏览器顾客端能够采纳PUT方法发送数据。可是PUT发送过来的数码,不能被Servlet种类措施ServletRequest.getParameter*()获得到。Spring提供了二个过滤器HttpPutFormContentFilter,用于扶助非浏览器的PUT新闻发送。

HttpPutFormContentFilter需要在web.xml中配置。<servlet-name>布局的是Spring的DispatcherServlet的名目。

<filter> <filter-name>httpPutFormFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class></filter><filter-mapping> <filter-name>httpPutFormFilter</filter-name> <servlet-name>dispatcherServlet</servlet-name></filter-mapping>

本条过滤器会拦截Content-Type是application/x-www-form-urlencoded的PUT央求,读取其央求体然后卷入到ServletRequest中,以便ServletRequest.getParameter*()能够获取到参数。

图片 4

右外连接:右侧表全部的数目,侧边表查关联数据

范例:Select * from A right outer join B on A.id=B.id

图片 5在《Spring Inuti搭建Spring Boot项目》中我们搭建了Spring Boot项目,下一步大家引进Thymeleaf模板引擎开辟web项目

迭代块

临时大家需求遍历四个数组中的成分。那足以应用th:each实现。在th:each中我们要内定迭代元素和被迭代集合。被迭代集结能够是:数组,任何达成了java.util.Iterable的对象,任何实现了java.util.Enumeration的靶子,任何落成了java.util.Iterator的靶子,任何完成了java.util.Map的对象。内需小心的是,和JSTL的<c:forEach>标签差异,Thymeleaf会迭代包蕴<th:each>的方方面面标签块,而不仅是它的子标签块。

 <tr th:each="user : ${users}"> <td th:text="${user.name}"></td> <td th:text="${user.age}"></td> <td th:text="${user.birthday}"></td> </tr>

Thymeleaf还提供了迭代状态变量来检验当前迭代的动静,只必要在th:each中声明iterStat就可以。假设尚未显式评释状态变量,Thymeleaf也会成立多个状态变量,名称是迭代成分增加后缀Stat。上边的代码中,Thymeleaf会创设二个名称为userStat的状态变量。

 <tr th:each="user,iterStat : ${users}"> <td th:text="${user.name}"></td> <td th:text="${user.age}"></td> <td th:text="${user.birthday}"></td> </tr>

状态变量包罗以下属性;

  • index属性,以0开头的迭代成分索引。
  • count属性,以1上马的迭代成分索引。
  • size属性,迭代聚焦的总元素数。
  • iter属性,当前迭代成分。
  • even和odd五个布尔值,证明当前index的奇偶。
  • first和last五个布尔值,申明当前成分是或不是是第贰个/最终一个。

Rest控制器

@RestController会向全数@RequestMapping方法加多@ResponseBody表明。如若调控器须要贯彻REST API,那么此时就很便利。

应用授权代码交流访问令牌

第三种方法:使用乐观锁

选拔版本号决定,有多少个职业同有时间操作同一条记下。在记录里面增加版本号消息,私下认可是0。

若是a事务,修改数据,提交业务,提交在此之前把记录的版本号修改为1,完毕提交

假如b事务,修改数据,提交业务在此之前,相比当前数据的版本号和数据Curry面包车型客车流行的版本号是还是不是一样,假设不等同不立异数据库

金玉满堂步骤:

如上页面,直接展开html页面展现Hello World,可是运转程序后,访谈

表明式基本指标

Thymeleaf满含了有的大旨对象,可以用于大家的视图中。这么些骨干指标使用#开头。

  • #ctx赢得授权。: 上下文对象.
  • #vars: 上下文变量.
  • #locale: 区域对象.
  • #request: HttpServletRequest对象.
  • #response: HttpServletResponse对象.
  • #session: HttpSession对象
  • #servletContext: ServletContext对象.

多少个Web相关的对象会被Thymeleaf映射为Thymeleaf上下文中的对象,因而我们无需也不可能在它们前边增加#。举例假如大家要引用Session中的值,能够像这么使用。

<p th:text="${session.user}"></p>

调整器布告

先来介绍一下@InitBinder表明,它能够松手调整器的一个措施上,那些措施有一个WebDataBinder参数,用它能够对调整器实行定制,增添格式转换、验证等效果。

@InitBinderprotected void initBinder(WebDataBinder binder) {//添加功能}

然后就能够介绍@ControllerAdvice@RestControllerAdvice那三个评释了。它们得以定义调节器布告,这一个AOP中的Advice概念是同等的。那几个注明须求利用到类上,那些类能够包括@ExceptionHandler@InitBinder@ModelAttribute批注的点子,然后那一个格局就能够在适合的火候来施行。

// 注解了RestController的控制器@ControllerAdvice(annotations = RestController.class)public class AnnotationAdvice {}// 特定包下的控制器@ControllerAdvice("org.example.controllers")public class BasePackageAdvice {}// 特定类型的控制器@ControllerAdvice(assignableTypes = {MainController.class})public class AssignableTypesAdvice {}

咱俩得以选择拦截器拦截央浼并扩充拍卖,这点有一点像Servlet的过滤器。大家需求贯彻org.springframework.web.servlet.HandlerInterceptor接口,可是越来越好的方法是三回九转HandlerInterceptorAdapter类,这么些类将多少个拦截方法开展了暗中认可完结。大家只须要重写须要的诀要就可以。

上面定义了三个简约的拦截器,作用只是是出口拦截时间。大家能够看来有多少个拦截机会,管理需要前,管理伏乞后,达成伏乞后和异步管理开端后,那一个阻挡方法的参数是Http央求和响应,使用相当的低价。

public class LogInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle:" + LocalTime.now; return super.preHandle(request, response, handler); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle:" + LocalTime.now; super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion:" + LocalTime.now; super.afterCompletion(request, response, handler, ex); } @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("afterConcurrentHandlingStarted:" + LocalTime.now; super.afterConcurrentHandlingStarted(request, response, handler); }}

有了拦截器之后,大家还亟需登记它。首先将其登记为四个Spring Bean。然后定义叁个RequestMappingHandlerMapping并将拦截器传递给它。

<beans> <bean > <property name="interceptors"> <list> <ref bean="logInterceptor"/> </list> </property> </bean> <bean /></beans>

概念拦截器的这一部总局署能够运用mvc命名空间简化。

<mvc:interceptors> <ref bean="logInterceptor"/></mvc:interceptors>

暗许景况下拦截器针对富有拍卖方法。借使希望只极度有个别UTiguanL,能够定义一个org.springframework.web.servlet.handler.MappedInterceptor,使用它的构造方法设置映射。

<bean > <constructor-arg index="0"> <list> <value>/</value> </list> </constructor-arg> <constructor-arg index="1" ref="logInterceptor"/></bean>

也足以直接使用mvc命名空间。

<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/"/> <ref bean="logInterceptor"/> </mvc:interceptor></mvc:interceptors>

拦截器或者不适用@ResponseBodyResponseEntity艺术,因为那个措施会使用HttpMessageConverter来输出响应。这时候大家得以兑现ResponseBodyAdvice接口,然后使用@ControllerAdvice注解可能直接在RequestMappingHandlerAdapter.安插它们来阻拦那一个艺术。

央浼参数列表:

非自身计算的笔记,抄点笔记复习复习。感谢传智博客及黑马技术员

图片 6记笔记啊记笔记

Thymeleaf模板

下一场运营程序,访问主页,就可以看出Thymeleaf的结果。

矩阵变量Matrix Variables

中华VFC 3986概念了可以在路径中增加键值对,这样的键值对称得上矩阵变量。Spring默许未有启用矩阵变量。要启用它,在dispatcher-servlet.xml中加多或涂改如下一行。

<mvc:annotation-driven enable-matrix-variables="true"/>

矩阵变量能够用在路线的其余部分,需要和门路之间利用分号;相隔开分离,每种矩阵变量之间也是用分号分隔。借使三个矩阵变量有多个值,使用逗号,分隔,例如"/matrix/42;colors=red,blue,yellow;year=2012"

对应的调节器方法如下。

// 处理请求 /matrix/42;colors=red,blue,yellow;year=2012@RequestMapping("/matrix/{count}")public String matrix(@PathVariable int count, @MatrixVariable String[] colors, @MatrixVariable int year, Model model) { model.addAttribute("colors", colors); model.addAttribute("year", year); return "matrix";}

还是能够将富有矩阵变量映射成一个Map。

// 处理请求 /matrix2/42;colors=red,blue,yellow;year=2012@RequestMapping("/matrix2/{count}")public String matrix2(@PathVariable int count, @MatrixVariable MultiValueMap<String, String> map, Model model) { model.addAttribute("map", map); return "matrix";}

对应的视图像和文字件是matrix.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>矩阵变量</title> <meta charset="utf-8"/></head><body><p>颜色是: <c:forEach var="color" items="${colors}"> ${color}, </c:forEach></p><p>年份是:${year}</p><p>矩阵变量:${map}</p></body></html>

别的详细用法参见Spring仿照效法文书档案-matrix-variables。

最重要配置项:

导航对象图检索格局

​ 根据已经加载的指标导航到另外对象

以顾客和订单为例:查询出一个客商,查询这一个客商的有着订单,直接获得客户的订单集结

图片 7图片 8

质量管理

Thymeleaf是怎么管理这么些th:*性格的啊?

@Controllerpublic class MainController { @RequestMapping public String hello(@RequestParam(defaultValue = "苟") String name, Model model) { model.addAttribute("name", name); return "hello"; } @RequestMapping public String index() { return "index"; }}

图片 9

其次种状态:fetch值是select,lazy值是true、false、extra

<set name="setOrders" cascade="save-update" fetch="select" lazy="true"></set>

要拓宽缓延长期

Customer customer =  session.get(Customer.class, 1);Set<Orders> sets = customer.getSetOrders();System.out.println(sets.size;

收获到set集合的时候,不会立即发送sql语句,而得到集合的内容时候才会发送sql语句

<set name="setOrders" cascade="save-update" fetch="select" lazy="false"></set>

一遍性把持有的查询操作都进行,不实行延期

<set name="setOrders" cascade="save-update" fetch="select" lazy="extra"></set>

把须求的数目重临,无需的不给

图片 10sql语句

本文由皇家国际app发布,转载请注明来源:赢得授权