Tiles,struts和 JavaServer Faces集成

本文介绍了多种复用模版tiles的方法,包括使用jsp:include标签、struts-tiles.tld以及JSF与tiles的集成。通过具体示例展示了如何在web应用中实现布局的复用,提高开发效率。

     在大多数项目中,很多web开发人员能做的就是利用IDE自动为我们生成配置文件,但真正当我们自己想动手写个项目时,发现很多模块我们似懂非懂,无法入手。当然要学会这些项目中的每个模块以及如何集成它们,这还是需要平时的点滴的积累。

    经常我们利用基于eclipse开发IDE来创建我们的页面,但实质上它在后台自动帮我们生成多很多配置文件,如spring,bb,tiles。

    现在介绍的就如何复用我们的模版tiles.

 

它的方式很多种,多到每个语言都有各自的配置方式,但是万变不离其中,那就是复用一些常用的模版。

一.最原始的就是jsp:include方式:

<TABLE border="0">
			<TBODY>
				<TR>
					<TD colspan="2">
						<jsp:include page="/header.jsp" />
					</TD>
				</TR>
				<TR>
					<TD colspan="2">
						<jsp:include page="/body.jsp" />
					</TD>
				</TR>
				<TR>
					<TD colspan="2">
						<jsp:include page="/footer.jsp" />
					</TD>
				</TR>
			</TBODY>
		</TABLE>

 

这是个简单的利用标签来复用

 

二.利用struts-tiles.tld

<TABLE border="0">
			<TBODY>
				<TR>
					<TD colspan="2">
						<tiles:insert page="/header.jsp" flush="true" />
					</TD>
				</TR>
				<TR>
					<TD colspan="2">
						<tiles:insert page="/body.jsp" flush="true" />
					</TD>
				</TR>
				<TR>
					<TD colspan="2">
						<tiles:insert page="/footer.jsp" flush="true" />
					</TD>
				</TR>
			</TBODY>

		</TABLE>

 

    这个标签是在基于 struts上的tld,所以你必须加入如下两个文件
     1.struts-tiles.tld
     2.struts.jar 包

 

 

3.struts-tiles.tld与JSF的集成

    这种方式是比较常用的,它可以把相关页面利用tiles.xml集成起来,甚至利用模版和常用文件,你都可以不用新建你的JSP文件。下面就来感受一下它的妙处吧:

  3.1首先是快速搞个jsf+spring+hibernate的工程(没有的可以参照这里

                  http://lygle.iteye.com/admin/blogs/616800),然后建立三个JSP文件

     head.jsp

     body.jsp

     footer.jsp

再建立个模版文件

        layout.jsp

 

  

<f:view>
			<table width="778" border="1" align="center" cellpadding="0"
				cellspacing="0">
				<tr>
					<td>
						<f:subview id="header">
							<t:insert attribute="header" flush="false"></t:insert>
						</f:subview>
					</td>
				</tr>
				<tr>
					<td>
						<f:subview id="body">
							<t:insert attribute="body" flush="false"></t:insert>
						</f:subview>
					</td>
				</tr>
				<tr>
					<td>
						<f:subview id="footer">
							<t:insert attribute="footer" flush="false"></t:insert>
						</f:subview>
					</td>
				</tr>
			</table>
		</f:view>

 使它包含着上面的三个文件

 

   3.2修改JSF配置文件

        在配置文件加个导航规则

<navigation-case>
			<from-action>#{UserLoginBB.userLogin}</from-action>
			<from-outcome>ok</from-outcome>
			<to-view-id>/homePage.jsf</to-view-id>

		</navigation-case>

 

  这个规则假设是我们登录的动作,如果成功返回ok,然后跳转到"homePage.jsf"

注意这里的homePage.jsf事实上不存在的,它是利用tiles动态配置出来的一个页面。怎么配呢,继续往下看吧。

 

 

3.3配置web.xml跟tiles.xml

    确保web.xml里有引用到我们的tiles.xml

如:

	<context-param>
		<param-name>tiles-definitions</param-name>
		<param-value>/WEB-INF/tiles.xml</param-value>
	</context-param>

 

关键的tiles.xml

<!DOCTYPE tiles-definitions PUBLIC
 "-//Apache Software Foundation//DTD Tiles Configuration//EN"
 "http://jakarta.apache.org/struts/dtds/tiles-config.dtd">
<tiles-definitions>
	<definition name="layout" path="/layout.jsp">
		<put name="header" value="/header.jsp" />
		<put name="body" value="/body.jsp" />
		<put name="footer" value="/footer.jsp" />
	</definition>
	<definition name="layout2" path="/layout.jsp">
		<put name="footer" value="/header.jsp" />
		<put name="body" value="/body.jsp" />
		<put name="header" value="/footer.jsp" />
	</definition>

	<definition name="layout3" path="/layout.jsp">
		<put name="header" value="/header.jsp" />
		<put name="body" value="/body.jsp" />
		<put name="footer" value="/footer.jsp" />
	</definition>
	<definition name="/homePage.tiles" extends="layout3">
	</definition>
</tiles-definitions>

 

这个配置文件里,我配置一个name为homePage",并且它的模版继承自layout3

 

那么请问,当你跳转到"/homePage.jsf",这个不存在的文件,它怎么跟tiles.xml关系上呢。当你有这个疑问时,说明你可以继续往下看了。

 

 3.4.配置ViewHandle

   在faces-config.xml里配置一个请求监听,当我们请求/homePage.jsf,它能够监听到并把它转到

/homePage.tiles从而调用layout3模版里的页面。

这个过程我们就引用apache里的一个文件,稍作修改,最重要的就是renderView接收请求,并把请求转为

/homePage.tiles这个过程

有兴趣的话,可以下来调试看下.

部分代码如下:

 

 if (servletMapping.isExtensionMapping())
        {
            if (!viewId.endsWith(suffix))
            {
                int dot = viewId.lastIndexOf('.');
                if (dot == -1)
                {
                    //if (log.isTraceEnabled()) log.trace("Current viewId has no extension, appending default suffix " + suffix);
                    viewId = viewId + suffix;
                }
                else
                {
                    //if (log.isTraceEnabled()) log.trace("Replacing extension of current viewId by suffix " + suffix);
                    viewId = viewId.substring(0, dot) + suffix;
                }
                facesContext.getViewRoot().setViewId(viewId);
            }
        }
        else if (!viewId.endsWith(suffix))
        {
            // path-mapping used, but suffix is no default-suffix
            dispatch(externalContext, viewToRender, viewId);
            return;
        }

        String tilesId = viewId;
        int idx = tilesId.lastIndexOf('.');
        if (idx > 0)
        {
            tilesId = tilesId.substring(0, idx) + tilesExtension;
        }
        else
        {
            tilesId = tilesId  + tilesExtension;
        }
        ServletRequest request = (ServletRequest)externalContext.getRequest();
        ServletContext servletContext = (ServletContext)externalContext.getContext();

        ComponentDefinition definition = null;
        try
        {
            definition = getDefinitionsFactory().getDefinition(tilesId, request, servletContext);

            if (definition == null)
            {
                /**
                 * Check for the definition without the leading '/' character.  Allows user to specify Tiles definitions without a
                 * leading '/' char.
                 */
                int slashIndex = tilesId.indexOf("/");
                if (slashIndex == 0)
                {
                    tilesId = tilesId.substring(1);
                    definition = getDefinitionsFactory().getDefinition(tilesId, request, servletContext);
                }
            }

 

 

 

 

 

内容概要:本文档详细介绍了基于Cplex求解器的风光制氢合成氨系统优化研究,通过Matlab代码实现对这一复杂可再生能源系统的建模与优化分析。研究聚焦于风能、光伏等可再生能源耦合电解水制氢并进一步合成氨的综合能源系统,重点解决系统在容量配置与运行调度方面的协同优化问题。采用Cplex求解器进行高效的混合整数线性规划(MILP)求解,实现了对系统经济性、能效性、环境可持续性的多目标优化,涵盖设备选型与容量设计、能量流分配、运行策略制定、制氢与合成氨工艺集成等关键技术环节。该研究为高比例可再生能源消纳、绿氢规模化生产及绿色化工转型提供了重要的理论依据与可行的技术路径。; 适合人群:具备电力系统、能源系统、运筹学或化工过程系统工程等相关背景,熟悉Matlab编程与数学建模方法,从事新能源、氢能、综合能源系统、绿色化工等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并复现高水平学术论文中关于风光制氢合成氨系统的优化模型构建方法;② 掌握利用Cplex求解器解决复杂能源系统混合整数线性规划(MILP)问题的核心技术与实践流程;③ 为自身的科研项目或工程应用提供系统建模、优化算法实现与代码参考的坚实基础。; 阅读建议:学习者应结合所提供的Matlab代码与相关参考文献,深入剖析模型的物理意义、数学推导过程、约束条件的设定逻辑以及目标函数的设计思路,特别关注Cplex与Matlab的接口调用与数据传递机制,并建议通过调整关键参数(如可再生能源出力、设备效率、成本系数等)进行敏感性分析,以全面理解系统优化的内在机理与决策影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值