jmesa応用


これまで、良いページングコンポーネントは見つかりませんでしたが、最初はdisplaytagを使っていましたが、よく検討してみると、他の人が言っているほど強くなく、少なくとも自分の期待から遠いことがわかりました.そのため、他の新しいページングコンポーネントを探してみましたが、長い間自分が満足していることは見つかりませんでした.何気なくまたjmesaを発見し、多くの人にもほめられた.そこで自分も使ってみましたが、かなり資料が少ないことに気づき、公式サイトにもあまり資料がなくても、2.4.5のZIPパッケージ全体をダウンロードしたところ、基本的なドキュメントさえないことに気づき、さらに憂鬱なのは基本的なAPIドキュメントがないことです.基本的な効果を見るのもそんなに簡単なことではないようですが、唯一の資料は公式のいくつかの例で、本当に分からないのはソースコードを見るだけです.正直に言うと、ソースコードの注釈は少なく、いくつかの方法や類が何をするために使われているのかは全然言っていません.理解するのは確かに少し難しいです.こんなにたくさん言っても、この1、2日の成果を書きます.自分が長く続けられないのではないかと心配して、いっそ書いてください.
添付図面に示すように、必要なコンポーネントは少し多いです.注意しなければならないのは、web層がStripesを使っているので、個人的にはこのフレームワークがよく、ソースコードもよく書かれていると思います.2.4.5のZIPパケットには、ほとんどのファイルがありますが、slf 4 jやjqueryなど、ないものもあります.
jmesaのページング方法は2つあり、1つはjavaコードによる直接制御であり、2つ目はラベルによる制御である.
まずjavaコードで直接制御する方法を紹介します.

public class PaginationActionBean implements ActionBean {

// id       table id
	private String id = "user_table";
	private ActionBeanContext context;
	private String html;

	public String getHtml() {
		return html;
	}
	public void setHtml(String html) {
		this.html = html;
	}
........

	@DefaultHandler
	public Resolution display() {
		TableFacade tableFacade = TableFacadeFactory.createTableFacade(id, this
				.getContext().getRequest());

		addItems(tableFacade);
		html = html(tableFacade);
		ForwardResolution resolution = new ForwardResolution("/jsp/page.jsp");
		return resolution;
	}

	private void addItems(TableFacade tableFacade) {
		tableFacade.setItems(FillListData.getData());
	}

	private String html(TableFacade tableFacade) {

		tableFacade.setColumnProperties("name", "password", "deleteUser");

		HtmlTable table = (HtmlTable) tableFacade.getTable();
		table.setCaption("    ");
		table.getTableRenderer().setWidth("600px");

		HtmlRow row = table.getRow();

		HtmlColumn name = row.getColumn("name");
		name.setTitle("  ");

		HtmlColumn password = row.getColumn("password");
		password.setTitle("  ");

		HtmlColumn delete = row.getColumn("deleteUser");
		delete.setTitle("  ");
		delete.setWidth("100px");

		// Using an anonymous class to implement a custom editor.
		//              
		name.getCellRenderer().setCellEditor(new CellEditor() {
			public Object getValue(Object item, String property, int rowcount) {
				Object value = new BasicCellEditor().getValue(item, property,
						rowcount);
				HtmlBuilder html = new HtmlBuilder();
				html.a().href().quote().append("http://baidu.com").quote()
						.close();
				html.append(value);
				html.aEnd();
				return html.toString();
			}
		});

		delete.getCellRenderer().setCellEditor(new CellEditor() {
			public Object getValue(Object item, String property, int rowcount) {

				HtmlBuilder html = new HtmlBuilder();
				//       id 
				Object user = ItemUtils.getItemValue(item, "name");
				String js = " onclick='javascript:del(\"user\"," + user + ") '";
				html.a().append(js).href().quote().append(
						getContext().getRequest().getContextPath()
								+ "/Pagination.action?delete&user=" + user)
						.quote().close();
				html.append("  ");
				html.aEnd();
				return html.toString();
			}
		});

		return tableFacade.render(); // Return the Html.
	}

..............
}


上のコードの中で最も重要なのはhtmlメソッドで、このメソッドはテーブル全体のカスタマイズ作業を完了し、リンクを含む.ページごとに表示するレコード数を再設定する場合(デフォルトではページごとに15,50100が表示されます)、jmesaを変更します.propertiesファイル、javaコードで設定します.プロファイルを変更する場合は、2つの場所を同時に変更します.
limit.rowSelect.maxRows=15
html.toolbar.maxRowsDroplist.increments=15,50,100
変更する場合は、最初の行を満たす必要がある数値は、2番目の行のすべての数値の1つでなければなりません.Javaコードで修正する場合も同様の原則に従います.
jspコードは簡単です.

<script type="text/javascript"
              src="${pageContext.request.contextPath}/js/jquery.js"></script>
<script type="text/javascript"
              src="${pageContext.request.contextPath}/js/jquery.jmesa.js"></script>           
<script type="text/javascript"
              src="${pageContext.request.contextPath}/js/jmesa.js"></script> 
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/jmesa.css"></link> 
</head>
<body>
<h1>Stripes Calculator</h1>

<form>
	${actionBean.html}
<script type="text/javascript">  
        function onInvokeAction(id) { 
            createHiddenInputFieldsForLimitAndSubmit(id);  
        }  
</script>  
</form>
</body>

上のコードでは、JS宣言の順序に注意し、formを明記する必要があります.そうしないと、ページを分けるときにJSがエラーになります.上のJSコードも追加します.
2つ目の方法は、直接ラベルで明らかにするため、JSPヘッダで明らかにする必要があります.

<%@ taglib uri="/WEB-INF/tld/jmesa.tld" prefix="jmesa" %>
.........
...............

${actionBean.htmlを次のように置き換えます.

<jmesa:tableFacade id="user_table" items="${items}" var="bean" >
        <jmesa:htmlTable width="600px">               
            <jmesa:htmlRow>     
                <jmesa:htmlColumn property="name"/>
                <jmesa:htmlColumn property="password" title="Last Name"/>
            </jmesa:htmlRow>
        </jmesa:htmlTable> 
</jmesa:tableFacade>

この部分のコードの役割は,上のactionが表を直接操作する方式と同様に,JSPに作業を移すだけである.ただし、上の${items}は、文字列を使用せずに表示するcollectionを表します.どちらも使用する場合は、JSPの方式に準ずる.
jmesaのプロファイルはすでにJARに統合されており、変更が必要な場合は、このファイルをコピーして内容を変更し、web上に表示することができる.xmlパスを再指定するには、次の手順に従います.

<context-param>
	<param-name>jmesaPreferencesLocation</param-name>
	<param-value>WEB-INF/jmesa.properties</param-value>
</context-param>