精华内容
下载资源
问答
  • 【thymeleaf】th:object

    2021-09-04 23:50:39
    [#th:block th:object="${T(org.apache.shiro.SecurityUtils).getSubject().getPrincipal()}"] var currentUser = { loginName:[[*{loginName}]], userName:[[*{userName}]], userId:[(*{userId})], ...
    <script th:inline="javascript"> 
        [#th:block th:object="${T(org.apache.shiro.SecurityUtils).getSubject().getPrincipal()}"]
     	var currentUser = {
     		loginName:[[*{loginName}]],
     		userName:[[*{userName}]],
     		userId:[(*{userId})],
     		deptId:[(*{deptId})],
     	};
     	[/th:block]
    </script>
    
    展开全文
  • 三、去除th:object之后的访问 1)星号变量(前台th:object不存在,后台model.addAttribute("user", new User())存在) 如下图所示,我们现在将前台login.html中的th:object="${user}"去掉,但后台不变, 即model....

           此篇分享一个关于Thymeleaf表单提交页面解析报错的问题。

     

    一、表单中有th:object但后台传参没有Object导致访问报错

           1)前台表单代码

           注意,下图中的login.html中的form表单部分,根据从网上查到的Thymeleaf表单提交案例,模仿了之后,发现在<form>标签内有个th:object,我一开始一直不知道这个是用来干什么的,以为是提交之后往后台传输参数的(其实是上一步请求跳转后从后台传到前台的)。

    	<form action="/user" th:action="@{/user/login}" method="post" th:object="${user}">
    <!--		<form action="/user" th:action="@{/user/login}" method="post" >-->
    		<table>
    			<tr>
    				<td>用户名:</td>
    				<td><input type="text" name="uname" th:value="*{uname}"/></td>
    			</tr>
    			<tr>
    				<td>密码:</td>
    				<td><input type="password" name="upassword" th:value="*{upassword}"/></td>
    			</tr>
    			<tr>
    				<td colspan="2" align="center"><input type="submit" value="提交" /></td>
    			</tr>
    		</table>
    	</form>

           2)后台Controller代码

           后台是一个跳转链接,意思准备通过访问localhost:8080/user/loginUI,跳转到用户登录的/templates/pages/login.html表单提交页面,也就是上一步的login.html页面。

    @Controller
    @RequestMapping("/user")
    public class UserController{
    
    	@GetMapping("/loginUI")
    	public String loginUI() {
    		return "/pages/login";
    	}
    
    }

           3)访问报错(前台th:object存在,后台model.addAttribute("user", new User())不存在)

           但是,当我们访问localhost:8080/user/loginUI的时候,报错了。下图中虽然访问网址没有变(请求转发的特点),但错误不在UserController后台转发那一步,而是在转发之后的login.html页面这里。报错内容明显地表示了,错误原因是模板解析错误造成的,也就是说login.html这个页面内有错误。

           继续往下看,下拉报错原因,很清楚的说明了在SpringEL表达式语句中,"uname"处发生了判断上的异常。也就是说,此时的SpringEL是不识别uname的。

           4)解决方法一:后台传参给user(前台th:object存在,后台model.addAttribute("user", new User())也存在)

           在网上查了好久,后来知道了th:object原来是后台传给当前页面的参数,所以我就去尝试了一下,给后台创建一个值为空的User对象,再传给前台,看看有没有效果。

    @Controller
    @RequestMapping("/user")
    public class UserController{
    
    	@GetMapping("/loginUI")
    	public String loginUI(Model model) {
    		model.addAttribute("user", new User());
    		return "/pages/login";
    	}
    
    }

           结果呢,如下图所示,访问localhost:8080/user/loginUI之后,没有报错,而是正常跳转到了login.html页面,也就可以进行下一步的提交表单操作了。

    二、探索报错原因

           1)查看Thymeleaf官方文档

           下图中在对于星号变量表达式的使用中提到,星号和美元符号有一个重要的区别:星号语法仅对选定对象进行表达式语法上的认可,而不是对整个上下文起作用。也就是说,只要没有选定对象,星号和美元的语法作用完全相同。

           什么是被选中的对象?就是使用th:object属性表达式的对象。

           这句话的意思是说,如果使用了星号表达式语句,那么星号变量(比如uname)就必须有一个选定对象处于上一级标签中。这个选定对象你可以理解为,星号变量所处的类对象(比如User),星号变量(比如uname)就是这个类的一个变量。

           因此,我们选择了使用*{uname}来放置变量的话,那么必须存在th:object="${user}",既然必须存在${user},那么跳转到login.html页面的后台Controller请求就必须往前台传递一个User对象。因此,当我们把UserController中的loginUI(Model model)方法添加了model.addAttribute("user", new User());之后,访问就不再报错了。

           2)将星号替换为美元符号(前台th:object存在,后台model.addAttribute("user", new User())也存在)

           我们再来回顾下Thymeleaf官方文档中的一句话,“也就是说,只要没有选定对象,星号和美元的语法作用完全相同”。本来我是准备要去掉th:object的,但我们先看下th:object存在的时候,将星号替换为美元符号的访问情况。

           如下图所示,th:value="*{uname}"已经被替换成了th:value="${uname}"。

    	<form action="/user" th:action="@{/user/login}" method="post" th:object="${user}">
    		<table>
    			<tr>
    				<td>用户名:</td>
    				<td><input type="text" name="uname" th:value="${uname}"/></td>
    			</tr>
    			<tr>
    				<td>密码:</td>
    				<td><input type="password" name="upassword" th:value="${upassword}"/></td>
    			</tr>
    			<tr>
    				<td colspan="2" align="center"><input type="submit" value="提交" /></td>
    			</tr>
    		</table>
    	</form>

           可以看到,访问localhost:8080/user/loginUI是没有问题的。那么为什么会这样,我判断是因为,和*{uname}不同,${uname}是不需要理会上一级中的th:object="${user}"的,因此在这里没有报错(因为表单提交是前台准备传给后台数据,如果前台接收后台传来的数据,就不可能直接写${uname}了,而是需要写${user.uname})。

     

    三、去除th:object之后的访问

           1)星号变量(前台th:object不存在,后台model.addAttribute("user", new User())存在)

           如下图所示,我们现在将前台login.html中的th:object="${user}"去掉,但后台不变, 即model.addAttribute("user", new User())依然存在。

    	<form action="/user" th:action="@{/user/login}" method="post" >
    		<table>
    			<tr>
    				<td>用户名:</td>
    				<td><input type="text" name="uname" th:value="*{uname}"/></td>
    			</tr>
    			<tr>
    				<td>密码:</td>
    				<td><input type="password" name="upassword" th:value="*{upassword}"/></td>
    			</tr>
    			<tr>
    				<td colspan="2" align="center"><input type="submit" value="提交" /></td>
    			</tr>
    		</table>
    	</form>
    @Controller
    @RequestMapping("/user")
    public class UserController{
    
    	@GetMapping("/loginUI")
    	public String loginUI(Model model) {
    		model.addAttribute("user", new User());
    		return "/pages/login";
    	}
    
    }

           对localhost:8080/user/loginUI的访问也是没有问题的。

           2)美元变量(前台th:object不存在,后台model.addAttribute("user", new User())存在)

           如下图所示,将"*{uname}"已经替换为了"${uname}"。

    	<form action="/user" th:action="@{/user/login}" method="post" >
    		<table>
    			<tr>
    				<td>用户名:</td>
    				<td><input type="text" name="uname" th:value="${uname}"/></td>
    			</tr>
    			<tr>
    				<td>密码:</td>
    				<td><input type="password" name="upassword" th:value="${upassword}"/></td>
    			</tr>
    			<tr>
    				<td colspan="2" align="center"><input type="submit" value="提交" /></td>
    			</tr>
    		</table>
    	</form>

           对localhost:8080/user/loginUI的访问依然没有问题。

           3)星号变量(前台th:object不存在,后台model.addAttribute("user", new User())也不存在)

           现在,在login.html中为星号变量("*{uname}")的情况下,我们来尝试将后台的model.addAttribute("user", new User())去掉,即取消后台对前台表单提交此值为空的user。

    @Controller
    @RequestMapping("/user")
    public class UserController{
    
    	@GetMapping("/loginUI")
    	public String loginUI() {
    		// model.addAttribute("user", new User());
    		return "/pages/login";
    	}
    
    }

           结果,对localhost:8080/user/loginUI的访问仍没有问题。

           4)美元变量(前台th:object不存在,后台model.addAttribute("user", new User())也不存在)

           接着,将前台的星号变量改为美元变量("*{uname}"改为"${uname}"),同时也将后台的model.addAttribute("user", new User())去掉。

           结果,对localhost:8080/user/loginUI的访问也没有问题。

     

    四、总结

           总的来看,我们尝试了很多种情况,通过改变前台有无th:object和后台有无User传递到前台,最终发现,除了前台有th:object="${user}"且th:value="*{uname}"(星号变量)的时候,后台是必须有一个User对象传递到前台给${user}的。其他各种情况,前台th:object是否存在和后台是否有User对象传递到前台,都不会导致访问localhost:8080/user/loginUI后跳转到的/templates//pages/login.html页面报错。

    展开全文
  • 若直接使用th:object 分解对象后,在搭配th:field="${#dates"使用#dates.format会抛出下面的异常: ------------------------------------------------------- 若搭配th:field="*{#dates"使用#dates.format会...

    若直接使用th:object 分解对象后,在搭配th:field="${#dates"使用#dates.format会抛出下面的异常:

     

    -------------------------------------------------------

     若搭配th:field="*{#dates"使用#dates.format会抛出下面的异常:

     

     

    最后只能够这样,直接用th:value,则可以正常格式化这个日期时间的值

     

     ----------------------------------

    因为#dates.format 必须要用 ${ 开头才能命中这个方法。而用th:object后,就会分解这个bean的字段,所以最后只能用回th:value,该日期时间字段值再用变量点出来则可

     

    转载于:https://www.cnblogs.com/KAI0725/p/10108611.html

    展开全文
  • spring-boot(thymeleaf)中th:field和th:value的区别

    万次阅读 多人点赞 2019-01-17 21:51:01
    spring-boot中th:field和th:value的区别 一:常用th:标签简介: 我们再用spring-boot框架的时候,可能不会采用我们以往用的jsp页面的方式,而是通过采用thymeleaf渲染的方式进行 前后台数据的交互。常用的标签有 ...

                                   spring-boot中th:field和th:value的区别

    一:常用th:标签简介:

    我们再用spring-boot框架的时候,可能不会采用我们以往用的jsp页面的方式,而是通过采用thymeleaf渲染的方式进行

    前后台数据的交互。常用的标签有

    th:href,用法:th:href="/brand/selectbrand",(用来指明要要跳转的链接)

    th:object,用法:th:object="${brand}",(用来接受后台传过来的对象)

    样例:

        <form class="form form-horizontal" id="form-admin-add" action="#" th:action="@{/brand/updatebyid}" th:object="${brand}">

    th:field,用法:th:field="*{name}",(用来绑定后台对象和表单数据)

    th:value,用法:th:value="${brand.name}",(用对象对name值替换value属性)

    总结:th:field

    样例:

    <form class="form form-horizontal" id="form-admin-add" action="#" th:action="@{/brand/updatebyid}" th:object="${brand}">

            <input type="text" class="input-text" value="" th:value="*{id}" name="id" />

            <input type="text" class="input-text"  value="" th:field="*{code}" placeholder="" id="code"/>

    th:field和th:value的小结:

    thymeleaf里的th:field等同于th:nameth:value,浏览器在解析th:field的时候,会解析成name="${th:field}"的值。

    然后后台就可以接收到从前台传过来的值。而th:value可以接受到后台的的值,后台则可以根据name获取到前台的值。

    th:field和th:value都有两种从后台接受值的方式:1、${obj.name} 2、*{name}。需要注意的是,th:field需要有th:object

    指定前台传过来的参数,否则浏览器在解析的时候会出现错误。

    th:each,用法:th:each="brand:${pageInfo.list}",(后台把对象放在了pageinfo的分页插件的List里,然后用th:each遍

    历后台传过来的对象)。

    样例:

    <tr class="text-c" th:each="order:${pageInfo.list}">
         <td th:text="${order.id}"></td>
         <td th:text="${order.dicMethodDescription}"></td>
         <td th:text="${order.productBrandName}"></td>
         <td th:text="${order.productModelName}"></td>

    th:if,用法:th:if="${pageInfo.list.size() == 0}",(判断传过来的对象是否为空,如果为空,则执行...)

    th:unless,用法:th:unless="${pageInfo.list.size() == 0}"(判断传过来的对象是否为空,如果不为空,则执行...)

    标签只有在th:if中条件成立时才显示,th:unless于th:if恰好相反,只有表达式中的条件不成立,才会显示其内容。

    样例:

    <td th:if="${order.productStateName}==部分退款" th:text="交易成功" class="validate"></td>
    <td th:unless="${order.productStateName}==部分退款" th:text="${order.productStateName}"></td>

    三:thymeleaf实现动态访问controller:

    我们一般链接地址都是写死了的,这样其实间接的降低了系统的灵活性,我们可以在th:href的链接里添加参数,这样

    就可以动态的访问controller,举个栗子:

    //static页面层:

    <a title="编辑信息" href="javascript:;" th:οnclick="'javascript:brand_edit(\'编辑品牌信息\',\'/brand'+@{/updatebyid}+'/'+${brand.id}+'\',800,400)'" class="ml-5" style="text-decoration:none"><i class="Hui-iconfont">&#xe6df;</i></a>

    //controller层:

        //根据品牌名更改品牌的名称和编号信息
        @RequestMapping(value = "/updatebyid/{id}")
        public String updatebyidBefore(Model model, @ModelAttribute(value = "brand") ProductBrand brand,
                @PathVariable("id") Long id) {
            // 根据ID查询用户 和对应的角色
            brand = operatebrand.selectByPrimaryKey(id);
            // 查询对应用户的角色
            model.addAttribute("brand", brand);
            return "maintenance-operate/editor-brand";
        }

    四:对数据库的数据灵活筛选:

    一般我们在访问数据库的时候,可能在数据库中查询的时候写出我们固定需要的值,比如我们想要查的字段需要在某一

    范围内,例如需要查出状态表的状态在(1,3,5,7)状态里。这些状态可以在状态的字典表里查出。

    你可能想到会这样写:select id ,name,code from table where state in(1,3,5,7)。但是别人也想查对应的字段,但是筛选

    的状态不同,比如他筛选的是2,4,6,8。这时候他可能又需要写一套select语句。则这样也失去的代码灵活性。

    我们可以传一个状态数组进去,这时候就会根据状态数组的值来进行筛选。我们来看看实现。

    ServiceImpl层:

    List<OrderInfoForm> result = null;
    result=orderMapper.selectOrdersByStatesSelective(order, new Integer[] {3,4,6,7,8});

    dao层:

    List<OrderInfoForm> selectOrdersByStatesSelective(@Param(value="order")Order order,
        @Param(value="states")Integer[] states);

    mapper层:

    <select id="selectOrdersByStatesSelective" resultMap="AllResultMap" >
        select 
        <include refid="All_Column_List" />
        from order_list
    	LEFT JOIN product_method ON product_method.`code` = order_list.purchase_method
    	LEFT JOIN product_color ON product_color.`code` = order_list.color
    	LEFT JOIN product_guarantee ON product_guarantee.`code` = order_list.guarantee
    	LEFT JOIN product_info ON order_list.product_id = product_info.id
    	LEFT JOIN product_model ON product_info.model = product_model.`code`
    	LEFT JOIN product_standard ON product_info.standard = product_standard.`code`
    	LEFT JOIN product_state ON product_state.`code` = order_list.order_state
    	LEFT JOIN product_apperance ON product_apperance.`code` = order_list.apperance
    	LEFT JOIN product_brand ON product_brand.`code` = product_info.brand
        <where>
        	<if test="order.orderNum != null " >
    	        order_num like "%"#{order.orderNum,jdbcType=VARCHAR}"%"
    	    </if>
    	    <if test="order.operator != null " >
    	        and operator like "%"#{order.operator,jdbcType=VARCHAR}"%"
    	    </if>
    	    <if test="order.purchaseTime != null" >
    	        and purchase_time = #{order.purchaseTime,jdbcType=DATE}
    	    </if>
    	    <if test="order.orderState != null" >
    	        and order_state = #{order.orderState,jdbcType=VARCHAR}
    	    </if>
    	    <if test="order.serialNum != null" >
    	        and serial_num like "%"#{order.serialNum,jdbcType=VARCHAR}"%"
    	    </if>
    	    
    		<if test="states != null and states.length >0">
    			<foreach collection="states" item="state" separator="," open=" and order_state in (" close=")">
    				#{state,jdbcType=BIGINT}
    			</foreach>
    		</if>
    	</where>
      </select>

    注意最后的test的条件:

    解释一下各个的参数:

    1、foreach collection="传过来的状态数组名称"

    2、item="state"用于遍历每个状态

    3、separator=",":用于分割各个状态

    4、open=" 用于在对应位置添加双引号

    5、and order_state in (" close=")"用于在对应结束位置添加双引号

    展开全文
  • 一、th:if gt: great than(大于)> ge: great equal(大于等于)>= eq: equal(等于)== lt: less than(小于)< le: less equal(小于等于)<= ne: not equal(不等于)!= 写法如下,其它写法...
  • thymeleaf中的th:常用标签

    千次阅读 2019-02-15 09:06:36
    th: 的常用标签  关键字 功能介绍 案例  th:id 替换id &lt;input th:id="'xxx' + ${collect.id}"/&gt;  th:text 文本替换 &lt;p th:text="${collect.description}"&gt...
  • thymeleaf中th:field和th:value的区别

    千次阅读 2019-12-12 15:44:40
    一:常用th:标签简介: 我们再用spring-boot框架的时候,可能不会采用我们以往用的jsp页面的方式,而是通过采用thymeleaf渲染的方式进行 ...th:object,用法:th:object="${brand}",(用来接受后台传过来的对象) ...
  • 关于Thymeleaf在form表单中使用th:value失效(无值)问题 场景说明 后端通过ModelAndView返回一个param名称的vo对象,并设置返回的模板名称 modelAndView.addObject("param", paramVo);// form表单显示对象 ...
  • 1. th:field <input name="a2" id="a2" th:field="${aaa.a1}"/> 实际解析为 <input name="a1" id="a2" /> th:field里包含有id、name属性,会替换自定义的name名称,不能替换自定义的id名称 2. th...
  • thymeleaf中th:attr用法 1、写死的单个属性值添加 th:attr="class=btn" 2、写死的多个属性值添加 th:attr="class=btn,title=link" 3、当一个属性的值较多的时候可以用 | th:attr="class=|btn btn-group|" ...
  • 标签可以用于设置变量值和对象属性一样,Thymeleaf 中可以使用 th:with 进行指定局部变量,局部变量是指定义在模版⽚段中的变量,并且该变量的作⽤域为所在的模版⽚段。 &lt;tr th:each="user : ${user...
  • th:text="${ '编号:' + device.deviceSerial + '      设备名:' + device.deviceName}" th:attr="value=${device}"> layui.use(['form', 'layer', 'element']...
  • 我们知道要想通过th:field取值,前面必须要有th:object; th:object表示获取的表单或者后台数据对象;th:field只是从该对象中取出响应的属性; <form id="form1" th:object="${animal}"> <input id=...
  • thymeleaf 之 th:each迭代循环对象集合

    千次阅读 2018-09-10 13:42:07
    th:each属性用于迭代循环,语法:th:each="obj,iterStat:${objList}" 迭代对象可以是java.util.List,java.util.Map,数组等; iterStat称作状态变量,属性有:  index:当前迭代对象的index(从0开始计算...
  • Thymeleaf的th标签的应用

    千次阅读 2019-03-08 11:54:39
    1、变量表达式 ${……} 例子:&lt;input type="text" name="userName" value="James Carrot" th:value="...div th:object="${session.user}"&gt; &a
  • Thymeleaf教程(三)th标签整理

    万次阅读 热门讨论 2017-04-29 20:21:21
    1、简单表达式 变量表达式 ${... ...} 上述代码为引用user对象的name属性值 选择/星号表达式*{*** ***} Nationality: Saturn. 选择表达式一般跟在th:object后,
  • 在thmeleaf页面渲染list数据的时候,list里面包含list,如何展示?
  • 关于使用th:text获取不到值

    千次阅读 2020-02-07 23:04:39
    可以将返回值改为Model或者Object类型。 @PostMapping ( "/login" ) public Object login ( @RequestParam String username , @RequestParam String password , HttpSession session , Model ...
  • 文章目录th:each 循环迭代循环基本用法获取迭代状态条件判断th:ifth:unlessth:switch th:each 循环迭代 循环基本用法 1、对于信息页面,数据格式是一样时,页面通常都是循环迭代它们,写过 JSP 的 JSTL 的就知道,...
  • Springboot+Thymeleaf中常用的th标签

    千次阅读 2019-06-15 11:26:43
    记录一下。 关键字 功能介绍 案例 th:id 替换id <input th:id="'xxx' + ${collect.id}"/> th:text 文本替换 <p th:text="${collect.description}">description</p>...th:ute...
  • th:*使用原因: for the sake of simplicity and compactness of the code samples(简化代码) the th:*notation is more general and allowed in every Thymeleaf template mode (XML, TEXT…)(th:*在多个...
  • HTML中th标签

    千次阅读 2019-05-21 21:10:29
    .html中所有th标签关键字 功能介绍 案例 th:id 替换id th:text 文本替换 description th:utext 支持html的文本替换 content th:object 替换对象 th:value 属性赋值 th:with 变量赋值运算 th:style 设置样式 th:...
  • Mark一个关于Thymeleaf 使用th:field属性与对象属性绑定的小问题 最近在尝试用Spring Boot + Thymeleaf搭建一个个人博客,其中Article类中有一个属性如下定义: private List&lt;String&gt; ...
  • Thymeleaf常用th标签

    万次阅读 多人点赞 2018-12-14 14:57:12
    Thymeleaf常用th标签 关键字 功能介绍 案例 th:id 替换id &lt;input th:id="'xxx' + ${collect.id}"/&gt; th:text 文本替换,包括html标签 若home.welcome=Welcome ...
  • th:value和th:field中遇到的问题 <input th:value="*{userName}" type="text"> 等同于 <input value="userName返回的值" type="text"> <input type="text" th:field="*{userName}" > 等同于 &...
  • thymeleaf 如何用th:each 做条件遍历

    千次阅读 2020-03-30 13:35:15
    } } 步骤 5 : 普通遍历 使用 th:each 遍历  class="showing"> 遍历h2> <table> <thead> <tr> <th>idth> <th>产品名称th> <th>价格th> tr> thead> <tbody>  th:each="p: ${ps}">  th:text="${p.id}">td>  th:...
  • thymeleaf中th标签整理

    千次阅读 2017-07-20 14:21:42
    th标签整理  1)简单表达式  --变量表达式 ${……}  上述代码为引用user对象的name属性值。  --选择/星号表达式 *{……} Nationality: Satur
  • [ thymeleaf ] - th:field和th:value的区别

    千次阅读 2020-05-19 15:57:02
    th:field 用法:th:field="*{name}",(用来绑定后台对象和表单数据) th:value 用法:th:value="${brand.name}",(用对象对name值替换value属性) thymeleaf里的th:field等同于th:name和th:value,浏览器在解析th:...
  • thymeleaf使用详解

    2018-03-08 12:20:53
    被指定的objectth:object属性定义: <div th:object="${book}"> ... <span th:text="*{title}">...</span> ... </div> 文字国际化表达式 文字国际化表达式允许我们从一个外部文件获取区域文字信息(....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,749
精华内容 38,299
热门标签
关键字:

th:object