ホームページ > 記事 > ウェブフロントエンド > JSPテンプレート継承機能実装_html/css_WEB-ITnose
背景
私は最近新しい会社に入社したばかりで、その新しい会社のプロジェクトを閲覧したところ、プロジェクト内の JSP ページのほとんどが独立した完全なページであることがわかり、多くのページに次のコードが繰り返されています。新しいページを追加するたびに、上記のコードをコピーする必要があり、また、各ページに共通のヘッダー ファイルとテール ファイル (header.jsp、footer.jsp など) を繰り返し導入する必要があります。 。 。
この開発方法については、反復的な作業負荷については詳しく説明しません。より重要な問題は、このアーキテクチャ方法が将来的にはメンテナンスの作業負荷が増加し、さらにはバグのリスクが発生する可能性があるということです。2 つの「栗」:
将来の開発プロセスで一部のパブリック スクリプト (オンライン カスタマー サービス アイコン、GA 分析スクリプトなど) をグローバルに導入または削除する必要がある場合は、jQuery バージョンを変更し、DocType タイプを次のように変更します。 HTML5タイプなどはお待ちください。同様の要件を完了するには、JSP ファイルを 1 つずつ変更する必要があり、作業負荷はプロジェクト内の JSP ファイルの数に比例します。
さらに厄介な問題は、上記のグローバル操作の場合、コードがすべてのページで有効であるかどうかを手動検査で保証できないことです。ハハ...
解決策
パブリック パーツの情報はテンプレート内で直接維持され、変数パーツはテンプレート内でプレースホルダーを定義し、さまざまなページの多様性を維持するためにページによって書き換えられます。
まず、ページの構造が一目でわかります。ページを作成すると、コンテンツ以外の公開部分に注意を払う必要がなくなり、コピーコードの作業負荷が大幅に軽減され、エラー率も削減されます
次に、公開スタイル、スクリプトなどがテンプレートに導入され、統合調整を容易にする
テンプレートの内容はおそらく次のようになります:
BlockTag
このタグは主に、テンプレート ファイル内の対応するモジュールを定義するために使用されます (プレースホルダーと見なすことができます)。JSP ページをレンダリングするときに、タグで定義された位置は、ページの書き換えられたコンテンツに置き換えられます。置換中、タグの name 属性とキー値としての特定のプレフィックスに基づいて、コンテンツがリクエストの属性から読み取られます。
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.Calendar" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %><%@ taglib uri="/common-tags" prefix="m"%><c:set var="ctx" value="${pageContext.request.contextPath}"></c:set><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"/><title>${webModule.module.name} ---xxxx</title><meta name="keywords" content="xxxx"/><meta name="description" content="xxxx"/><link rel="stylesheet" href="${ctx}/css/web-bbs.css"/><link rel="stylesheet" href="${ctx}/css/page.css"/><script type="text/javascript" src="${ctx}/js/jquery-1.7.2.min.js"></script><script type="text/javascript" src="${ctx}/js/bbs.js"></script><script type="text/javascript" src="${ctx}/js/webUtil.js"></script><script type="text/javascript" src="${ctx}/js/index.js"></script><script type="text/javascript" src="${ctx}/js/faces.js"></script>
OverwriteTag
このタグは主に、最終ページのテンプレート内の対応するモジュールを書き換えるために使用され、ページがレンダリングされるときに、タグ内のコンテンツが現在のリクエストの属性に書き込まれます。タグには、必須パラメータの name 属性がコンテンツのキー値として使用されます。この name 属性は、テンプレート内で書き換えられる対応するブロックの name 値と同じである必要があります。
/** * 自定义标签,用于在Jsp模板中占位 * * @author 逆风之羽 * */public class BlockTag extends BodyTagSupport { /** * 占位模块名称 */ private String name; private static final long serialVersionUID = 1425068108614007667L; @Override public int doStartTag() throws JspException{ return super.doStartTag(); } @Override public int doEndTag() throws JspException { ServletRequest request = pageContext.getRequest(); //block标签中的默认值 String defaultContent = (getBodyContent() == null)?"":getBodyContent().getString(); String bodyContent = (String) request.getAttribute(OverwriteTag.PREFIX+ name); //如果页面没有重写该模块则显示默认内容 bodyContent = StringUtils.isEmpty(bodyContent)?defaultContent:bodyContent; try { pageContext.getOut().write(bodyContent); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // TODO Auto-generated method stub return super.doEndTag(); } public String getName() { return name; } public void setName(String name) { this.name = name; }}
概要と展開
すべてのページでテンプレートを使用すると、多くのページの公開情報がブロックされるため、日々のページ開発がより効率的になり、エラー率が減ります。
JSP はネイティブではテンプレート メカニズムをサポートしていませんが、いくつかのトリックと 2 つのカスタム タグを使用するだけでテンプレート機能を実現でき、多くの繰り返し作業を軽減できます。したがって、仕事のプロセスにおける問題点は、多くの場合、個人の成長の機会でもあります。