struts2 自己定义表单
自己定义表单一定会涉及<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 自己定义表单的更多相关文章
- 【Struts2】防止表单重复提交
一.概述 二.Struts2中解决方案 三.实现步骤 一.概述 regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) ...
- struts2之防止表单重复提交
struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- Struts2 Action接收表单参数
struts2 Action获取表单传值 1.通过属性驱动式 JSP: <form action="sys/login.action" method ...
- struts2的防止表单重复提交
防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...
- activiti自己定义流程之整合(四):整合自己定义表单部署流程定义
综合前几篇博文内容.我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功. 正由于如此,在创建了流程 ...
- activiti自己定义流程之整合(三):整合自己定义表单创建模型
本来在创建了表单之后应该是表单列表和预览功能.可是我看了看整合的代码,和之前没实用angularjs的基本没有什么变化,一些极小的变动也仅仅是基于angularjs的语法,因此全然能够參考之前说些的表 ...
- activiti自己定义流程之自己定义表单(一):环境配置
先补充说一下自己定义流程整个的思路,自己定义流程的目的就是为了让一套代码解决多种业务流程.比方请假单.报销单.採购单.协作单等等.用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需 ...
- activiti自己定义流程之自己定义表单(二):创建表单
注:环境配置:activiti自己定义流程之自己定义表单(一):环境配置 在上一节自己定义表单环境搭建好以后,我就正式開始尝试自己创建表单,在后台的处理就比較常规,主要是针对ueditor插件的功能在 ...
- Struts2中防止表单重复提交,global-results定义全局结果处理
1.在表单中加入<s:token/>标签 2.在动作类中加入token的拦截器 <!--如果单单写 name="token" 会丧失 defaultStack 拦 ...
随机推荐
- Socket是什么呢?中间软件抽象层
代表着网络连接 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用 ...
- execl, execlp, execle, execv, execvp - 执行某个文件
总览 (SYNOPSIS) #include <unistd.h> extern char **environ; int execl( const char *path, const ch ...
- centos下安装nodejs的三种种方式
方法一:源码包安装 官网下载 centos下载最新版10.9 https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.xz mkdir / ...
- 在windows下.NET CORE 与Consul简单使用
0)基本概念 consul常用于服务发现 [微服务] web_Api \ \ ->注册服务 raft选举le ...
- jQuery闪烁提示,让新消息在网页标题显示
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head& ...
- python TCP协议详解 三次握手四次挥手和11种状态
11种状态解析 LISTEN -------------------- 等待从任何远端TCP 和端口的连接请求. SYN_SENT --------------- 发送完一个连接请求后等待一个 ...
- mysql5.7 在Centeros 6 下自动安装的shell脚本
概述: 此脚本实现了在Centeros 6版本下自动安装mysql5.7到目录 /opt/mysql-5.7*并且做软连接映射到 /usr/local/mysql,自动修改root密码为:123456 ...
- Highlights in a Journal
** Highlights **** example- b huang, 2016, Design and performance enhancement of a bi-directional co ...
- LeetCode(71) Simplify Path
题目 Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/&quo ...
- 最近的一些JAVA基础知识
1,关于判断两个值是否相等 equal 和==是有区别到 2,判断一个数组集合 List是否为空 这个不能用"==null或者equal"要用isEmpty() , 对于不等于加一 ...