回想起当年使用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(本例中未使用数据库,可按实际情况更改配置)
jsf.dicon
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
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。
http://s2jsf.seasar.org/ja/
上例中使用的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