1. 何为分块?
一个网页通常由几个块组成,现在已经不推荐使用fragment这样的标签。这时利用jsp的自定义标签技术,定义一个自己的标签去执行不同的块,可以有效的
实现不同块的逻辑分离,及高效的代码复用。
2.分块的实现步骤。
1. 写一个block的抽象类 BlockAbstract,包含一个path字段,一个展示分块页面的方法,及一个由子块执行的回调函数。
2. 写一个BlockTag的标签类,继续SimpleTagSupport,并在
doTag方法中获取block并调用其displayBlock方法。
3. 定义tld文件
4. 实现HeaderBlock继承BlockAbstract,实现其execute方法,并在其中实现该块的相关逻辑。
5. 在Spring的applicationContext.xml文件中声明出headerBlock块注入path属性。
6. 在jsp页面引用自定义的tag.
3. 使用技术
自定义标签, 模板方法设计模式, SpringIoc
4.代码实现
/**
* block的抽换类
*/
public abstract class BlockAbstract {
public String path;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public void displayBlock(PageContext pageContext) {
execute(pageContext);
if (path != null && path != "") {
try {
pageContext.include(path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 展示块的内容时执行的回调
* @param pageContext
*/
protected abstract void execute(PageContext pageContext);
}
/**
* 分块的tag类
*/
public class BlockTag extends SimpleTagSupport{
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
/**
* 标签的执行方法
* @throws JspException
* @throws IOException
*/
@Override
public void doTag() throws JspException, IOException {
PageContext context = (PageContext) this.getJspContext();
ServletContext servletContext = context.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
BlockAbstract block = (BlockAbstract)ctx.getBean(name);
block.displayBlock(context);
}
}
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/weijiang</uri>
<tag>
<name>block</name> <!-- 为标签处理器类配一个标签名 -->
<tag-class>com.weijiang.test.BlockTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
public class HeadBlock extends BlockAbstract{
@Override protected void execute(PageContext pageContext) {
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
//这里只是简单的打印一个name属性
request.setAttribute("name", "weijiang");
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="blockHead" class="com.weijiang.test.HeadBlock">
<property name="path" value="/header.jsp"></property>
</bean>
</beans>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="wj" uri="/weijiang" %>
<html>
<head>
<title>xx</title>
</head>
<body>
<wj:block name="blockHead"></wj:block>
</body>
</html>