Spring MVC + thymeleaf + html 在页面上无法获取session的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC + thymeleaf + html 在页面上无法获取session的值相关的知识,希望对你有一定的参考价值。

1、首先用户登录成功后,走如下方法,然后将参数redirectURL保存到RedirectAttributes中,然后在重定向到index.html
@RequestMapping("/")
public String toIndex(HttpServletRequest request,RedirectAttributes attr)
String redirectURL = request.getParameter("redirectURL");
if (!StringUtils.isEmpty(redirectURL))
attr.addFlashAttribute("redirectURL", redirectURL);

HttpSession session1 = request.getSession();
session1.setAttribute("redirectURL1", redirectURL);

return "redirect:html/index.html";


2、html取值如下:

<div th:text="$session.redirectURL1">未知</div>
<div th:text="$sessionScope['org.springframework.web.servlet.support.SessionFlashMqingapManager.FLASH_MAPS'][0]['redirectURL']">未知</div>

参考技术A Request参数
假设请求的url为:/user/get?id=12
1、访问参数id可以使用param前缀,例如:$param.id!=null检查是否有参数id;
2、参数是一个数组,因为它可以多值比如?id=a&name=test,所以可以采用下标的方式访问,例如:

<p th:text="$param.q[0]" th:unless="$param.q == null">11</p>
3、还有一种访问方式是使用#httpServletRequest对象,可以直接进入javax.servlet.http.HttpServletRequest对象,例如:
<p th:text="$#httpServletRequest.getParameter('id')
th:unless="$#httpServletRequest.getParameter('id') ==
null">11</p>
Session属性
比如后台为session添加了一个sessionValue属性,和Request参数访问方式类似,这里使用session前缀:
<div th:text="$session.sessionValue">[...]</div>
同样的,还可以使用#httpSession方式访问,它直接进入javax.servlet.http.HttpSession对象。
ServletContext属性
1、ServletContext属性可以在request和session中共享,未来访问ServletContext属性,可以使用application前缀:
比如后台为ServletContext添加了一个myContextAttribute属性,那么我们可以这样访问:<div th:text="$application.myContextAttribute">[...]</div>
2、<div th:text="$application.size()">33</div> 将返回application的数量;
3、输出其所有键值对:

<div th:each="attr:$application.keySet()">
<span th:text="$attr">key</span>
<span th:text="$application.get(attr)">value</span>
</div>
Spring beans
Thymeleaf可以通过@beanName访问Spring应用上下文中注册的bean,如<div th:text="$@urlService.getApplicationUrl()">...</div>
在这个例子中,@urlService就是在上下文中注册的Spring Bean的名字

Thymeleaf + Spring MVC中的绑定复选框

【中文标题】Thymeleaf + Spring MVC中的绑定复选框【英文标题】:Binding checkbox in Thymeleaf + Spring MVC 【发布时间】:2016-05-27 16:59:53 【问题描述】:

我的 Spring MVC 应用基于 Spring boot 1.2.8、Thymeleaf、Hibernate 和 Hateos。我有一个实体“市场”,其中包含布尔类型的“启用”字段。

@Entity
@Table(name = "market")
public class Market 
.....
private Boolean enabled;
....
public Boolean getEnabled() 
        return enabled;
    

    public void setEnabled(Boolean enabled) 
        this.enabled = enabled;
    

“/create”控制器中的代码

@RequestMapping(value = "/create", method = RequestMethod.GET)
public ModelAndView create() 
    return new ModelAndView("market/create")
            .addObject("list", linkTo(methodOn(MarketController.class).list())
                    .withRel("List"))
            .addObject("market", new Market())
            .addObject("postLink",
                    linkTo(methodOn(MarketController.class).save(null, null, null, null))
                            .withRel("Save"));

模板“市场/创建”,参考。 http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#checkbox-fields

    <form th:action="$postLink.href" th:object="$market" method="post">
        ....
        <div class="form-group">
            <label th:for="$#ids.next('enabled')" th:text="#market.enabled">Enabled</label>
            <input type="checkbox" th:field="*enabled" />
        </div>
        ....
    </form>

在浏览器中打开 /markets/create 时,勾选复选框出现以下异常

Cause: org.thymeleaf.exceptions.TemplateProcessingException Attribute "value" is required in "input(checkbox)" tags when binding to non-boolean values 

为什么 Thymeleaf 将“启用”字段视为非布尔类型?我已尽我所能找出原因,但徒劳无功。请给出一些提示来解决它。谢谢。

【问题讨论】:

【参考方案1】:

控制器

@Controller
public class BaseController 

    @GetMapping("/")
    private String index(DemoDto demoDto)
        return "index";
    

    @PostMapping("/")
    private String receiveValues(DemoDto demoDto) 
        System.out.println(demoDto);
        return "index";
    


DTO

public class DemoDto 
    private String name;
    private boolean global;

    //getter setter for name

    public boolean isGlobal() 
        return global;
    
    public void setGlobal(boolean global) 
        this.global = global;
    

    //toString()

HTML

<body>
    <form th:action="@/" th:method="post" th:object="$demoDto">
        <label>Enter Name:</label> 
            <input type="text" th:field="*name" name="name"> 
        <br/>
        <label>Global</label>
            <input type="checkbox" th:field="$demoDto.global"/>
        <input type="submit" value="Submit">
    </form>

</body>

这里最重要的是你如何定义th:field="$demoDto.global"$ 和对象名称 demoDto 都是必需的。

会生成html代码。

<body>
    <form action="/" method="post">
        <label>Enter Name:</label> 
            <input type="text" name="name" id="name" value=""> 
        <br/>
        <label>Global</label>
            <input type="checkbox" id="global1" name="global" value="true"/>
            <input type="hidden" name="_global" value="on"/>
        <input type="submit" value="Submit">
    </form>

</body>

从 ui 提交时收到:

DemoDto [name=Dev, global=true]

【讨论】:

非常感谢!我最终找到了如何使用复选框实现表单的简单易懂的示例。请问您可以添加带有多个复选框的示例吗?【参考方案2】:

无论如何,属性value是必需的。

试试这样的:&lt;input type="checkbox" th:field="*enabled" value="true" /&gt;。检查输入时,enabled 字段应由true 设置; nullotherwise。

【讨论】:

感谢大卫,我之前尝试过使用“值”,但保存在 DB 中时它会被忽略。据我了解,没有必要在表单中添加“价值”,由春豆支持,由百里香完成。如果我错了,请纠正我。例子。 github.com/thymeleaf/thymeleafexamples-stsm/blob/2.1-master/src/…,寻找 你是对的,对不起,我弄错了,如果你删除value属性,属性enabled应该被初始化。 是的,也试过了。在实体类中设置了“private Boolean enabled = Boolean.FALSE”,但 thymeleaf 并未将其视为“布尔值”并继续抛出异常。我正在查看示例github.com/thymeleaf/thymeleafexamples-stsm/blob/2.1-master/src/…,它有一个布尔类型的“覆盖”字段。 在生成的 HTML 中是否有 value 属性且具有非空值?根据源码可知,post过程中value为null时会触发该异常。【参考方案3】:

尝试将您的属性命名为“启用”以外的其他名称,也许是“市场启用”。

【讨论】:

以上是关于Spring MVC + thymeleaf + html 在页面上无法获取session的值的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC thymeleaf 随机崩溃

Thymeleaf 和 Spring MVC 的表单参数为空

Spring-Boot + Spring-MVC + Thymeleaf + Apache Tiles

Spring MVC 和 Thymeleaf 资源版本控制

Thymeleaf + Spring MVC中的绑定复选框

Spring MVC 3.2 Thymeleaf Ajax 片段