我想在site-mesh的装饰器文件中使用spring安全标记库的一些标记.但是这些标签内的内容从未显示过.谁能告诉我为什么会这样?
码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<!--HTML-->
<form id="login_form" method="post" action="<c:url value='j_spring_security_check'/>">
<sec:authorize access="isAuthenticated()">
<p>profile</p>
<p>messages</p>
</sec:authorize>
<sec:authorize access="isAnonymous()">
<!--A Login form -->
</sec:authorize>
</form>
<!--More HTML -->
</html>
Run Code Online (Sandbox Code Playgroud)
由于某种原因,两个块都没有显示.
Apache Tiles于2018年12月移入阁楼。因此Apache Tiles已退休。
我正在使用Spring MVC框架和JSP。
有哪些替代方案?我看到了Sitemesh,但这是一个装饰器,我需要一个模板框架。
我想维护自己的图块并使用其他框架。这是一个很大的应用程序,所以我无法同时重写所有图块
有人可以帮我吗?
我在Grails中使用布局支持(sitemesh)工作正常.我想调整我的布局,使其取决于用户是否登录.
我的grails-app/views/layouts/main.gsp包含以下代码:
<g:if test="${user}">
Username: ${user.username}
</g:if>
Run Code Online (Sandbox Code Playgroud)
但是,看起来好像layout-GSP:s无法访问模型,因此无法访问用户变量(尝试时我得到"No session"异常).制作布局的推荐方法取决于用户是否登录?
提前致谢!
我正在尝试使用Tomcat 5作为我的容器将SiteMesh集成到遗留应用程序中.我有一个main.jsp我正在用一个简单的装饰器装饰.
在decorators.xml,我刚刚定义了一个装饰器:
<decorators defaultdir="/decorators">
<decorator name="layout-main" page="layout-main.jsp">
<pattern>/jsp/main.jsp</pattern>
</decorator>
</decorators>
Run Code Online (Sandbox Code Playgroud)
如果我手动去,这个装饰工作http://example.com/my-webapp/jsp/main.jsp.但是,有一些地方的servlet,而不是重定向到jsp,执行转发:
getServletContext().getRequestDispatcher("/jsp/main.jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)
这意味着URL保留在类似于http://example.com/my-webapp/servlet/MyServletjsp文件的东西上,因此没有被装饰,我认为因为它与模式不匹配decorators.xml.
我不能做,<pattern>/*</pattern>因为还有其他jsps不需要装饰layout-main.jsp.我不能做一个<pattern>/servlet/MyServlet*</pattern>因为有时MyServlet可能转发main.jsp,也许error.jsp在其他时间转发.
有没有办法解决这个问题,而无需对servlet如何工作进行广泛的更改?由于它是一个遗留的应用程序,我没有那么多的自由来改变事物,所以我希望有一些配置方面可以解决这个问题.
SiteMesh的文档真的不是很好.我一直在为分发附带的示例应用程序工作.我真的很喜欢SiteMesh,我希望能在这种情况下让它工作.
我正在尝试在我的网站中实现sitemesh装饰器.他们网站上的示例有一个完整的URI链接到他们的站点,用于装饰器文件的taglib部分:
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的网站依赖于能够访问该网站?因为我想部署在无法访问外部世界的Intranet内部.
谢谢
我想呈现Grails的页面没有<html>,<head>和<body>标签,我只是想DIV和表格.
我想这个网页在我的Facebook页面整合和Facebook页面的要求是网页不应该包含<html>,<head>或<body>标签.
我正在使用带有sitemesh和spring消息包的Spring MVC 3.0.例如,我有以下内容:
<spring:message code="nav.item.name"/>
Run Code Online (Sandbox Code Playgroud)
如果我的资源文件中不存在nav.item.name,我在控制台中收到一个空白页面和一个JspTagException,我无法用我的@ExceptionHandler方法捕获它.我假设我无法捕捉它,因为错误是视图渲染的一部分.我还试图创建一个自定义HandlerInterceptorAdapter,并修改web.xml,但没有成功.有趣的是,我还使用了以下标记:
<fmt:message key="nav.item.name"/>
Run Code Online (Sandbox Code Playgroud)
视图显示页面,但带有"???????" 对于文本.这实际上对我至少可以显示页面更容易接受,但我宁愿使用spring:message标签.
我的问题是:我如何捕获JspTagException?
堆栈跟踪:
2011-10-12 09:31:16,155 ERROR [http-8080-2] RequestContextAwareTag - 在代码'BLAH'下找不到区域设置'ko_KR'的消息.javax.servlet.jsp.JspTagException:在代码'BLAH'下找不到区域设置'ko_KR'的消息.在Org.apache.jache.jEB_002dINF的org.springframework.web.servlet.tags.MessageTag.doStartTagInternal(MessageTag.java:184)org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) .pages.common.nav_jsp._jspx_meth_spring_005fmessage_005f0(nav_jsp.java:206)org.apache.jsp.WEB_002dINF.pages.common.nav_jsp._jspService(nav_jsp.java:114)org.apache.jasper.runtime.HttpJspBase.service (HttpJspBase.java:70)位于org.apache.jasper的org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)的javax.servlet.http.HttpServlet.service(HttpServlet.java:717).位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)的servlet.JspServlet.serviceJspFile(JspServlet.java:313)位于org的javax.servlet.http.HttpServlet.service(HttpServlet.java:717) .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:20 6)org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)atg.apache.catalina.core.ApplicationDispatcher .include(ApplicationDispatcher.java:488)位于org.springframework.web.servlet.view.AbstractView.render上的org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:229)(AbstractView.java:250 )org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)位于org.springframework.web.servlet.DispatcherServlet的org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817).位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)的doService(DispatcherServlet.java:719)位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)的javax.servlet上javax.ser上的.http.HttpServlet.service(HttpServlet.java:617)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)的vlet.http.HttpServlet.service(HttpServlet.java:717)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206)org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)atg.apache.catalina.core.ApplicationDispatcher .include(ApplicationDispatcher.java:488)org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)at org.apache.jsp.WEB_002dINF.sitemesh_002ddecorators.main_jsp._jspx_meth_form_005fform_005f0(main_jsp.java:284)at org.apache.jsp.WEB_002dINF.sitemesh_002ddecorators.main_jsp._jspService(main_jsp.java:138)位于org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)的javax.servlet.http.HttpServlet.service( HttpServlet.java:717)org.apache.jasper.servlet.JspServletWrapper.service(JspS)ervletWrapper.java:386)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)的javax.servlet.http .httpServlet.service(HttpServlet.java:717)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)org.apache.catalina.core.ApplicationDispatcher.include( ApplicationDispatcher.java:488)com.opensymphony.sitemesh.compatability.OldDecorator2NewDecorator.render(OldDecorator2NewDecorator.java:46)com.opensymphony.sitemesh.webapp.decorator.BaseWebAppDecorator.render(BaseWebAppDecorator.java:33)com.opensymphony .sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:84)at或 g.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)位于org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206). dogilterInternal(OpenEntityManagerInViewFilter.java:113)位于org.apache的org.apache.catal.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) .catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) :191)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)org.apache.catalina.core. StandardEngineValve.invoke(Standa rdEngineValve.java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)org.apache.coyote .http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588)atg.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)at java.lang.Thread.run(Unknown Source)
谢谢!戴夫
我创建了一个扩展第 3 方抽象类的新类。新类调用抽象类中的方法。我遇到的问题是在尝试编写单元测试时,我不确定如何编写测试,因为我不知道 3rd 方课程所需的确切细节。
下面的 AbstractDecoratorMapper 是一个 SiteMesh 特定的类,我必须扩展它才能使 SiteMesh 正常工作。据我从文档中可以看出,我不能使用组合。
public final class PartnerDecoratorMapper extends AbstractDecoratorMapper {
@Override
public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {
super.init(config, properties, parent);
}
@Override
public Decorator getDecorator(HttpServletRequest request, Page page) {
if (super.getDecorator(request, page).getName().equalsIgnoreCase("default")) {
return getNamedDecorator(request, "externalPartnerDefault");
}
return super.getDecorator(request, page);
}
}
Run Code Online (Sandbox Code Playgroud)
如果此工具可以提供任何帮助,我会使用 JMock。
我有一个基于 spring 框架 3 的 Maven Web 应用程序,当我maven-jetty-plugin通过运行命令在 jetty 上运行该应用程序时mvn -e clean jetty:run,它运行正常,但是当我tomcat-maven-plugin通过运行命令在 tomcat 上运行它时mvn -e clean tomcat:run,它给出了以下异常:
java.lang.ClassCastException: org.springframework.web.filter.HiddenHttpMethodFilter cannot be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)
at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at …Run Code Online (Sandbox Code Playgroud) 我使用Struts 2(版本2.3.14.3)和Sitemesh 3(版本3.0-alpha-2),我在cerain情况下得到一个NullPointerException.
首先,这是我在web.xml中的struts2/sitemesh配置:
<filter-mapping>
<filter-name>struts-prepare</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts-execute</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</servlet-class>
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
现在,这是问题描述:
如果启用了struts dev.mode并且我尝试访问不存在的操作,则抛出struts ConfigurationException.
Struts调度程序尝试通过调用org.apache.struts2.dispatcher.Dispatcher.sendError()来处理异常,该函数将标准Struts错误模板(/org/apache/struts2/dispatcher/error.ftl)写入响应.
现在这是事情开始出错的时候了.
因为原始请求是用sitemesh过滤器修饰的,即使发生配置错误之后,sitemesh也会尝试应用装饰器,这会导致异常,因为由于配置异常导致Struts操作上下文设置不正确而且我得到以下内容:
java.lang.NullPointerException
org.apache.struts2.sitemesh.FreemarkerDecoratorServlet.process(FreemarkerDecoratorServlet.java:176)
Run Code Online (Sandbox Code Playgroud)
以下是来自FreemarkerDecoratorServlet.java的相应代码 - ctx变量为null:
ActionContext ctx = ServletActionContext.getActionContext(request);
model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper);
Run Code Online (Sandbox Code Playgroud)
我认为sitemesh不应该尝试装饰响应,以防在调用操作时出现错误,但我不知道如何在不修改Struts2/Sitemesh集成的情况下执行此操作.
任何想法如何避免NPE?
谢谢,马雷克
sitemesh ×10
java ×5
jsp ×4
spring ×3
grails ×2
deprecated ×1
forward ×1
freemarker ×1
integration ×1
jmock ×1
layout ×1
localization ×1
maven ×1
spring-mvc ×1
struts ×1
struts2 ×1
tiles ×1
unit-testing ×1