`

c标签foreach中循环split的值

    博客分类:
  • JSP
阅读更多

最近做项目碰到一个问题,基本业务是这样子的:

有两张表,table1和table2,table2用来记录上传的文件信息如文件名称、文件地址等,table1用来记录文件上传的记录如上传人,上传时间等描述信息,它有一个字段用于保存文件序号(即table2的主键序号),可能是一个也可能是多个,现在需要将文件上传的信息及文件信息以文件为单位展示出来。

 

基本业务挺简单的,但对于习惯了用JSTL展示数据的我来说,处理起来就不那么简单了,以下为处理过程。

 

1、先建立基本数据用于测试

a、先建文件表:table2,

CREATE TABLE [dbo].[table2](
	[field1] [int] IDENTITY(1,1) NOT NULL,
	[field2] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
	[field3] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_table2] PRIMARY KEY CLUSTERED 
(
	[field1] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主键序号' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table2', @level2type=N'COLUMN', @level2name=N'field1'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'文件名称' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table2', @level2type=N'COLUMN', @level2name=N'field2'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'文件路径' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table2', @level2type=N'COLUMN', @level2name=N'field3'

--insert基础数据
INSERT INTO table2(field2,field3) VALUES('测试文件1','D:/temp/test1.pdf')
INSERT INTO table2(field2,field3) VALUES('测试文件2','D:/temp/test2.pdf')
INSERT INTO table2(field2,field3) VALUES('测试文件3','D:/temp/test3.pdf')
INSERT INTO table2(field2,field3) VALUES('测试文件4','D:/temp/test4.pdf')
INSERT INTO table2(field2,field3) VALUES('测试文件5','D:/temp/test5.pdf')
INSERT INTO table2(field2,field3) VALUES('测试文件6','D:/temp/test6.pdf')

b、再建文件上传记录表table1:

CREATE TABLE [dbo].[table1](
	[field1] [int] IDENTITY(1,1) NOT NULL,
	[field2] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
	[field3] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
	[field1] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主键序号' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table1', @level2type=N'COLUMN', @level2name=N'field1'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'文件序号(即table2的主键序号),多个时以英文半角的逗号分开' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table1', @level2type=N'COLUMN', @level2name=N'field2'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'描述' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table1', @level2type=N'COLUMN', @level2name=N'field3'

--insert基础数据
INSERT INTO table1(field2,field3) VALUES('1','描述1')
INSERT INTO table1(field2,field3) VALUES('1,2,3,4','描述2')
INSERT INTO table1(field2,field3) VALUES('5,6,3','描述3')
INSERT INTO table1(field2,field3) VALUES('4,6','描述4')
INSERT INTO table1(field2,field3) VALUES('1,2,3,4,5','描述5')
INSERT INTO table1(field2,field3) VALUES('2','描述6')

 

2、写SQL语句将两个表中的信息弄到一起

select t1.field1 as '主键序号',t1.field3 as '描述',t1.field2 as '文件序号',
--len(t1.field2)-len(replace(t1.field2,',','')):为0时表示有一个文件 为1时表示有2个,依次类推
len(t1.field2)-len(replace(t1.field2,',','')) as '文件数量',
--有超过1个的文件时使用*号将文件名称分开
(case when (len(t1.field2)-len(replace(t1.field2,',','')))>0 then (select '*'+t2.field2 from table2 as t2 where CHARINDEX(','+LTRIM(t2.field1)+',',','+t1.field2+',')>0  for xml path(''))else (select t2.field2 from table2 as t2 where CHARINDEX(','+LTRIM(t2.field1)+',',','+t1.field2+',')>0 ) end) as '文件名称'
from table1 as t1 ; 

结果如下:

 

3、使用java代码进行查询

代码我也不写了,就说一下获取到的结果名称和格式:List<Object[]> fileList

 

4、页面展示:

先进行简单输出

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table border="1">
<tr>
	<td>主键序号</td>
	<td>描述</td>
	<td>文件序号</td>
	<td>文件数量</td>
	<td>文件名称</td>
</tr>
<c:forEach items="${fileList }" var="file">
	<tr>  
		<td>{file[0]}</td><!--主键序号 -->
		<td>{file[1]}</td><!--描述-->
		<td>{file[2]}</td><!--文件序号-->
		<td>{file[3]}</td><!--文件数量-->
		<td>{file[4]}</td><!--文件名称-->
	</tr>
</c:forEach>
</table>

输出结果与上图相同,这里就不截图了。

 

很明显,这样子的结果是以table1的数据为主,而不是以文件为单位,一个文件一个文件的输出。以上图中的描述2为例子,若以table1为主,那么就是显示那一条记录,若是为文件为单位,应该是4条数据。因此需要根据文件序号或文件名称进行截取,然后再循环,这里需要用到fn标签里边的split函数。修改后的代码如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<table border="1">
<tr>
	<td>主键序号</td>
	<td>描述</td>
	<td>文件序号</td>
<!--	<td>文件数量</td>-->
	<td>文件名称</td>
</tr>
<c:forEach items="${fileList }" var="file">
	<c:choose>
		<c:when test="${file[3]>0 }"><!--file[3]表示文件数量,为0时说明有一个文件,0即有多个文件 -->
	 		<c:set value="${fn:split(file[4], '*') }" var="names" /><!--file[4]表示文件名称,以*号隔开 -->
	 		<c:set value="${fn:split(file[2], ',') }" var="ids" /><!--file[2]表示文件序号,以,号隔开 -->
			<c:forEach items="${names }" var="name" varStatus="indexes"><!--循环文件名称 -->
				<tr>
					<td>{file[0]}</td><!--主键序号 -->
					<td>{file[1]}</td><!--描述-->
					<td>{ids[indexes.index]}</td><!--文件序号-->
<!--				<td>{file[3]}</td>文件数量-->
					<td>{name}</td><!--文件名称-->
				</tr>
			</c:forEach>
		</c:when>
		<c:otherwise><!--说明只有一个,那么直接显示即可 -->
			<tr>
				<td>{file[0]}</td><!--主键序号 -->
				<td>{file[1]}</td><!--描述-->
				<td>{file[2]}</td><!--文件序号-->
<!--			<td>{file[3]}</td>文件数量-->
				<td>{file[4]}</td><!--文件名称-->
			</tr>
		</c:otherwise>
</c:forEach>
</table>

 

有时候会遇到文件名称过长需要截取的情况,处理如下

<c:set value="22" var="wordNum"/> <!---定义变量,用来说明要截取的字数--->
<!--<td>{name}</td>文件名称-->
<!--文件名称-->
<td>
	${fn:substring(name,0,(fn:length(name)>wordNum?wordNum:fn:length(name)))}
	<c:if test="${fn:length(name)>wordNum }">...</c:if>
</td>

最后,祝大家好运!

 

  • 大小: 9 KB
分享到:
评论

相关推荐

    c标签遍历集合嵌套的List集合

    在JSP页面中,使用`c:forEach`标签遍历`map`: ```jsp &lt;c:forEach items="${map}" var="entry"&gt; ${entry.key}"&gt;${entry.value} &lt;/c:forEach&gt; ``` 这里,`${map}`代表从前端传过来的`Map`对象,`entry`表示每次...

    JSTL标签使用总结

    本文将详细介绍JSTL中的核心标签:&lt;c:if&gt;、&lt;c:choose&gt;、&lt;c:forEach&gt;、&lt;c:forTokens&gt;、&lt;c:catch&gt;、&lt;c:remove&gt;、&lt;c:set&gt;、&lt;c:import&gt;、&lt;c:redirect&gt;、&lt;c:url&gt;以及与之相关的标签库。 #### 1. &lt;c:if&gt; &lt;c:if&gt;标签用于...

    jsp VO 循环显示

    JSTL提供了`c:forEach`标签,用于遍历集合对象,如数组、列表或Map。以下是一个基本示例: ```jsp &lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt; 属性1 属性2 &lt;!-- 添加更多属性列 --&gt;...

    jstl标签使用文档,jstl标签使用帮助文档

    对于集合数据的处理,`&lt;c:forEach&gt;`标签是非常常见的: ```jsp &lt;c:forEach items="${list}" var="item"&gt; ${item} &lt;/c:forEach&gt; ``` 这会遍历名为`list`的集合,并将每个元素赋值给`item`变量。 JSTL还允许我们在...

    jsp核心标签的使用方法

    4. `&lt;c:forEach&gt;`标签:循环遍历集合。例如: ```jsp &lt;c:forEach items="${users}" var="user"&gt; ${user.name} &lt;/c:forEach&gt; ``` 这将遍历“users”集合并输出每个用户的名称。 5. `&lt;c:import&gt;`标签:导入外部...

    jstl标签库

    - **迭代标签**:`&lt;c:forEach&gt;`、`&lt;c:forTokens&gt;`,实现循环遍历。 - **URL操作标签**:`&lt;c:import&gt;`、`&lt;c:param&gt;`、`&lt;c:url&gt;`、`&lt;c:redirect&gt;`,用于处理URL相关的操作。 **4. 使用JSTL的步骤** 1. 将JSTL的`....

    java标签库jar包

    - `c:`标签:这是JSTL的一部分,用于条件语句和循环控制,比如`&lt;c:if&gt;`、`&lt;c:forEach&gt;`等。 - `fmt:`标签:处理日期和时间格式化,如`&lt;fmt:formatDate&gt;`。 - `fn:`标签:提供字符串和集合操作,如`&lt;fn:length&gt;`、...

    jstl标签jar包

    1. **核心标签库**:这是JSTL中最常用的一部分,提供了诸如条件判断、循环、跳转、输出变量等基本功能。例如,`&lt;c:if&gt;`用于条件判断,`&lt;c:forEach&gt;`用于遍历集合,`&lt;c:out&gt;`用于安全地输出数据,防止XSS攻击。 2. *...

    jstl标签 JAR包

    这里,`&lt;c:forEach&gt;`标签的`items`属性指定了要遍历的集合,`var`属性定义了循环变量,而`${item.property}`则是在循环体内访问每个元素的属性。 总结来说,JSTL JAR包是Java Web开发中的一个重要工具,通过提供一...

    JSTL标签详解入门首选

    C标签库提供了类似于Java语言中的`for`循环和`if`判断等结构。例如,`&lt;c:forEach&gt;`标签用于遍历集合或数组,常用于显示列表数据。例如: ```jsp &lt;c:forEach items="${list}" var="item"&gt; ${item.name} &lt;/c:forEach...

    jstl标签库文档

    &lt;c:forEach items="${fn:split('a,b,c', ',')}" var="item"&gt; &lt;c:out value="${item}" /&gt; &lt;/c:forEach&gt; ``` ### 小结 本文详细介绍了JSTL中的几种常用标签库及其主要标签的功能与用法。通过这些标签的合理运用...

    JSTL标签所需要的tld文件

    - `&lt;c:forEach&gt;`:用于循环遍历集合或数组。 - `&lt;c:out&gt;`:安全地输出值,防止XSS攻击。 **2. fmt.tld:** `fmt.tld`文件包含了Format标签库,主要用于格式化数据,如日期、数字等。其中的主要标签有: - `...

    JSTL标准标签库的应用

    以上代码展示了如何使用JSTL的核心标签库中的`&lt;c:forEach&gt;`标签来遍历用户列表并显示每个用户的名字。这种方式使得JSP页面更加简洁、易于维护。 #### 结论 JSTL通过提供一系列功能丰富的标签和EL语言,极大地简化...

    jstl 标签库包

    1. **Core标签库(c:)**:提供了处理循环、条件判断、URL重写、包含页面等功能的标签,如`&lt;c:if&gt;`, `&lt;c:forEach&gt;`, `&lt;c:set&gt;`, `&lt;c:choose&gt;`等。 2. **EL表达式库(fmt:)**:支持日期和数字的格式化,可以进行...

    JSTL标签核心标签库

    - `&lt;c:forEach&gt;`:用于遍历集合或数组,进行循环操作。 2. **I18N格式标签库(I18N-capable formatting tag library)**:提供国际化和本地化支持,如`&lt;fmt:formatDate&gt;`用于日期格式化。 3. **SQL标签库(SQL tag ...

    JSP标准标签库实例

    - `&lt;c:forEach&gt;`、`&lt;c:forTokens&gt;`:循环处理数组、集合或字符串。 - `&lt;c:import&gt;`、`&lt;c:param&gt;`、`&lt;c:url&gt;`、`&lt;c:redirect&gt;`:处理URL,包括导入、添加参数、创建URL和重定向。 2. **I18N格式标签库** - `...

    jstl实例及标签库详细介绍资料

    4. **c**: 最常用的核心标签库,包含条件语句(if、choose、when、otherwise)、循环(forEach、forTokens)、迭代器(iterators)、URL操作等。 5. **xml**: 处理XML文档,支持XPath表达式。 **三、JSTL核心标签库...

    jsp开发的jstl标签库

    在这个例子中,`&lt;c:out&gt;`标签用于输出请求对象中`name`属性的值,如果没有值,则显示默认的欢迎语。 `&lt;c:set&gt;`标签用于设置变量,例如将一个值设置到session作用域: ```jsp &lt;c:set var="username" value="jack" ...

    JSTL标签.zip

    - `&lt;c:forEach&gt;`:循环遍历集合或数组。 - `&lt;c:import&gt;`:动态导入页面或者资源。 - `&lt;c:url&gt;`和`&lt;c:param&gt;`:创建和添加URL参数。 **2. JSTL XML标签库** XML标签库主要用于处理XML文档,如解析、转换和操作XML...

Global site tag (gtag.js) - Google Analytics