自己定义表单一定会涉及<s:iterator/>迭代,一个复杂的自己定义表单可能会嵌套n多层迭代。

比方一个自己定义一个问卷调查页面涉及3个模型:一个Survey代表一个调查。一个Page代表一个页面。一个Question代表一个问题。

每一个问题中会包括不同的表单元素,就会涉及迭代。

3个模型类例如以下:

Survey

package com.atguigu.surveypark.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set; /**
* 调查类
*/
public class Survey {
private Integer id;
private String title = "未命名";
private String preText = "上一步";
private String nextText = "下一步";
private String exitText = "退出";
private String doneText = "完毕";
private Date createTime = new Date(); //建立从Survey到User之间多对一关联关系
private User user ; //建立从Survey到Page之间一对多关联关系
private Set<Page> pages = new HashSet<Page>(); public Set<Page> getPages() {
return pages;
} public void setPages(Set<Page> pages) {
this.pages = pages;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getPreText() {
return preText;
} public void setPreText(String preText) {
this.preText = preText;
} public String getNextText() {
return nextText;
} public void setNextText(String nextText) {
this.nextText = nextText;
} public String getExitText() {
return exitText;
} public void setExitText(String exitText) {
this.exitText = exitText;
} public String getDoneText() {
return doneText;
} public void setDoneText(String doneText) {
this.doneText = doneText;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} }

Page

package com.atguigu.surveypark.model;

import java.util.HashSet;
import java.util.Set; /**
* 页面类
*/
public class Page {
private Integer id;
private String title = "未命名";
private String description; //简历从Page到Survey之间多对一关联关系
private Survey survey; //简历从Page到Question之间一对多关联关系
private Set<Question> questions = new HashSet<>(); public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getDescription() {
return description;
} public void setDescription(String description) {
this.description = description;
} public Survey getSurvey() {
return survey;
} public void setSurvey(Survey survey) {
this.survey = survey;
} public Set<Question> getQuestions() {
return questions;
} public void setQuestions(Set<Question> questions) {
this.questions = questions;
} }

Question

package com.atguigu.surveypark.model;

/**
* 问题类
*/
public class Question {
//
private Integer id;
// 题型0-8
private int questionType;
//
private String title;
// 选项
private String options; // 其它项
private boolean other; // 其它项样式:0-无 1-文本框 2-下拉列表
private int otherStyle; // 其它项下拉选项
private String otherSelectOptions; // 矩阵式行标题集
private String matrixRowTitles; // 矩阵式列标题集
private String matrixColTitles;
// 矩阵是下拉选项集
private String matrixSelectOptions; //建立从Question到Page之间多对一关联关系
private Page page; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public int getQuestionType() {
return questionType;
} public void setQuestionType(int questionType) {
this.questionType = questionType;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getOptions() {
return options;
} public void setOptions(String options) {
this.options = options;
} public boolean isOther() {
return other;
} public void setOther(boolean other) {
this.other = other;
} public int getOtherStyle() {
return otherStyle;
} public void setOtherStyle(int otherStyle) {
this.otherStyle = otherStyle;
} public String getOtherSelectOptions() {
return otherSelectOptions;
} public void setOtherSelectOptions(String otherSelectOptions) {
this.otherSelectOptions = otherSelectOptions;
} public String getMatrixRowTitles() {
return matrixRowTitles;
} public void setMatrixRowTitles(String matrixRowTitles) {
this.matrixRowTitles = matrixRowTitles;
} public String getMatrixColTitles() {
return matrixColTitles;
} public void setMatrixColTitles(String matrixColTitles) {
this.matrixColTitles = matrixColTitles;
} public String getMatrixSelectOptions() {
return matrixSelectOptions;
} public void setMatrixSelectOptions(String matrixSelectOptions) {
this.matrixSelectOptions = matrixSelectOptions;
} public Page getPage() {
return page;
} public void setPage(Page page) {
this.page = page;
}
}

一个自己定义表单

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>设计调查</title>
<link rel="stylesheet" type="text/css" href='<s:url value="/styles.css" />'>
<script type="text/javascript" src="<s:url value="/jquery-1.7.1.js" />"></script>
<script type="text/javascript">
$(function(){
$("a[href*=delete]").click(function(){
return confirm("删除该项?");
});
});
</script>
</head>
<body>
<s:include value="header.jsp" />
<s:set var="sId" value="id" />
<table>
<tr>
<td colspan="2" class="tdWhiteLine"></td>
</tr>
<tr>
<td colspan="2" class="tdHeader">设计调查</td>
</tr>
<tr>
<td colspan="2" class="tdWhiteLine"></td>
</tr>
<tr>
<td class="tdSHeaderL">
<!-- 调查标题 -->
<s:property value="title" />
</td>
<td class="tdSHeaderR">
添加Logo 
编辑调查 
添加页 
</td>
</tr>
<tr>
<td colspan="2" style="text-align: left;vertical-align: top;">
<table>
<tr>
<td width="30px"></td>
<td width="*">
<table>
<!-- 迭代页面集合 -->
<s:iterator var="p" value="pages">
<s:set var="pId" value="#p.id" />
<tr>
<td>
<table>
<tr>
<!-- 页面标题 -->
<td class="tdPHeaderL"><s:property value="#p.title" /></td>
<td class="tdPHeaderR">
编辑页标题 
移动/复制页 
添加问题 
删除页 
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td width="30px"></td>
<td width="*">
<table>
<tr>
<td>
<table>
<!-- 迭代问题集合 -->
<s:iterator var="q" value="#p.questions">
<s:set var="qId" value="#q.id" />
<tr>
<!-- 问题题干 -->
<td class="tdQHeaderL"><s:property value="#q.title" /></td>
<td class="tdQHeaderR">
编辑问题 
删除问题 
</td>
</tr>
<tr>
<td colspan="2" style="text-align: left;color: black;background-color: white">
<!-- 定义变量,设置第一大类的题型 -->
<s:set var="qt" value="#q.questionType" />
<!-- 推断当前题型是否属于第一大类(0,1,2,3) -->
<s:if test='#qt lt 4'>
<s:iterator value="#q.optionArr">
<input type='<s:property value="#qt < 2? 'radio':'checkbox'" />'><s:property />
<s:if test="#qt == 1 || #qt == 3"><br></s:if>
</s:iterator>
<!-- 处理other问题 -->
<s:if test="#q.other">
<input type='<s:property value="#qt < 2?'radio':'checkbox'" />'>其它
<!-- 文本框 -->
<s:if test="#q.otherStyle == 1">
<input type="text">
</s:if>
<!-- 下拉列表 -->
<s:elseif test="#q.otherStyle == 2">
<select>
<s:iterator value="#q.otherSelectOptionArr" >
<option><s:property /></option>
</s:iterator>
</select>
</s:elseif>
</s:if>
</s:if> <!-- 下拉列表 -->
<s:if test="#qt == 4">
<select>
<s:iterator value="#q.optionArr" >
<option><s:property /></option>
</s:iterator>
</select>
</s:if>
<!-- text -->
<s:if test="#qt == 5">
<input type="text">
</s:if> <!-- 矩阵问题(6,7,8) -->
<s:if test="#qt > 5">
<table>
<!-- 列头 -->
<tr>
<td></td>
<s:iterator value="#q.matrixColTitleArr">
<td><s:property /></td>
</s:iterator>
</tr>
<!-- 输出n多行 -->
<s:iterator value="#q.matrixRowTitleArr">
<tr>
<td><s:property /></td>
<!-- 套打控件 -->
<s:iterator value="#q.matrixColTitleArr">
<td>
<!-- radio -->
<s:if test="#qt == 6"><input type="radio"></s:if>
<s:if test="#qt == 7"><input type="checkbox"></s:if>
<s:if test="#qt == 8">
<select>
<s:iterator value="#q.matrixSelectOptionArr">
<option><s:property /></option>
</s:iterator>
</select>
</s:if>
</td>
</s:iterator>
</tr>
</s:iterator>
</table>
</s:if>
</td>
</tr>
</s:iterator>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</s:iterator>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

上一个页面引用的头部

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<div class="divOuterFrame">
<div class="divInnerFrame">欢迎使用SurveyDoor调查系统!</div>
</div>
<div class="divWhiteLine"></div>
<div class="divNavigatorOuterFrame">
<div class="divNavigatorInnerFrame">
<s:a action="LoginAction_toLoginPage" namespace="/">[首页]</s:a> 
<s:a action="SurveyAction_newSurvey" namespace="/">[新建调查]</s:a> 
<s:a action="SurveyAction_mySurveys" namespace="/">[我的调查]</s:a> 
[參与调查] 
<s:a action="RegAction_toRegPage" namespace="/">[用户注冊]</s:a> 
[用户授权管理] 
[角色管理] 
[权限管理] 
[日志管理] 
</div>
</div>
<div class="divWhiteLine"></div>

struts2 自己定义表单的更多相关文章

  1. 【Struts2】防止表单重复提交

    一.概述 二.Struts2中解决方案 三.实现步骤 一.概述 regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) ...

  2. struts2之防止表单重复提交

    struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  3. Struts2 Action接收表单参数

    struts2 Action获取表单传值    1.通过属性驱动式    JSP:        <form action="sys/login.action" method ...

  4. struts2的防止表单重复提交

    防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...

  5. activiti自己定义流程之整合(四):整合自己定义表单部署流程定义

    综合前几篇博文内容.我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功. 正由于如此,在创建了流程 ...

  6. activiti自己定义流程之整合(三):整合自己定义表单创建模型

    本来在创建了表单之后应该是表单列表和预览功能.可是我看了看整合的代码,和之前没实用angularjs的基本没有什么变化,一些极小的变动也仅仅是基于angularjs的语法,因此全然能够參考之前说些的表 ...

  7. activiti自己定义流程之自己定义表单(一):环境配置

    先补充说一下自己定义流程整个的思路,自己定义流程的目的就是为了让一套代码解决多种业务流程.比方请假单.报销单.採购单.协作单等等.用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需 ...

  8. activiti自己定义流程之自己定义表单(二):创建表单

    注:环境配置:activiti自己定义流程之自己定义表单(一):环境配置 在上一节自己定义表单环境搭建好以后,我就正式開始尝试自己创建表单,在后台的处理就比較常规,主要是针对ueditor插件的功能在 ...

  9. Struts2中防止表单重复提交,global-results定义全局结果处理

    1.在表单中加入<s:token/>标签 2.在动作类中加入token的拦截器 <!--如果单单写 name="token" 会丧失 defaultStack 拦 ...

随机推荐

  1. XtraBackUp 热备份工具

    是一款强大的在线热备份工具 备份的过程中,不锁表 使用percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm yum源安装: 1.安装Percona的库:       ...

  2. 【搜索】P1468 派对灯 Party Lamps

    P1468 派对灯 Party Lamps 我们来分析一下对灯的操作 1.对所有灯的,这时吧所有灯看成一个整体 2.奇偶数的操作,这时可以把每两个数看成一个循环节 3.对3X+ 1的操作,这时可以把每 ...

  3. vue中状态管理vuex的使用分享

    一.main.js中引入 store import store from './store' window.HMO_APP = new Vue({ router, store, render: h = ...

  4. [BZOJ3211]:花神游历各国(小清新线段树)

    题目传送门 题目描述: 花神喜欢步行游历各国,顺便虐爆各地竞赛.花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家) ...

  5. 配置maven报错 the java_home environment variable is not defined correctly ......

    the java_home environment variable is not defined correctly This environment variable is needed to r ...

  6. 2018 CCPC 女生赛 hdoj6287 口算训练

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6287 Summarize: 1.分解质因数: 2.二分查找函数lower_bound与upper_bo ...

  7. <Jenkins> 入门一

    1.Continous integration 持续集成 2.Continous Delivery     持续交付 3.Java 写的

  8. Centos 7 编译php 7.2.10

    步骤一:安装依赖 yum install -y wget gcc gcc-c++ gd-devel zlib-devel libjpeg-devel libpng-devel libiconv-dev ...

  9. svn上传项目

    1.桌面右键单击 2.进行项目导入 3.选择项目所在目录 4.

  10. Java方法传递参数传值还是传址的问题

    这几天重构项目代码遇到一个疑问:可不可以在方法A中定义一个boolean变量b为false,然后A调用方法C把b传递到C方法中经过一些列业务判断后修改为true,C执行结束后A方法中b的值还是原来的f ...