目录
- 前言
- index.jsp整体
- z:tld自定义标签库
- 标签助手类
- checkbox标签助手类
- pageTag标签助手类
- selectTag助手类
- 效果图
- 总结
前言
这一篇是写前台如何使用自定义标签来优化代码
之前一篇是写后台优化代码的,【mvc之后台优化代码】
还是一样,纯代码。
index.jsp整体
<body>
<div style="align-content: center">
<form action="StudentAction.action?method=getAll" method="post" align="center">
<a href="index.jsp">刷新</a>
教员<z:select name="tid" textVal="tname" items="${TeacherList }" textKey="tid" headerTextKey="0" headerTextval="全部教员"></z:select>
班级<z:select name="cid" textVal="cname" items="${ClassList }" textKey="cid" headerTextKey="0" headerTextval="全部班级"></z:select>
爱好:<z:checkbox items="${shobbys }" name="shobby"></z:checkbox>
<br/>
<input type="submit" value="查询" >
<a href="add.jsp">增加</a>
</form>
<table border="1px" align="center" width="50%">
<tr>
<td>学生id</td>
<td>学生姓名</td>
<td>学生教员</td>
<td>学生班级</td>
<td>学生爱好</td>
<td>操作</td>
</tr>
<c:if test="${not empty list }">
<c:forEach items="${list }" var="g">
<tr>
<td>${g.sid }</td>
<td>${g.sname }</td>
<td>${g.tid }</td>
<td>${g.cid }</td>
<td>${g.shobby }</td>
<td>
<a href="StudentAction.action?method=loadStu&sid=${g.sid }">修改</a>
<a href="StudentAction.action?method=deleteStu&sid=${g.sid }" onclick="return confirm('你是否确定要删除?')==1">删除</a>
</td>
</tr>
</c:forEach>
</c:if>
</table>
<div align="center">
<z:pageBean pagebean="${PageBean }"></z:pageBean>
</div>
</div>
</body>
z:tld自定义标签库
<tag>
<name>select</name>
<tag-class>com.tag.selectTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>id</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>textKey</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>textVal</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>selectedVal</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>headerTextKey</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>headerTextval</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<tag>
<name>pageBean</name>
<tag-class>com.tag.pageTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>pagebean</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>checkbox</name>
<tag-class>com.tag.CheckBoxTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>selected</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
标签助手类
checkbox标签助手类
public class CheckBoxTag extends BodyTagSupport{
private static final long serialVersionUID = 1657191454649826759L;
private List<Object> items=new ArrayList<>();
private String name;
private List<Object> selected = new ArrayList<>();
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Object> getSelected() {
return selected;
}
public void setSelected(List<Object> selected) {
this.selected = selected;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.write(toHtml());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
private String toHtml() throws IllegalArgumentException, IllegalAccessException, InstantiationException, NoSuchFieldException, SecurityException {
StringBuffer sb = new StringBuffer();
for (Object it : items) {
if(selected.contains(it)) {
sb.append("<input checked=\"checked\" type='checkbox' value ='"+it+"' name='"+name+"' >"+it+" ");
}
else {
sb.append("<input type='checkbox' value ='"+it+"' name='"+name+"' >"+it+" ");
}
}
return sb.toString();
}
}
pageTag标签助手类
public class pageTag extends BodyTagSupport{
private static final long serialVersionUID = -6466820558378004043L;
public PageBean pagebean;
public PageBean getPagebean() {
return pagebean;
}
public void setPagebean(PageBean pagebean) {
this.pagebean = pagebean;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.write(toHtml());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SKIP_BODY;
}
private String toHtml() {
StringBuffer sb = new StringBuffer();
//点击分页栏的时候要提交的表单
sb.append(" <form id='pageBeanForm' action='"+pagebean.getUrl()+"' method='post'>");
sb.append(" <input type='hidden' name='page' value = '"+pagebean.getPage()+"'>");
Map<String, String[]> paramMap = pagebean.getParamMap();//将类里面的map集合实列化
if(paramMap!=null&¶mMap.size()>0) {
for (Entry<String, String[]> entry : paramMap.entrySet()) {
if(!"page".equals(entry.getKey())) {//因为上面已经将page参数放到上面去了
for (String val : entry.getValue() ) {//在paramMap的键值队中值是一个数组,所以需要遍历
sb.append(" <input type='hidden' name='"+entry.getKey()+"' value= '"+val+"'>");
}
}
}
}
// <form id='pageBeanForm' action='http://localhost:8080/T224-pagebean/teacherList' method='post'>
// <input type='hidden' name='rows' value= '"+val+"'>
// <input type='hidden' name='url' value= '"+val+"'>
// <input type='hidden' name='max' value= '"+val+"'>
// <input type='hidden' name='page'value= '"+val+"'>
// <input type='hidden' name='tname' value='晓'>
// </form>
sb.append(" </form>");
//分页栏实际要操作的按钮
sb.append(" <div style='text-align: center; font-size: 12px;'>");
sb.append(" 每页"+pagebean.getRows()+"条,共"+pagebean.getTotal()+"条,第"+pagebean.getPage()+"页,共"+pagebean.getMaxPage()+"页 <a href='javascript:gotoPage(1)'>首页</a> <a");
sb.append(" href='javascript:gotoPage("+pagebean.getPreviousPage()+")'>上一页</a> <a");
sb.append(" href='javascript:gotoPage("+pagebean.getNextPage()+")'>下一页</a> <a");
sb.append(" href='javascript:gotoPage("+pagebean.getMaxPage()+")'>尾页</a> <input type='text'");
sb.append(" id='skipPage'");
sb.append(" style='text-align: center; font-size: 12px; width: 50px;'> <a");
sb.append(" href='javascript:skipPage()'>Go</a>");
sb.append(" </div>");
//js代码块
sb.append(" <script type='text/javascript'>");
sb.append(" function gotoPage(page) {");
sb.append(" document.getElementById('pageBeanForm').page.value = page;");
sb.append(" document.getElementById('pageBeanForm').submit();");
sb.append(" }");
sb.append(" function skipPage() {");
sb.append(" var page = document.getElementById('skipPage').value;");
sb.append(" if(!page || isNaN(page) || parseInt(page)<1 || parseInt(page)>"+pagebean.getMaxPage()+"){");
sb.append(" alert('请输入1~N的数字');");
sb.append(" return;");
sb.append(" }");
sb.append(" gotoPage(page);");
sb.append(" }");
sb.append(" </script>");
return sb.toString();
}
}
selectTag助手类
/**
* 1.值的传递 : id name
* 2.数据源 : items
* 3.展示列与数据存储列与实体类的对应关系: textKey textVal
* 4.数据回显 selectedVal
* 5.可能下拉框默认值(头标签)headerTextKey headerTextVal
* @author Lenovo
*
*/
public class selectTag extends BodyTagSupport{
private static final long serialVersionUID = -2985228892464897369L;
private String id;//值的传递 : id name
private String name;//值的传递 : id name
private List<Object> items = new ArrayList<>();//数据源 : items
private String textKey;//展示列与数据存储列与实体类的对应关系: textKey textVal
private String textVal;//展示列与数据存储列与实体类的对应关系: textKey textVal
private String selectedVal;//数据回显 selectedVal
private String headerTextKey;//可能下拉框默认值(头标签)headerTextKey headerTextVal
private String headerTextval;//可能下拉框默认值(头标签)headerTextKey headerTextVal
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
public String getTextKey() {
return textKey;
}
public void setTextKey(String textKey) {
this.textKey = textKey;
}
public String getTextVal() {
return textVal;
}
public void setTextVal(String textVal) {
this.textVal = textVal;
}
public String getSelectedVal() {
return selectedVal;
}
public void setSelectedVal(String selectedVal) {
this.selectedVal = selectedVal;
}
public String getHeaderTextKey() {
return headerTextKey;
}
public void setHeaderTextKey(String headerTextKey) {
this.headerTextKey = headerTextKey;
}
public String getHeaderTextval() {
return headerTextval;
}
public void setHeaderTextval(String headerTextval) {
this.headerTextval = headerTextval;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.print(toHtml());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SKIP_BODY;
}
private StringBuffer toHtml() throws Exception {
StringBuffer sb = new StringBuffer();//一个StringBuffer的类
sb.append("<select id='"+id+"' name='"+name+"' >");//开头
if(!(headerTextKey ==null|| headerTextval ==null || "".equals(headerTextKey)||"".equals(headerTextval))) {
sb.append("<option value= '"+headerTextKey+"'>");
sb.append(headerTextval);
sb.append("</option>");
}//如果有默认的header就要加上的代码
Object keyVal;
Object Val;
for (Object it : items) {
keyVal = PropertyUtils.getProperty(it, textKey);//找到这个对象的属性:id
keyVal = keyVal+"";
Val = PropertyUtils.getProperty(it, textVal);//找到这个对象的属性:name
Val = Val +"";
if(keyVal.equals(selectedVal)) {//判断回显的字符串
sb.append("<option selected value= '"+keyVal+"'>");
sb.append(Val);
sb.append("</option>");
}
else {
sb.append("<option value= '"+keyVal+"'>");
sb.append(Val);
sb.append("</option>");
}
}
sb.append("</select>");//结尾
return sb;
}
}
效果图
总结
在这之后差不多就基本完成优化了,但还是有点问题暂时没解决
Thanks♪(・ω・)ノ希望对大家有所帮助