<logic> 标签库
1)要使用Logic标签库必须要加入标签库的声明
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
2)logic标签库中的提供的大多数功能完全可以用jstl来替代。一般在logic标签库用得最多的标签就是
<logic:iterator>标签
<logic:equal>用于比较两个值是否相等
A:格式:<logic:equal name="在四种范围内的变量的值" value="用于比较的值" >
<%
String uid="chen";
request.setAttribute("uid",uid);
%>
<logic:equal name="uid" value="chen"> //用于比较
相等
</logic:equal>
B:比较javabean的属性值
<%
worker d=new worker();
d.setId("W1");
request.setAttribute("uid",d);
%>
<logic:equal name="uid" property="id" value="W1" >
equal
</logic:equal> 表示把request范围内的uid的JavaBean的属性值与W1进行比较
其它的用于比较的标签,用法与<logic:equal>一样
A:<logic:greaterEqual>大于或等于
B:<logic:greaterThan>大于
C:<logic:lessEqual>小于或等于
D:<logic:lessThan>小于
应用举例:
1)让用户输入一个职工的编号从数据库查找出对应的部门,如果该部门是销售部
则显示是销售部,否则显示不是销售部
思路:input.jsp--->Action--->调用JavaBean进行计算得出部门--->转到show.jsp
页面进行判断(比较的过程在show.jsp,得出结果在Action中)
2)我们完全可以使用jstl标签。
<c:choose>
<c:when test="${depart=='销售部'}">
<h1>is sales</h1>
</c:when>
<c:otherwise>
<h1>not is</h1>
</c:otherwise>
</c:choose>
<logic:iterator>标签.相当于jstl中的<c:forEatch>
1)用于循环输出数据项
2)格式:
<logic:iterator id="存入page范围内变量" name="从四种范围变量中取出的集合名">
${}
</logic:iterator>
3)原理:每次从name指定的集合中检索出一个元素,然后把它放在page范围内
并以id属性指定的名字来命名这个元素
==========================================================
<%
ArrayList list=new ArrayList();
list.add("chen");
list.add("yuan");
list.add("haung");
request.setAttribute("list",list);
%>
<logic:iterate id="workerName" name="list">
<bean:write name="workerName"/><br>
</logic:iterate>
================================================================
3)把JavaBean集合进行输出
<%
ArrayList users=new ArrayList();
users.add(new Person("tomcat",12));
users.add(new Person("Mysql",120));
users.add(new Person("oracle",16));
request.setAttribute("users",users)
%>
<logic:iterate id="user" name="users">
<bean:write name="user" property="name"/><br>相当于${user.name}
<bean:write name="user" property="age"/><br> 相当于${user.age}
</logic:iterate>
<c:set var="orderList" value="<%=orderDao.getAllOrder()%>" scope="request"/>
4)<logic:iterate>还可以访问map中的元素
<%
Map personMap=new HashMap();
personMap.put("W1","张三");
personMap.put("W2","李四");
personMap.put("W3","王五");
personMap.put("W4","赵六");
%>
<c:set var="personMap" value="<%=personMap %>"/>
<logic:iterate id="person" name="personMap">
<bean:write name="person" property="key"/> 相当于${person.key}
<bean:write name="person" property="value"/>相当于${person.value}
</logic:iterate>
5)设置被访问的变量:
A:设置name属性,name属性指定要遍历的集合或map,
B:设置name属性和property属性,name属性指定一个javaBean,property属性指定java
的一个属性,这个属性做为遍历的集合或map.比如:
<%
String love[]={"dance","jump","read"};
person personInstance=new person("p1","zhang",love);
request.setAttribute("personInstance",personInstance);
%>
<logic:iterate id="elementLove" name="personInstance" property="love">
${elementLove }
</logic:iterate>
改为:
<%
ArrayList persons=new ArrayList();
person personInstance1=new person("p1","zhang",new String[] {"dance1","jump1","read1"});
person personInstance2=new person("p1","zhang",new String[] {"dance2","jump2","read2"});
person personInstance3=new person("p1","zhang",new String[] {"dance3","jump3","read3"});
persons.add(personInstance1);
persons.add(personInstance2);
persons.add(personInstance3);
request.setAttribute("persons",persons);
%>
<logic:iterate id="elementPerson" name="persons">
<br>=========${elementPerson.id} ${elementPerson.name}======<br>
<logic:iterate id="elementLove" name="elementPerson" property="love">
${elementLove }
</logic:iterate>
</logic:iterate>
举例:
1)从数据库中查询结果用<logic:iterate>标签进行输出(注意indexId的使用
<logic:iterate id="empList" name="emps" indexId="index">
<c:choose>
<c:when test="${index%2==0}">
<tr align="center" bgcolor="#FFFFFF">
</c:when>
<c:otherwise>
<tr align="center" bgcolor="yellow">
</c:otherwise>
</c:choose>
<td><bean:write name="empList" property="id"/></td>
<td><bean:write name="empList" property="name"/></td>
<td><bean:write name="empList" property="job"/></td>
</tr>
</logic:iterate>
2)定义一个部门类,里面有一个属性为该部门的员工集合,输出部门信息与该部门员工信息,depts里面包含
多个dept,一个dept里面包含多个emp
以分组报表有形式进行输出
===========================dept部门类==================================
public class dept {
private String id;
private String name;
public ArrayList getEmps() { //说明对于"只读属性"可以直接写get方法,没有必要
//定义私有变量,也就是说该javaBean自动会有emps属性
ArrayList empsList=new ArrayList();
String sql="select empno,ename from emp where deptno="+this.id;
ResultSet rs=db.runSql(sql);
while(rs.next()) {
emp empInstance=new emp(rs.getString(1),rs.getString(2));
empsList.add(empInstance);
}
return empsList;
}
...................
}
=============================depts所有部门类=============================
public static ArrayList queryAll(){
ArrayList deptsList=new ArrayList();
String sql="select deptno,dname from dept";
ResultSet rs=db.runSql(sql);
while(rs.next()) {
dept deptInstance=new dept();
deptInstance.setId(rs.getString(1));
deptInstance.setName(rs.getString(2));
deptsList.add(deptInstance);
}
return deptsList;
}
3)通过订单表查看订单明细表.可以定义一个类得到所有订单,定义一个订单类,里面有
多个订单明细类,定义订单明细类。(在定义订单类中通过超链接显示所有订单明细表)
2)实现分页(创建一个用于分页的类,使用单例模式)
==============================分页类=================================
public class emps {
private int currentPage=1;
private final int pageSize=4;
private static emps demo=null;
private emps(){
}
public static emps newInstance(){
if (demo==null) {
demo=new emps();
}
return demo;
}
public List getCurrentPageList() {
List list=new ArrayList();
String sql=String.format("select * from (select * from emp where empno not in
(select empno from emp where rownum<=(%d-1)*%d))
where rownum<=%d",this.currentPage,this.pageSize,pageSize);
ResultSet rs=dbManager.RunHasResultSql(sql);
while(rs.next()) {
emp empInstance=new emp();
empInstance.setId(rs.getString(1));
empInstance.setName(rs.getString(2));
empInstance.setJob(rs.getString(3));
list.add(empInstance);
}
return list;
}
public int getCurrentPage() {
return this.currentPage;
}
public void setCurrentPage(int currentPage){
switch(currentPage) {
case 0://表示首页
this.currentPage=1;
break;
case 1://表示上一页
if (this.currentPage>1) {
this.currentPage--;
}
break;
case 2: //表示下一页
if (this.currentPage<this.getTotalPage()) {
this.currentPage++;
}
break;
case 3: //表示末页
this.currentPage=this.getTotalPage();
System.out.print(this.getTotalPage());
break;
}
}
public int getTotalPage() {
int rowCount=0,totalPages=0;
String sql="select count(*) from emp";
ResultSet rs=dbManager.RunHasResultSql(sql);
if (rs.next()) {
rowCount=rs.getInt(1);
}
if (rowCount%this.pageSize==0) {
totalPages=rowCount/this.pageSize;
} else {
totalPages=rowCount/this.pageSize+1;
}
return totalPages;
}
public int getPageSize() {
return pageSize;
}
===============================jsp页面===================================
<logic:notPresent name="emps">
<c:set var="emps" value="<%=emps.newInstance().getCurrentPageList()%>" scope="request"/>
</logic:notPresent> //注意使用<c:set>标签
<logic:iterate id="empList" name="emps" indexId="index">
=============================================================================================
<logic:Present>判断四种范围内的变量是否不存在
格式: <logic:Present name="要判断的四种范围内的变量名"> 做一些事件
</logic:Present>
<logic:redirect/>重定向
格式:<logic:redirect href="要重定向的页面"/>
相当于 response.sendRedirect(),会丢失请求中的数据
<logic:forward/>转发请求
格式:<logic:forward name="msg"/>
说明:
1)name必须是在struts-config.xml文件中定义的全局forward
2)<jsp:forward page="msg.jsp">也相当于转发,但它没有全局forward的限制