Minha aplicação não funciona se eu não informar a barra final da aplicação.
Sem Barra:
URL: http://localhost:7070/aplicacao
Com esse endereço é exibida uma página de login, sem exibir os conteúdos estáticos e quando executado o login é redirecionado erradamente para a seguinte url: http://localhost:7070/login
Com Barra:
URL: http://localhost:7070/aplicacao/
Com esse endereço é exibida a página de login corretamente e quando executado o login é redirecionado corretamente para a url: http://localhost:7070/aplicacao/login
Seguem os arquivos de configuração:
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Aplicacao</display-name>
<distributable />
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>br.com.xxx.ep.afac.util.Log4jInitServlet</servlet-class>
<init-param>
<param-name>log4j-properties-location</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Inicio da configuracao do DWR -->
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<javaee:param-name>debug</javaee:param-name>
<javaee:param-value>false</javaee:param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<!-- Fim da configuracao do DRW -->
<!-- Inicio da configuracao de inicialização (Configuração do SQLite) -->
<servlet>
<servlet-name>initDBService</servlet-name>
<servlet-class>br.com.xxx.ep.afac.modelo.InitDBService</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Fim da configuracao de inicialização (Configuração do SQLite) -->
<welcome-file-list>
<welcome-file>/content/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml" />
<bean type="org.apache.struts2.convention.PackageBasedActionConfigBuilder" name="convention" class="br.com.xxx.ep.afac.actions.MyActionConfigBuilder" />
<!-- habilita o uso de outros métodos de action internamente na classe action -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="false" />
<constant name="struts.locale" value="pt_BR" />
<constant name="struts.convention.actionConfigBuilder" value="convention" />
<constant name="struts.multipart.maxSize" value="5194304" />
<package name="default" extends="struts-default">
<result-types>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
</result-types>
<interceptors>
<interceptor name="autorizacao" class="br.com.xxx.ep.afac.interceptor.AutorizacaoInterceptor" />
<interceptor-stack name="crudStack">
<interceptor-ref name="autorizacao" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="crudStack"/>
<global-results>
<result name="login">/login.jsp</result>
<result type="redirectAction" name="naoAutorizacao">
<param name="actionName">login!naoAutorizado.action</param>
</result>
</global-results>
</package>
</struts>
index.jsp
<!-- index.jsp -->
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<tiles:insertDefinition name="login"/>
login.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href=<s:property value="#application.basePathStatic"/><c:out value='estatica/css/login.css'/> rel="stylesheet" type="text/css" />
<link href=<s:property value="#application.basePathStatic"/><c:out value='estatica/css/monitoramento.css'/> rel="stylesheet" type="text/css" />
<script src=<s:property value="#application.basePathStatic"/><c:out value='estatica/js/lib/jquery-1.4.4.min.js'/> type="text/javascript" ></script>
<title>Aplicacao</title>
</head>
<body>
<div class="telaLogin">
<div id="mensagem"><span><s:actionerror cssStyle="margin: 0;" /></span><span><s:actionmessage cssStyle="margin: 0;" /></span></div>
<div class="boxLogin">
<form name="frmLogin" action="login" method="post" id="frmLogin">
<input type="hidden" name="metodo" value="autenticar" />
<div class="txtLogin">Chave</div>
<div class="cxLogin">
<label title="Chave"> <input name="usuario.chave" type="text" class="small textfield" id="chave" size="27" maxlength="4" style="transparent;"/></label>
<br><br>
</div>
<div class="txtLogin">Senha</div>
<div class="cxLogin">
<label class="nopadding" title="Senha"> <input name="usuario.senha" type="password" class="small textfield" id="senha" size="27" maxlength="8" style="transparent;"/></label>
</div>
<br>
<s:submit value="Entrar" name="entrar" align="center" cssClass="bt1" style="cursor: pointer"/>
</form>
</div>
</div>
</body>
</html>