jsessionidをリクエストパラメータに追加するタグファイルとカスタムタグの実装

携帯ブラウザって、クッキーの実装がないみたいなのでセッションを保持するのに、リクエストに"jsessionid=xxxxxxxxx"みたいなセッションIDを保持する必要がある。

そこで、リクエストにjsessionidを追加するタグファイルとカスタムタグを作りました。
タグファイルで実装

  • タグファイル(WEB-INF/tags/link.tag)
<%@ tag pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%-- 属性と変数の定義 --%>
<%@ attribute name="href" rtexprvalue="true" description="Aタグのhref" %>

<%-- メイン --%>
<a href="${href};jsessionid=<%= request.getRequestedSessionId() %>" ><jsp:doBody/></a>
<%@taglib tagdir="/WEB-INF/tags" prefix="tag" %>
tags:<tag:link href="aaaa.do">ああああ</tag:link>

カスタムタグで実装

<?xml version="1.0" ?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>link</short-name>
  <tag>
    <name>link</name>
    <tag-class>sample.tag.SLinkTag</tag-class>
	<attribute>
		<name>href</name>
	</attribute>
	<attribute>
		<name>value</name>
	</attribute>
    <body-content>empty</body-content>
  </tag>
</taglib>
package sample.tag;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.struts.taglib.TagUtils;

public class SLinkTag extends TagSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = -870003462039166376L;
	private String href;
	private String value;

	public SLinkTag() {
		super();
	}

	public int doStartTag() throws JspException {
		try {

			// String requestSessionId = (String)TagUtils.getInstance().lookup(
			// pageContext, "RequestedSessionId", "request");

			HttpServletRequest request = (HttpServletRequest) pageContext
					.getRequest();

			StringBuilder sb = new StringBuilder();
			sb.append(";jsessionid=");
			sb.append(request.getRequestedSessionId());

			pageContext.getOut().write(
					"<a href=\"" + href + sb.toString() + "\">");

		} catch (IOException e) {
			throw new JspException("SLinkTag#doStartTag", e);
		}
		return SKIP_BODY;
	}

	public int doEndTag() throws JspException {
		try {
			pageContext.getOut().write(value + "</a>");
		} catch (IOException e) {
			throw new JspException("SLinkTag#doEndTag", e);
		}
		return EVAL_PAGE;
	}

	/*
	 * 属性linkのsetter
	 */
	public void setHref(String href) {
		this.href = href;
	}

	/*
	 * 属性valueのsetter
	 */
	public void setValue(String value) {
		this.value = value;
	}

}
<%@taglib prefix="ss" uri="../WEB-INF/tld/link.tld" %>

tld:<ss:link href="aaaa.do" value="ああああ"/>