日系框架之seasar2(S2JSF)
来源:互联网 发布:淘宝不能用网银 编辑:程序博客网 时间:2024/04/20 17:14
回想起当年使用struts的时候,对他的tag真是又爱又恨。盼星星盼月亮,迎来了JSF。
然而,JSF的tag库虽然强大,却失去了灵活性,反而让人望而生畏。
S2JSF在通过seasar2的DI功能,把JSF标签注入到HTML页面,实现了类似模板引擎的功能。
示例如下:
如下图所示新建工程:
代码依次为:
AddAction.java- package examples.jsf.action;
- public interface AddAction {
- public String calculate();
- }
AddActionImpl.java
- package examples.jsf.action.impl;
- import examples.jsf.action.AddAction;
- import examples.jsf.dto.AddDto;
- import examples.jsf.logic.AddLogic;
- public class AddActionImpl implements AddAction {
- private AddDto addDto;
- private AddLogic addLogic;
- public void setAddDto(AddDto addDto) {
- this.addDto = addDto;
- }
- public void setAddLogic(AddLogic addLogic) {
- this.addLogic = addLogic;
- }
- public String calculate() {
- int result = addLogic.calculate(addDto);
- addDto.setResult(result);
- return null;
- }
- }
allaop.dicon
- <?xml version="1.0" encoding="Shift_JIS"?>
- <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
- "http://www.seasar.org/dtd/components21.dtd">
- <components>
- <include path="aop.dicon"/>
- <include path="dao.dicon"/>
- <include path="j2ee.dicon"/>
- <component
- name="actionThrowsInterceptor"
- class="examples.jsf.interceptor.ActionThrowsInterceptor"
- />
- <component
- name="actionInterceptorChain"
- class="org.seasar.framework.aop.interceptors.InterceptorChain"
- >
- <initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
- <initMethod name="add"><arg>actionThrowsInterceptor</arg></initMethod>
- </component>
- <component
- name="logicInterceptorChain"
- class="org.seasar.framework.aop.interceptors.InterceptorChain"
- >
- <initMethod name="add"><arg>aop.traceThrowsInterceptor</arg></initMethod>
- <initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
- <initMethod name="add"><arg>j2ee.requiredTx</arg></initMethod>
- </component>
- <component
- name="daoInterceptorChain"
- class="org.seasar.framework.aop.interceptors.InterceptorChain"
- >
- <initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
- <initMethod name="add"><arg>dao.interceptor</arg></initMethod>
- </component>
- </components>
AddDto.java
- package examples.jsf.dto;
- import java.io.Serializable;
- public class AddDto implements Serializable {
- private static final long serialVersionUID = 1L;
- private int arg1;
- private int arg2;
- private int result;
- public AddDto() {
- }
- public int getArg1() {
- return arg1;
- }
- public void setArg1(int arg1) {
- this.arg1 = arg1;
- }
- public int getArg2() {
- return arg2;
- }
- public void setArg2(int arg2) {
- this.arg2 = arg2;
- }
- public int getResult() {
- return result;
- }
- public void setResult(int result) {
- this.result = result;
- }
- }
HelloDto.java
- package examples.jsf.dto;
- public class HelloDto {
- private String name = "S2JSF";
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
AppRuntimeException.java
- package examples.jsf.exception;
- import java.text.MessageFormat;
- import java.util.ResourceBundle;
- public class AppRuntimeException extends RuntimeException {
- private static final long serialVersionUID = 1L;
- private static final Object[] EMPTY_ARGS = new Object[0];
- private static final String BUNDLE_NAME = "appMessages";
- private String messageId;
- private Object[] args;
- public AppRuntimeException(String messageId) {
- this(messageId, EMPTY_ARGS);
- }
- public AppRuntimeException(String messageId, Object[] args) {
- this(messageId, args, null);
- }
- public AppRuntimeException(String messageId, Object[] args, Throwable cause) {
- initCause(cause);
- this.messageId = messageId;
- this.args = args;
- }
- public Object[] getArgs() {
- return args;
- }
- public String getMessageId() {
- return messageId;
- }
- public String getMessage() {
- ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_NAME);
- String pattern = bundle.getString(messageId);
- return MessageFormat.format(pattern, args);
- }
- }
ActionThrowsInterceptor.java
- package examples.jsf.interceptor;
- import javax.faces.context.FacesContext;
- import org.aopalliance.intercept.MethodInvocation;
- import org.seasar.framework.aop.interceptors.ThrowsInterceptor;
- import org.seasar.jsf.util.MessageUtil;
- import examples.jsf.exception.AppRuntimeException;
- public class ActionThrowsInterceptor extends ThrowsInterceptor {
- private static final long serialVersionUID = 1L;
- public String handleThrowable(AppRuntimeException ex, MethodInvocation invocation) throws Throwable {
- FacesContext context = FacesContext.getCurrentInstance();
- context.addMessage(null, MessageUtil.getErrorMessage(ex.getMessageId(), ex.getArgs()));
- return null;
- }
- }
AddLogic.java
- package examples.jsf.logic;
- import examples.jsf.dto.AddDto;
- public interface AddLogic {
- public int calculate(AddDto addDto);
- }
AddLogicImpl.java
- package examples.jsf.logic.impl;
- import examples.jsf.dto.AddDto;
- import examples.jsf.logic.AddLogic;
- public class AddLogicImpl implements AddLogic {
- public AddLogicImpl() {
- }
- public int calculate(AddDto addDto) {
- return addDto.getArg1() + addDto.getArg2();
- }
- }
RequestDumpFilter.java
- package examples.jsf.util;
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletContext;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public final class RequestDumpFilter implements Filter {
- private static final Log log = LogFactory.getLog(RequestDumpFilter.class);
- private FilterConfig config = null;
- public void init(final FilterConfig filterConfig) throws ServletException {
- config = filterConfig;
- }
- public void destroy() {
- config = null;
- }
- private static final String INDENT = " ";
- private static final String LF = System.getProperty("line.separator");
- public void doFilter(final ServletRequest request,
- final ServletResponse response, final FilterChain chain)
- throws IOException, ServletException {
- if (config == null) {
- return;
- }
- if (request instanceof HttpServletRequest) {
- final HttpServletRequest hrequest = (HttpServletRequest) request;
- log.debug(LF + LF
- + "** before *****************************************: "
- + gerServletPath(request) + LF + dumpRequest(hrequest));
- try {
- chain.doFilter(request, response);
- } finally {
- final StringBuffer sb = new StringBuffer();
- RequestDumpUtil.dumpRequestAttributes(sb, hrequest, LF, INDENT);
- RequestDumpUtil.dumpCookies(sb, hrequest, LF, INDENT);
- RequestDumpUtil.dumpSessionAttributes(sb, hrequest, LF, INDENT);
- RequestDumpUtil.dumpContextAttributes(sb, config
- .getServletContext(), LF, INDENT);
- log
- .debug(LF
- + LF
- + "** after *****************************************: "
- + gerServletPath(request) + LF + sb.toString());
- }
- } else {
- chain.doFilter(request, response);
- }
- }
- private String dumpRequest(final HttpServletRequest request) {
- final StringBuffer sb = new StringBuffer();
- final ServletContext context = config.getServletContext();
- RequestDumpUtil.dumpRequestAndContextProperties(sb, request, context,
- LF, INDENT);
- RequestDumpUtil.dumpRequestParameters(sb, request, LF, INDENT);
- RequestDumpUtil.dumpRequestAttributes(sb, request, LF, INDENT);
- RequestDumpUtil.dumpCookies(sb, request, LF, INDENT);
- RequestDumpUtil.dumpRequestHeaders(sb, request, LF, INDENT);
- RequestDumpUtil.dumpSessionAttributes(sb, request, LF, INDENT);
- RequestDumpUtil.dumpContextAttributes(sb, context, LF, INDENT);
- return sb.toString();
- }
- private String gerServletPath(final ServletRequest request) {
- if (request instanceof HttpServletRequest) {
- return ((HttpServletRequest) request).getServletPath();
- }
- return null;
- }
- public String toString() {
- if (config == null) {
- return ("RequestDumperFilter()");
- }
- final StringBuffer sb = new StringBuffer("RequestDumperFilter(");
- sb.append(config);
- sb.append(")");
- return (sb.toString());
- }
- }
RequestDumpUtil.java
- package examples.jsf.util;
- import java.util.Collections;
- import java.util.Enumeration;
- import java.util.Iterator;
- import java.util.Locale;
- import java.util.SortedSet;
- import java.util.TreeSet;
- import javax.servlet.ServletContext;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- public class RequestDumpUtil {
- public static void dumpRequestHeaders(final StringBuffer sb,
- final HttpServletRequest request, final String lf,
- final String indent) {
- for (final Iterator it = toSortedSet(request.getHeaderNames())
- .iterator(); it.hasNext();) {
- final String name = (String) it.next();
- final String value = request.getHeader(name);
- sb.append(indent);
- sb.append("[header]").append(name);
- sb.append("=").append(value);
- sb.append(lf);
- }
- }
- public static void dumpContextAttributes(final StringBuffer sb,
- final ServletContext servletContext, final String lf,
- final String indent) {
- if (servletContext == null) {
- return;
- }
- for (final Iterator it = toSortedSet(servletContext.getAttributeNames())
- .iterator(); it.hasNext();) {
- final String name = (String) it.next();
- final Object attr = servletContext.getAttribute(name);
- sb.append(indent);
- sb.append("[context]").append(name).append("=").append(attr);
- sb.append(lf);
- }
- }
- public static void dumpCookies(final StringBuffer sb,
- final HttpServletRequest request, final String lf,
- final String indent) {
- Cookie cookies[] = request.getCookies();
- if (cookies == null) {
- cookies = new Cookie[0];
- }
- for (int i = 0; i < cookies.length; i++) {
- sb.append(indent);
- sb.append("[cookie]").append(cookies[i].getName());
- sb.append("=").append(cookies[i].getValue());
- sb.append(lf);
- }
- }
- public static void dumpRequestAttributes(final StringBuffer sb,
- final HttpServletRequest request, final String lf,
- final String indent) {
- for (final Iterator it = toSortedSet(request.getAttributeNames())
- .iterator(); it.hasNext();) {
- final String name = (String) it.next();
- final Object attr = request.getAttribute(name);
- sb.append(indent);
- sb.append("[request]").append(name).append("=").append(attr);
- sb.append(lf);
- }
- }
- public static void dumpSessionAttributes(final StringBuffer sb,
- final HttpServletRequest request, final String lf,
- final String indent) {
- final HttpSession session = request.getSession(false);
- if (session == null) {
- return;
- }
- for (final Iterator it = toSortedSet(session.getAttributeNames())
- .iterator(); it.hasNext();) {
- final String name = (String) it.next();
- final Object attr = session.getAttribute(name);
- sb.append(indent);
- sb.append("[session]").append(name).append("=").append(attr);
- sb.append(lf);
- }
- }
- private static SortedSet toSortedSet(final Enumeration enu) {
- final SortedSet set = new TreeSet();
- set.addAll(Collections.list(enu));
- return set;
- }
- public static void dumpRequestParameters(final StringBuffer sb,
- final HttpServletRequest request, final String lf,
- final String indent) {
- for (final Iterator it = toSortedSet(request.getParameterNames())
- .iterator(); it.hasNext();) {
- final String name = (String) it.next();
- sb.append(indent);
- sb.append("[param]").append(name).append("=");
- final String values[] = request.getParameterValues(name);
- for (int i = 0; i < values.length; i++) {
- if (i > 0) {
- sb.append(", ");
- }
- sb.append(values[i]);
- }
- sb.append(lf);
- }
- }
- public static void dumpRequestAndContextProperties(final StringBuffer sb,
- final HttpServletRequest request, final ServletContext context,
- final String lf, final String indent) {
- final HttpSession session = request.getSession(false);
- sb.append(indent);
- sb.append("Request class=" + request.getClass().getName()).append(
- ", instance=").append(request);
- sb.append(lf);
- sb.append(indent);
- sb.append("RequestedSessionId=")
- .append(request.getRequestedSessionId());
- sb.append(lf);
- sb.append(indent);
- if (session != null) {
- sb.append(" Session SessionId=").append(session.getId());
- sb.append(lf).append(indent);
- }
- sb.append("REQUEST_URI=").append(request.getRequestURI());
- sb.append(", SERVLET_PATH=").append(request.getServletPath());
- sb.append(lf).append(indent);
- if (session != null) {
- sb.append("Session :: CreationTime=").append(
- session.getCreationTime());
- sb.append(", LastAccessedTime=").append(
- session.getLastAccessedTime());
- sb.append(", MaxInactiveInterval=").append(
- session.getMaxInactiveInterval());
- sb.append(lf).append(indent);
- }
- sb.append("CharacterEncoding=" + request.getCharacterEncoding());
- sb.append(", ContentLength=").append(request.getContentLength());
- sb.append(", ContentType=").append(request.getContentType());
- sb.append(", Locale=").append(request.getLocale());
- sb.append(", Locales=");
- final Enumeration locales = request.getLocales();
- boolean first = true;
- while (locales.hasMoreElements()) {
- final Locale locale = (Locale) locales.nextElement();
- if (first) {
- first = false;
- } else {
- sb.append(", ");
- }
- sb.append(locale.toString());
- }
- sb.append(", Scheme=").append(request.getScheme());
- sb.append(", isSecure=").append(request.isSecure());
- sb.append(lf).append(indent);
- sb.append("SERVER_PROTOCOL=").append(request.getProtocol());
- sb.append(", REMOTE_ADDR=").append(request.getRemoteAddr());
- sb.append(", REMOTE_HOST=").append(request.getRemoteHost());
- sb.append(", SERVER_NAME=").append(request.getServerName());
- sb.append(", SERVER_PORT=").append(request.getServerPort());
- sb.append(lf);
- sb.append(indent);
- sb.append("ContextRealPath=").append(context.getRealPath("/"));
- sb.append(lf).append(indent);
- sb.append("SERVER_SOFTWARE=").append(context.getServerInfo());
- sb.append(", ServletContextName=").append(
- context.getServletContextName());
- sb.append(", MajorVersion=").append(context.getMajorVersion());
- sb.append(", MinorVersion=").append(context.getMinorVersion());
- sb.append(lf).append(indent);
- sb.append("ContextPath=").append(request.getContextPath());
- sb.append(", REQUEST_METHOD=").append(request.getMethod());
- sb.append(", QUERY_STRING=").append(request.getQueryString());
- sb.append(", PathInfo=").append(request.getPathInfo());
- sb.append(", RemoteUser=").append(request.getRemoteUser());
- sb.append(lf);
- }
- }
app.dicon
- <?xml version="1.0" encoding="Shift_JIS"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components>
- <include path="jsf.dicon"/>
- <include path="teeda.dicon"/>
- <include path="dao.dicon"/>
- <include path="examples/jsf/dicon/allaop.dicon"/>
- <component
- class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
- >
- <property name="instanceDef">
- @org.seasar.framework.container.deployer.InstanceDefFactory@REQUEST
- </property>
- <initMethod name="addClassPattern">
- <arg>"examples.jsf.action.impl"</arg>
- <arg>".*ActionImpl"</arg>
- </initMethod>
- </component>
- <component
- class="org.seasar.framework.container.autoregister.AspectAutoRegister"
- >
- <property name="interceptor">actionInterceptorChain</property>
- <initMethod name="addClassPattern">
- <arg>"examples.jsf.action.impl"</arg>
- <arg>".*ActionImpl"</arg>
- </initMethod>
- </component>
- <component
- class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
- >
- <property name="instanceDef">
- @org.seasar.framework.container.deployer.InstanceDefFactory@REQUEST
- </property>
- <initMethod name="addClassPattern">
- <arg>"examples.jsf.dto"</arg>
- <arg>".*Dto"</arg>
- </initMethod>
- </component>
- <component
- class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
- >
- <initMethod name="addClassPattern">
- <arg>"examples.jsf.logic.impl"</arg>
- <arg>".*LogicImpl"</arg>
- </initMethod>
- </component>
- <component
- class="org.seasar.framework.container.autoregister.AspectAutoRegister"
- >
- <property name="interceptor">logicInterceptorChain</property>
- <initMethod name="addClassPattern">
- <arg>"examples.jsf.logic.impl"</arg>
- <arg>".*LogicImpl"</arg>
- </initMethod>
- </component>
- </components>
appMessages.properties和appMessages_ja.properties暂为空。
convention.dicon
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components>
- <component class="org.seasar.framework.convention.impl.NamingConventionImpl"/>
- </components>
jdbc.dicon(本例中未使用数据库,可按实际情况更改配置)
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components namespace="jdbc">
- <include path="jta.dicon"/>
- <include path="jdbc-extension.dicon"/>
- <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
- <component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
- <arg>
- <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
- </arg>
- <property name="fetchSize">100</property>
- <!--
- <property name="maxRows">100</property>
- -->
- </component>
- <!--
- <component class="org.seasar.extension.jdbc.impl.OracleResultSetFactory"/>
- <component class="org.seasar.extension.jdbc.impl.BooleanToIntStatementFactory"/>
- -->
- <!-- for HSQLDB -->
- <component name="xaDataSource"
- class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
- <property name="driverClassName">
- "org.hsqldb.jdbcDriver"
- </property>
- <property name="URL">
- "jdbc:hsqldb:hsql://localhost:9001"
- <!--
- "jdbc:hsqldb:file:"
- + @org.seasar.framework.util.ResourceUtil@getBuildDir(@org.seasar.extension.dbcp.impl.ConnectionPoolImplTest@class).getCanonicalPath()
- + "/data/demo"
- -->
- </property>
- <property name="user">"sa"</property>
- <property name="password">""</property>
- </component>
- <!-- for Oracle -->
- <!--
- <component name="xaDataSource"
- class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
- <property name="driverClassName">
- "oracle.jdbc.driver.OracleDriver"
- </property>
- <property name="URL">
- "jdbc:oracle:thin:@xxx:1521:xxx"
- </property>
- <property name="user">"xxx"</property>
- <property name="password">"xxx"</property>
- </component>
- -->
- <!-- for PostgreSQL -->
- <!--
- <component name="xaDataSource"
- class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
- <property name="driverClassName">
- "org.postgresql.Driver"
- </property>
- <property name="URL">
- "jdbc:postgresql://localhost/TEST"
- </property>
- <property name="user">"xxxx"</property>
- <property name="password">"xxxx"</property>
- </component>
- -->
- <!-- MySQL
- - MySQL4.0以下でマルチバイト文字を扱う場合には,URL指定の後に,
- 以下の接続パラメータを追加で指定してください.
- useUnicode=true
- characterEncoding=[MySQLのエンコーディングに対応した
- Javaのエンコーディング名]
- 例:"jdbc:mysql://localhost:3306/test?useUnicode=true" +
- "&characterEncoding=Windows-31J"
- - MySQL5.0以降で,エンコーディングがeucjpmsの列を扱う場合には,
- URL指定の後に,以下の接続パラメータを追加で指定してください.
- characterEncoding=UTF-8またはWindows-31J
- characterSetResults=UTF-8またはWindows-31J
- 例:"jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8" +
- "&characterSetResults=UTF-8"
- この指定をしない場合,Java側でUCS-2⇔EUC_JP_Solarisの変換が
- 行なわれるため,ユーザー定義外字などの一部の文字が化けます.
- この指定をすることで,MySQL側でeucjpms⇔ucs2⇔utf8(cp932)の
- 変換が行なわれ,Java側でUCS-2⇔UTF-8(Windows-31J)の変換が
- 行なわれるようになります.この結果,文字化けを防げます.
- なおJIS X 0212(補助漢字)を使用する場合は,Windows-31Jではなく
- UTF-8を指定する必要があります.
- - 上記以外の場合は,my.cnfでdefault-character-setの設定を適切に
- (cp932やutf8など.デフォルトのlatin1は不可)行なっていれば,
- 文字化けは防げます.
- <component name="xaDataSource"
- class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
- <property name="driverClassName">
- "com.mysql.jdbc.Driver"
- </property>
- <property name="URL">
- "jdbc:mysql://localhost:3306/test"
- </property>
- <property name="user">"xxx"</property>
- <property name="password">"xxx"</property>
- </component>
- -->
- <!-- for SQLServer -->
- <!--
- <component name="xaDataSource"
- class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
- <property name="driverClassName">
- "net.sourceforge.jtds.jdbc.Driver"
- </property>
- <property name="URL">
- "jdbc:jtds:sqlserver://localhost/TEST;instance=SQLEXPRESS"
- </property>
- <property name="user">"xxxx"</property>
- <property name="password">"xxxx"</property>
- </component>
- -->
- <component name="connectionPool"
- class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
- <property name="timeout">600</property>
- <property name="maxPoolSize">10</property>
- <property name="allowLocalTx">true</property>
- <destroyMethod name="close"/>
- </component>
- <component name="DataSource"
- class="org.seasar.extension.dbcp.impl.DataSourceImpl"
- />
- <!-- from JNDI -->
- <!--
- <component name="DataSource"
- class="javax.sql.DataSource">
- @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/env/jdbc/DataSource")
- </component>
- -->
- </components>
jsf.dicon
- <?xml version="1.0" encoding="Shift_JIS"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components namespace="jsf" >
- <include path="jsfErrorPage.dicon"/>
- <component class="org.seasar.jsf.runtime.CompositeTaglibManager">
- <initMethod name="addTaglibManager">
- <arg>
- <component class="org.seasar.jsf.runtime.FileSystemTaglibManagerImpl">
- <initMethod name="init"/>
- <destroyMethod name="destroy"/>
- </component>
- </arg>
- </initMethod>
- <initMethod name="addTaglibManager">
- <arg>
- <component class="org.seasar.jsf.runtime.ServletContextTaglibManagerImpl">
- <initMethod name="init"/>
- <destroyMethod name="destroy"/>
- </component>
- </arg>
- </initMethod>
- </component>
- <component class="org.seasar.jsf.runtime.JsfConfigImpl">
- <initMethod name="addTaglibUri">
- <arg>"h"</arg>
- <arg>"http://java.sun.com/jsf/html"</arg>
- </initMethod>
- <initMethod name="addTaglibUri">
- <arg>"f"</arg>
- <arg>"http://java.sun.com/jsf/core"</arg>
- </initMethod>
- <initMethod name="addTaglibUri">
- <arg>"s"</arg>
- <arg>"http://www.seasar.org/jsf"</arg>
- </initMethod>
- <initMethod name="addTaglibUri">
- <arg>"x"</arg>
- <arg>"http://myfaces.apache.org/tomahawk"</arg>
- </initMethod>
- <initMethod name="addTaglibUri">
- <arg>"hello"</arg>
- <arg>"http://examples.jsf/taglib"</arg>
- </initMethod>
- <initMethod name="addTaglibUri">
- <arg>"r"</arg>
- <arg>"http://examples.jsf.hoge/taglib"</arg>
- </initMethod>
- </component>
- <component class="org.seasar.jsf.runtime.TagPoolImpl"/>
- <component class="org.seasar.jsf.runtime.TagProcessorTreeFactoryImpl">
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.PassThroughElementSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.SelectManyCheckboxSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.SelectOneRadioSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.SelectItemSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.InsertSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.ValidatorSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.InjectSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.MetaContentTypeSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.HtmlSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.OutputTextSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.TitleSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.OutputLinkSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.CommandButtonSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.CommandLinkSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.FormSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.BaseSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.InputTextSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.InputHiddenSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.InputSecretSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.InputTextareaSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.SelectBooleanCheckboxSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.SelectOneMenuSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.InputRadioSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.SelectManyListboxSelector"/>
- </arg>
- </initMethod>
- <initMethod name="addTagSelector">
- <arg>
- <component class="org.seasar.jsf.selector.ElementSelector"/>
- </arg>
- </initMethod>
- </component>
- <component class="org.seasar.jsf.runtime.ViewTemplateFactoryImpl"/>
- <component class="org.seasar.jsf.runtime.ViewRendererImpl"/>
- <component
- name="webappConfigManager"
- class="org.seasar.jsf.webapp.ServletContextWebappConfigManagerImpl">
- <initMethod name="init"/>
- </component>
- </components>
jsfErrorPage.dicon
- <?xml version="1.0" encoding="Shift_JIS"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components namespace="jsfErrorPage" >
- <component class="org.seasar.jsf.runtime.ErrorPageManagerImpl">
- <initMethod name="addErrorPage">
- <arg>@org.seasar.framework.exception.SQLRuntimeException@class</arg>
- <arg>"/errorpage/errorPageHsqldb.html"</arg>
- </initMethod>
- <initMethod name="addErrorPart">
- <arg>@org.seasar.framework.exception.SQLRuntimeException@class</arg>
- <arg>"/insert/errorPageHsqldb.html"</arg>
- </initMethod>
- </component>
- </components>
log4j.properties
- log4j.category.org.seasar=DEBUG, C
- log4j.additivity.org.seasar=false
- log4j.category.examples=DEBUG, C
- log4j.additivity.examples=false
- log4j.appender.C=org.apache.log4j.ConsoleAppender
- log4j.appender.C.Target=System.out
- log4j.appender.C.ImmediateFlush=true
- log4j.appender.C.layout=org.apache.log4j.PatternLayout
- log4j.appender.C.layout.ConversionPattern=%-5p %d [%t] %m%n
- log4j.rootLogger=INFO, A1
- log4j.appender.A1=org.apache.log4j.ConsoleAppender
- log4j.appender.A1.layout=org.apache.log4j.PatternLayout
- log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
- # myfaces logger
- log4j.logger.org.apache.myfaces=INFO
- log4j.logger.org.apache.myfaces.config=INFO
- log4j.logger.org.apache.myfaces.application=INFO
- log4j.logger.org.apache.myfaces.application.jsp=INFO
- log4j.logger.org.apache.myfaces.lifecycle=INFO
- log4j.logger.org.apache.myfaces.taglib=INFO
- log4j.logger.org.apache.myfaces.util.DebugUtils=INFO
- log4j.logger.org.apache.myfaces.renderkit.html.HtmlResponseWriterImpl=WARN
- log4j.logger.org.apache.myfaces.renderkit.html.HtmlRenderKitImpl=WAR
teedaCustomize.dicon
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components>
- <component class="org.seasar.teeda.core.render.DefaultComponentIdLookupStrategy" />
- <component class="org.seasar.teeda.core.application.impl.DefaultComponentLookupStrategy" />
- </components>
teedaErrorPage.dicon
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components namespace="teedaErrorPage" >
- <component class="org.seasar.teeda.core.util.ServletErrorPageManagerImpl"/>
- </components>
add/add.html
- <html xmlns:m="http://www.seasar.org/maya" m:extends="/WEB-INF/layout/layout.html">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
- <title>Add</title>
- </head>
- <body>
- <span m:inject="f:param" m:name="layoutTitle" m:value="Add"/>
- <span m:inject="s:insert" m:name="body">
- <form>
- <span m:inject="h:messages" m:globalOnly="false" m:showDetail="true"/>
- <input type="text" m:value="#{addDto.arg1}"/> +
- <input type="text" m:value="#{addDto.arg2}"/> =
- <span m:value="#{addDto.result}"/>
- <input type="submit" value="calculate" m:action="#{addAction.calculate}"/>
- </form>
- </span>
- </body>
- </html>
hello/hello.html
- <html xmlns:m="http://www.seasar.org/maya" m:extends="/WEB-INF/layout/layout.html">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
- <title>Hello</title>
- </head>
- <body>
- <span m:inject="f:param" m:name="layoutTitle" m:value="Hello"/>
- <span m:inject="s:insert" m:name="body">
- Hello <span m:value="#{helloDto.name}">hoge</span>
- <form action="hoge" m:passthrough="true"></form>
- </span>
- </body>
- </html>
WEB-INF/layout/csslayout.html
- <html xmlns:m="http://www.seasar.org/maya">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
- <link rel="stylesheet" type="text/css" href="css/global.css"/>
- <title m:value="#{layoutTitle}">S2JSF Example</title>
- </head>
- <body>
- <div class="menu">
- <span m:inject="s:insert" m:src="/WEB-INF/layout/menu.html"/>
- </div>
- <div class="level0">
- <div class="level1">
- <div class="header">
- <span m:inject="s:insert" m:src="/WEB-INF/layout/header.html"/>
- </div>
- <div class="body">
- <span m:inject="s:insert" m:name="body"/>
- </div>
- </div>
- </div>
- </body>
- </html>
WEB-INF/layout/footer.html
- <html xmlns:m="http://www.seasar.org/maya">
- <body>
- <span m:inject="s:insert">
- The Seasar Foundation
- </span>
- </body>
- </html>
WEB-INF/layout/header.html
- <html xmlns:m="http://www.seasar.org/maya">
- <body>
- <span m:inject="s:insert">
- <img m:inject="h:graphicImage" m:url="/images/seasar.gif"/>
- </span>
- </body>
- </html>
WEB-INF/layout/layout.html
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html xmlns:m="http://www.seasar.org/maya">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
- <link m:inject="s:link" rel="stylesheet" type="text/css" href="/css/global.css"/>
- <title m:value="#{layoutTitle}"/>
- </head>
- <body>
- <table border="0" cellspacing="5">
- <tr>
- <td colspan="2"><span m:inject="s:insert" m:src="/WEB-INF/layout/header.html"/></td>
- </tr>
- <tr>
- <td width="140" valign="top">
- <span m:inject="s:insert" m:src="/WEB-INF/layout/menu.html"/>
- </td>
- <td valign="top" align="left">
- <span m:inject="s:insert" m:name="body"/>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <hr/>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <span m:inject="s:insert" m:src="/WEB-INF/layout/footer.html"/>
- </td>
- </tr>
- </table>
- </body>
- </html>
WEB-INF/layout/menu.html
- <html xmlns:m="http://www.seasar.org/maya">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
- <title>S2JSFExample</title>
- </head>
- <body>
- <span m:inject="s:insert">
- <form>
- <ul>
- <li>
- <a m:action="hello">Hello</a>
- </li>
- <li>
- <a m:action="add">Add</a>
- </li>
- </ul>
- </form>
- </span>
- </body>
- </html>
faces-config.xml
- <?xml version="1.0"?>
- <!DOCTYPE faces-config PUBLIC
- "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
- "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
- <faces-config>
- <application>
- <message-bundle>appMessages</message-bundle>
- <locale-config>
- <default-locale>en</default-locale>
- <supported-locale>ja</supported-locale>
- </locale-config>
- </application>
- <converter>
- <converter-for-class>java.util.Date</converter-for-class>
- <converter-class>org.seasar.jsf.convert.S2DateTimeConverter</converter-class>
- </converter>
- <navigation-rule>
- <navigation-case>
- <from-outcome>hello</from-outcome>
- <to-view-id>/hello/hello.html</to-view-id>
- </navigation-case>
- </navigation-rule>
- <navigation-rule>
- <navigation-case>
- <from-outcome>add</from-outcome>
- <to-view-id>/add/add.html</to-view-id>
- <redirect/>
- </navigation-case>
- </navigation-rule>
- <lifecycle>
- <phase-listener>org.seasar.teeda.core.event.PhaseChangeTracer</phase-listener>
- </lifecycle>
- </faces-config>
web.xml
- <?xml version="1.0"?>
- <!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd">
- <web-app>
- <context-param>
- <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
- <param-value>server</param-value>
- <description>
- State saving method: "client" or "server" (= default)
- See JSF Specification 2.5.2
- </description>
- </context-param>
- <context-param>
- <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
- <param-value>.html</param-value>
- </context-param>
- <!-- Extensions Filter -->
- <filter>
- <filter-name>extensionsFilter</filter-name>
- <filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
- <init-param>
- <param-name>uploadMaxFileSize</param-name>
- <param-value>100m</param-value>
- <description>Set the size limit for uploaded files.
- Format: 10 - 10 bytes
- 10k - 10 KB
- 10m - 10 MB
- 1g - 1 GB
- </description>
- </init-param>
- <init-param>
- <param-name>uploadThresholdSize</param-name>
- <param-value>100k</param-value>
- <description>Set the threshold size - files
- below this limit are stored in memory, files above
- this limit are stored on disk.
- Format: 10 - 10 bytes
- 10k - 10 KB
- 10m - 10 MB
- 1g - 1 GB
- </description>
- </init-param>
- <init-param>
- <param-name>uploadRepositoryPath</param-name>
- <param-value>/temp</param-value>
- <description>Set the path where the intermediary files will be stored.
- </description>
- </init-param>
- </filter>
- <filter>
- <filter-name>s2filter</filter-name>
- <filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
- </filter>
- <filter>
- <filter-name>encodingfilter</filter-name>
- <filter-class>org.seasar.extension.filter.EncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>Windows-31j</param-value>
- </init-param>
- </filter>
- <filter>
- <filter-name>requestDumpFilter</filter-name>
- <filter-class>examples.jsf.util.RequestDumpFilter</filter-class>
- </filter>
- <!-- Extensions Filter -->
- <filter-mapping>
- <filter-name>extensionsFilter</filter-name>
- <url-pattern>*.html</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>extensionsFilter</filter-name>
- <url-pattern>/faces/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>s2filter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>encodingfilter</filter-name>
- <url-pattern>*.html</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>requestDumpFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <listener>
- <listener-class>org.seasar.teeda.core.webapp.TeedaConfigureListener</listener-class>
- </listener>
- <!-- facesServlet -->
- <servlet>
- <servlet-name>facesServlet</servlet-name>
- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <servlet>
- <servlet-name>s2servlet</servlet-name>
- <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
- <init-param>
- <param-name>debug</param-name>
- <param-value>true</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>facesServlet</servlet-name>
- <url-pattern>*.html</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>s2servlet</servlet-name>
- <url-pattern>/s2servlet</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
- </web-app>
index.html
- <html xmlns:m="http://www.seasar.org/maya" m:extends="/WEB-INF/layout/layout.html">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
- <title>S2JSFExample</title>
- </head>
- <body>
- <span m:inject="f:param" m:name="layoutTitle" m:value="Home"/>
- <span m:inject="s:insert" m:name="body">
- <h1>Welcome to S2JSF Example</h1>
- </span>
- </body>
- </html>
以上代码是从S2JSF自带的sample中抽出来的,更多用法还请下载S2JSF。
上例中使用的lib库均为S2JSF自带的sample中取得,列表如下:
aopalliance-1.0.jar
commons-beanutils-1.6.1.jar
commons-collections-3.1.jar
commons-el-1.0.jar
commons-fileupload-1.0.jar
commons-lang-2.1.jar
commons-logging-1.1.jar
geronimo-jsp_2.0_spec-1.0.jar
geronimo-jta_1.1_spec-1.0.jar
hsqldb-1.8.0.1.jar
javassist-3.4.ga.jar
jstl-1.1.2.jar
log4j-1.2.13.jar
nekohtml-0.9.3-nirvana.jar
ognl-2.6.7.jar
poi-2.5.1-final-20040804.jar
s2-dao-1.0.43.jar
s2-extension-2.4.13-sources.jar
s2-extension-2.4.13.jar
s2-framework-2.4.13-sources.jar
s2-framework-2.4.13.jar
s2-jsf-1.1.2-sources.jar
s2-jsf-1.1.2.jar
teeda-core-1.0.7-sources.jar
teeda-core-1.0.7.jar
teeda-extension-1.0.7.jar
tomahawk-1.1.1.jar
xercesImpl-2.6.2-sources.jar
xercesImpl-2.6.2.jar
- 日系框架之seasar2(S2JSF)
- 日系框架之seasar2(Teeda:S2JSF的孪生兄弟)
- 日系框架之seasar2(S2JDBC)
- 日系框架之seasar2(S2DAO)
- 日系框架之seasar2(S2Hibernate3)
- 日系框架之seasar2(SAStruts)
- 日系框架之seasar2(S2Struts)
- 日系框架之seasar2(S2JPA之Hibernate3)
- 日系框架之seasar2(S2JPA之TopLink)
- 日系框架之seasar2(S2JPA之OpenJPA)
- 日系框架之Seasar2之SQL注释大坑-yellowcong
- 日系框架之seasar2(S2JDBC) -----使用HSQLDB
- 日系框架之seasar2(Teeda支援HTML模板)
- 日系框架之seasar2(SAStruts)升级篇
- SeaSar2之struts2+ seasar2 + s2dao框架整合-yellowcong
- 开源框架 Seasar2
- 开源框架 Seasar2
- Seasar2 框架学习笔记
- SVM入门(三)线性分类器Part 2
- 【转帖】通往WinDbg的捷径(一)(二)
- 【转帖】学习WinDbg - (1)查看内核数据结构
- 泛型方法
- 【转帖】简单驱动编写与windbg调试
- 日系框架之seasar2(S2JSF)
- 揭开正则表达式的神秘面纱
- IE与FireFox的js和css几处不同点
- VC6中用DEF文件从DLL中导出C++类
- Gridview记录为空时显示表头,和没有记录的提示
- error: undefined reference to `pthread_create'
- 【转帖】windbg the easy way
- js中call,apply,setCapture,releaseCapture的使用
- ubuntu 双网卡锐捷共享上网笔记