- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这周我一直在尝试在网络开发中做一件非常简单的事情:一个带有复选框的表单,我可以在其中勾选哪些机构参与了竞赛。
代理机构 --> ContestAgency <-- 竞赛
比赛类别:
// i tried also EAGER
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.contest", cascade=CascadeType.ALL)
private Set<ContestAgency> contestAgencies = new TreeSet<ContestAgency>();
代理类别:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.agency", cascade=CascadeType.ALL)
private Set<ContestAgency> contestAgencies = new TreeSet<ContestAgency>();
如何在 WebFlow 或 Controller 中制作带有复选框的表单?
谢谢
最佳答案
我找到了解决方案。我不认为这是最好的,但它有效:
在 View 中,我为所有复选框指定了名称(chk_services、chk_agcies)
在过渡到下一步时,我采用 POST 生成的逗号分隔字符串以及已检查的 ID(id1、id2、...),然后传递给方法它分割字符串,对于每个 id,从数据库中获取相关实体并将它们放入我的多对多实体集(ContestService)中
< evaluate expression="contestFlow.converterCheckboxToSetContestService(flowScope.contest, requestParameters.chk_services)" result="flowScope.contest.ContestServices"> < /evaluate >
(当我进入下一步和上一步时我都会这样做)
< set name="viewScope.checked_services" value="contestFlow.converterSetContestServiceToCheckbox(flowScope.contest.ContestServices)" / >
在 View 中,我查看是否选中每个复选框:
th:checked="${#lists.contains(checked_services, '' + service_el.id)}"
注意:需要 '' + service_el.id,没有 '' + 则不起作用
我发布完整代码。我希望有人会觉得它有用。
欢迎任何改进和建议。
Web应用程序配置(我正在使用java注释):使用流程中使用的方法配置 bean
public class WebAppConfig extends WebMvcConfigurerAdapter {
//...
@Bean
public ContestFlow contestFlow()
{
return new ContestFlow();
}
}
使用我的方法的 ContestFlow bean:
@Component
public class ContestFlow {
static Logger logger = LoggerFactory.getLogger(ContestFlow.class);
@Autowired
private ServiceService ServiceService;
@Autowired
private AgencyService AgencyService;
/**
* input: a comma separated string with all ids checked from the POST
*
* @param contest: contest object that i will add at the end of the webflow
* @param ids_string: comma separated string with checked ids
* @return
*/
public Set<ContestService> converterCheckboxToSetContestService(Contest contest, String ids_string)
{
Set<ContestService> contestServices = new HashSet<ContestService>(0);
if (ids_string != null)
{
String[] arr_ids = ids_string.split(",");
/*
* for each record i get the Service
*/
for (int i = 0; i < arr_ids.length; i++)
{
try
{
//get the Service
Service service = ServiceService.getService(Integer.parseInt(arr_ids[i]));
logger.info("Aggiungo il service id [" + arr_ids[i] + "]");
//creation of the Id object
ContestServiceId contestServiceId = new ContestServiceId();
contestServiceId.setService(service);
contestServiceId.setContest(contest);
//record population
ContestService contestService = new ContestService();
contestService.setService(service);
contestService.setContest(contest);
contestService.setPk(contestServiceId);
//add the record
contestServices.add(contestService);
}
catch(Exception ex)
{
ex.printStackTrace();
logger.info("Service id [" + arr_ids[i] + "] not found!");
}
}
}
return contestServices;
}
/**
* input: Set of ContestAgency (many-to-many) checked
* and returns a List<String> of ids to be used to select checkboxes
* in thymeleaf view with th:checked="${#lists.contains(checked_agencies, '' + agency_el.id)}"
*
* i can't return a List<Integer> because it doesn't check the checkboxes
*
* @param contestAgencies
* @return
*/
public List<String> converterSetContestServiceToCheckbox(Set<ContestService> contestServices)
{
List<String> result = new ArrayList<String>();
if (contestServices != null)
{
Iterator<ContestService> iterator = contestServices.iterator();
while(iterator.hasNext())
{
ContestService contestService = iterator.next();
Integer id = contestService.getService().getId();
result.add(id.toString());
}
}
return result;
}
//same as above, for the Agencies:
/**
* input: a comma separated string with all ids checked from the POST
*
* @param contest: contest object that i will add at the end of the webflow
* @param ids_string: comma separated string with checked ids
* @return
*/
public Set<ContestAgency> converterCheckboxToSetContestAgency(Contest contest, String ids_string)
{
Set<ContestAgency> contestAgencies = new HashSet<ContestAgency>(0);
if (ids_string != null)
{
String[] arr_ids = ids_string.split(",");
/*
* for each record i get the Agency
*/
for (int i = 0; i < arr_ids.length; i++)
{
try
{
//get the Agency
Agency agency = AgencyService.getAgency(Integer.parseInt(arr_ids[i]));
logger.info("Adding agency id [" + arr_ids[i] + "]");
//creation of the Id object
ContestAgencyId contestAgencyId = new ContestAgencyId();
contestAgencyId.setAgency(agency);
contestAgencyId.setContest(contest);
//record population
ContestAgency contestAgency = new ContestAgency();
contestAgency.setAgency(agency);
contestAgency.setContest(contest);
contestAgency.setPk(contestAgencyId);
contestAgency.setContractCount(0); //my many-to-many relationship has an additional field
//add the record
contestAgencies.add(contestAgency);
}
catch(RecordNotFoundException ex)
{
ex.printStackTrace();
logger.info("Agency id [" + arr_ids[i] + "] not found!");
}
}
}
return contestAgencies;
}
/**
* input: Set of ContestAgency (many-to-many) checked
* and returns a List<String> of ids to be used to select checkboxes
* in thymeleaf view with th:checked="${#lists.contains(checked_agencies, '' + agency_el.id)}"
*
* i can't return a List<Integer> because it doesn't check the checkboxes
*
* @param contestAgencies
* @return
*/
public List<String> converterSetContestAgencyToCheckbox(Set<ContestAgency> contestAgencies)
{
List<String> result = new ArrayList<String>();
if (contestAgencies != null)
{
Iterator<ContestAgency> iterator = contestAgencies.iterator();
while(iterator.hasNext())
{
ContestAgency contestAgency = iterator.next();
Integer id = contestAgency.getAgency().getId();
result.add(id.toString());
}
}
return result;
}
}
第 2 步 View :带有服务复选框的表单:
<ul class="list-unstyled">
<!--
- parent and children are saved in the same table, so i'm not worried about ids overlapping
-->
<li th:each="service_el : ${services_list}" >
<input type="checkbox" name="chk_services" th:value="${service_el.id}" th:checked="${#lists.contains(checked_services, '' + service_el.id)}"/>
<label th:text="${service_el.title}" th:for="'chk_services' + ${service_el.id}">service</label>
<ul class="list-unstyled-padding">
<li th:each="subservice_el : ${service_el.children}">
<input type="checkbox" name="chk_services" th:value="${subservice.id}" th:checked="${#lists.contains(checked_services, '' + subservice.id)}"/>
<label th:text="${subservice.title}" th:for="'chk_services' + ${service_el.id}">subservice</label>
</li>
</ul>
</li>
</ul>
第 3 步 View :带有代理机构复选框的表单:
<ul class="list-unstyled">
<li th:each="agency_el : ${agencies_list}">
<input name="chk_agencies" type="checkbox" th:id="'chk_agencies' + ${agency_el.id}" th:value="${agency_el.id}" th:checked="${#lists.contains(checked_agencies, '' + agency_el.id)}" />
<label th:text="${agency_el.name}" th:for="'chk_agencies' + ${agency_el.id}">agency</label>
</li>
</ul>
最后:流程xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<secured attributes="ROLE_USER" />
<!-- creation of an empty object i will insert in db in the last step -->
<on-start>
<evaluate expression="ContestService.createContest()" result="flowScope.contest" />
</on-start>
<!--
step 1: contest details
-->
<view-state id="contest-details" model="contest">
<binder>
<binding property="startDate" required="true" />
<binding property="endDate" required="true"/>
<binding property="bonus" required="true"/>
<binding property="goal" required="true"/>
<binding property="title" required="true"/>
</binder>
<transition on="proceed" to="contest-services">
</transition>
<transition on="cancel" to="cancel" bind="false" />
</view-state>
<!--
step 2: i select which services are involved
-->
<view-state id="contest-services" model="contest">
<on-entry>
<!--
- in case i'm coming here from the step 3
- injection of the list of ids previously checked
-->
<set name="viewScope.checked_services" value="contestFlow.converterSetContestServiceToCheckbox(flowScope.contest.ContestServices)" />
<!--
- i get the list of the Main Services
- subservices will be scanned with getChildren method
-->
<set name="viewScope.services_list" value="ServiceService.getMainServices()" />
</on-entry>
<transition on="proceed" to="contest-agencies" >
<!--
- MY SOLUTION TO MANY-TO-MANY checkboxes form:
-
- honestly not very elegant, but in 10 day i could't find better
-
- conversion from String to Set<ContestService>
-->
<evaluate expression="contestFlow.converterCheckboxToSetContestService(flowScope.contest, requestParameters.chk_services)" result="flowScope.contest.ContestServices"></evaluate>
</transition>
<transition on="cancel" to="contest-details">
<!--
- also if i go back in the flow, to the first step,
- i need to remember which checkboxes were selected
-
- and i need to save the checked services to the Contest entity,
- else, when i will call addContest method,
- it will not save the checked Services
-->
<evaluate expression="contestFlow.converterCheckboxToSetContestService(flowScope.contest, requestParameters.chk_services)" result="flowScope.contest.ContestServices"></evaluate>
</transition>
</view-state>
<!--
step 3: i select which agencies are involved in contest.
only agencies enabled for previously checked services are shown
-->
<view-state id="contest-agencies" model="agencies">
<on-entry>
<!--
- in case i'm coming here from the step 3
- injection of the list of ids previously checked
-->
<set name="viewScope.checked_agencies" value="contestFlow.converterSetContestAgencyToCheckbox(flowScope.contest.ContestAgencies)" />
<!--
- only agencies enabled for the step 2 checked services are shown
-->
<set name="viewScope.agencies_list" value="AgencyService.getEnabledAgenciesForServices(contestFlow.converterSetContestServiceToCheckbox(flowScope.contest.ContestServices))" />
</on-entry>
<transition on="proceed" to="contest-confirm" >
<!--
- MY SOLUTION TO MANY-TO-MANY checkboxes form:
-
- honestly not very elegant, but in 10 day i could't find better
-
- conversion from String to Set<ContestAgency>
-->
<evaluate expression="contestFlow.converterCheckboxToSetContestAgency(flowScope.contest, requestParameters.chk_agencies)" result="flowScope.contest.ContestAgencies"></evaluate>
</transition>
<transition on="cancel" to="contest-services">
<!--
- MY SOLUTION TO MANY-TO-MANY checkboxes form:
-
- honestly not very elegant, but in 10 day i could't find better
-
- conversion from String to Set<ContestAgency>
-
- and i need to save the checked Agencies to the Contest entity,
- else, when i will call addContest method,
- it will not save the checked Agencies
-->
<evaluate expression="contestFlow.converterCheckboxToSetContestAgency(flowScope.contest, requestParameters.chk_agencies)" result="flowScope.contest.ContestAgencies"></evaluate>
</transition>
</view-state>
<!--
- data confirmation before insert in db
-->
<view-state id="contest-confirm" model="contest">
<transition on="proceed" to="contest-end" >
<evaluate expression="ContestService.addContest(contest)" />
</transition>
<transition on="cancel" to="contest-agencies" />
</view-state>
<!--
end: redirect to list
-->
<end-state id="contest-end" view="externalRedirect:contextRelative:/contest/list"/>
<!--
cancella
-->
<end-state id="cancel"/>
</flow>
关于java - Spring MVC + hibernate : a form with checkboxes for @manytomany relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24673798/
我有一个我想暂时存储的对象。该对象现在在 Controller 中, Controller 将生成一个 View 。 AJAX 请求从 View 发送到下一个 Controller 。那一刻我需要先前
从MVC 2开始,我们可以轻松创建区域。现在,我的问题与嵌套区域(区域内部的区域)有关。 选择我的“father”区域文件夹,右键单击> Add> NO选项以获取new Area。 是否有可能以其他方
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我已经尝试了一些谷歌搜索和堆栈流搜索,但事实证明这比我想象的要难找到。我需要为我们的商店迁移到 ASP.NET MVC 2 的管理提供理由。最大的帮助将是任何企业级站点或使用 ASP.NET MVC
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我有一些常见的网页,它们将出现在多个 MVC 应用程序中。对于这些页面,我想在不同的 MVC 网站之间重用相同的源代码( Controller + View )。这样做的最佳方法是什么? ASP.NE
我正在使用 Spring MVC 来构建我的应用程序。 当用户在浏览器中运行应用程序时,我想显示一个默认的 jsp。我不想用 web.xml 中的标记。 我想我可以用 我已经创建了一个文件夹并添
我可能在这里分析过度了,但是根据我对 MVC 的阅读,似乎有很多关于如何做事情的观点。 是否有一个“最佳实践”网站或文档来定义 MVC 各个部分的职责? 请记住,我使用 EF/Repository&U
当杰里米和查德 posted about their FubuMvc project ,他们提到的差异化因素之一是他们的“雷霆穹顶校长”: The “Thunderdome Principle” –
我正在为 Spring MVC 应用程序实现缓存清除系统。 为了让这个系统正常工作,我必须从给定的 url 中删除“缓存破坏代码”。假设我生成的缓存破坏代码是“123”,我有一个 .css url:/
在调试 ASP.NET MVC 源时,我发现使用了“MVC-ControllerTypeCache.xml” 文件。但我无法理解这个文件的用途。我的意思是这个文件存储在哪里?asp.net MVc 如
我刚刚在我的本地机器上安装了 Visual Studio 11 和 MVC 4 beta。但是,每当我打开一个 MVC 3 项目(我想保留为 MVC 3)时,所有引用都已更新为版本 4 DLL。当然它
我有一个 MVC 3 应用程序,它具有一些核心功能(最重要的是自动化),但主要用作不同区域或模块的门户。我想将它组织到不同的模块中,只需稍作更改也可以部署为他们自己的网站。 该项目由论坛、博客引擎、用
我有自己的服务器,正在考虑将我的一个解决方案升级到 ASP.NET MVC 4,然后再升级其余的 (3+)。 作为其中的一部分,我下载了 the standalone installer对于 ASP.
构图 我有一个 MVC 项目,其中包含 C# 类,这些类最终通过 ajax 等进行序列化和使用。我使用 TypeLite 生成这些 C# 类的定义( here 讨论了 TypeLite 的替代方案),
我正在尝试了解现代 Web 应用程序架构。在 ASP.NET MVC 中,所有业务逻辑类都在 Model 中,Controller 接受并引导用户请求。如果我使用它,是否可以使用本身是 MVC 架构但
我有一个带有 OWIN 的 WebAPI 2 应用程序。现在我正在尝试向所有内容添加一个 MVC 5 Controller ,但没有找到我的 MVC 路由。我收到以下错误: No HTTP resou
在 MVC 3 中,他们添加了我一直在使用的依赖解析器。在回答某人对您发表评论的问题时,您应该使用 Ninject MVC 3 插件。 所以我的问题是为什么要使用它而不是内置的?如果这是要走的路,你如
我是 ASP.NET MVC 的新手,我正在寻找最不痛苦的方法来设置全局错误处理、日志记录和报告(通过电子邮件)。仅供引用,我的 ASP.NET MVC 应用程序在 Azure 中作为 Web 角色托
何时使用 MVC View 页面和 MVC View 内容页面?它们有什么区别? 最佳答案 **MVC View Page 用于创建页面,MVC VewP Content Page 用于创建页面并指定
我是一名优秀的程序员,十分优秀!