Mailing List Archive


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tlug] Big5 Vs. Unicode Vs. Netscape 4.x Vs. deadline



Dear Jonathan,

 Attached is the servlet filter distributed with Tomcat for character
encoding (plain text made junk out of the commented explainations so I
attached as opposed to pasted).

Also, at the bottom of the attachment is what goes in web.xml to enable
it.

You or she can take out the log4j stuff unless you're using it.

Not sure how of if it would need to be modified with Jboss, but if the
sevlet specs are the same 2.3, then seems like it should work.

In real use, I've always also had to put 
<%@example.com contentType="text/html;charset=Shift_JIS"%>
on my jsp pages to get it to work 100% correctly.

Cheers,

Shawn

> I also hypothetically advised her that she really needs to
> have a good input filter to make sure that whatever the
> customer's staff input to the database, it is converted to 
> Unicode or whatever else the database ends up finally using,
> since otherwise your database will doubtless quickly fill with
> all sorts of crap.
 
 

package filters;

import org.apache.log4j.Category;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;


/**
 * <p>Example filter that sets the character encoding to be used in parsing the
 * incoming request, either unconditionally or only if the client did not
 * specify a character encoding.  Configuration of this filter is based on
 * the following initialization parameters:</p>
 * <ul>
 * <li><strong>encoding</strong> - The character encoding to be configured
 *     for this request, either conditionally or unconditionally based on
 *     the <code>ignore</code> initialization parameter.  This parameter
 *     is required, so there is no default.</li>
 * <li><strong>ignore</strong> - If set to "true", any character encoding
 *     specified by the client is ignored, and the value returned by the
 *     <code>selectEncoding()</code> method is set.  If set to "false,
 *     <code>selectEncoding()</code> is called <strong>only</strong> if the
 *     client has not already specified an encoding.  By default, this
 *     parameter is set to "true".</li>
 * </ul>
 *
 * <p>Although this filter can be used unchanged, it is also easy to
 * subclass it and make the <code>selectEncoding()</code> method more
 * intelligent about what encoding to choose, based on characteristics of
 * the incoming request (such as the values of the <code>Accept-Language</code>
 * and <code>User-Agent</code> headers, or a value stashed in the current
 * user's session.</p>
 *
 * @example.com Craig McClanahan
 * @example.com $Revision: 1.1.2.1 $ $Date: 2001/10/17 22:52:17 $
 */

public class SetCharacterEncodingFilter implements Filter {

static Category logCat = Category.getInstance(SetCharacterEncodingFilter.class.getName());
    // ----------------------------------------------------- Instance Variables


    /**
     * The default character encoding to set for requests that pass through
     * this filter.
     */
    protected String encoding = null;


    /**
     * The filter configuration object we are associated with.  If this value
     * is null, this filter instance is not currently configured.
     */
    protected FilterConfig filterConfig = null;


    /**
     * Should a character encoding specified by the client be ignored?
     */
    protected boolean ignore = true;


    // --------------------------------------------------------- Public Methods


    /**
     * Take this filter out of service.
     */
    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }


    /**
     * Select and set (if specified) the character encoding to be used to
     * interpret request parameters for this request.
     *
     * @example.com request The servlet request we are processing
     * @example.com result The servlet response we are creating
     * @example.com chain The filter chain we are processing
     *
     * @example.com IOException if an input/output error occurs
     * @example.com ServletException if a servlet error occurs
     */
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
	throws IOException, ServletException {

        // Conditionally select and set the character encoding to be used
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            logCat.debug("doFilter encoding="+encoding);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }

	// Pass control on to the next filter
        chain.doFilter(request, response);

    }


    /**
     * Place this filter into service.
     *
     * @example.com filterConfig The filter configuration object
     */
    public void init(FilterConfig filterConfig) throws ServletException {

	this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        logCat.debug("encoding="+encoding);
        String value = filterConfig.getInitParameter("ignore");
        logCat.debug("value="+value);
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }


    // ------------------------------------------------------ Protected Methods


    /**
     * Select an appropriate character encoding to be used, based on the
     * characteristics of the current request and/or filter initialization
     * parameters.  If no character encoding should be set, return
     * <code>null</code>.
     * <p>
     * The default implementation unconditionally returns the value configured
     * by the <strong>encoding</strong> initialization parameter for this
     * filter.
     *
     * @example.com request The servlet request we are processing
     */
    protected String selectEncoding(ServletRequest request) {
logCat.debug("selectEncoding = "+ this.encoding);
        return (this.encoding);

    }


}


//end of filter
//start of web.xml
<web-app>
  <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>Shift_JIS</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


Home | Main Index | Thread Index

Home Page Mailing List Linux and Japan TLUG Members Links