Spring Web MVC tomcat deployment issues - spring-mvc

I am developing one Spring Web application with Intellij IDEA deployed to tomcat.
I met the issues below:
When I set the application context to the application name(my app) in the Run/Debug configuration page then run tomcat i can access the tomcat homepage and can see "myapp" in the manager page but can't access it.
The URL will be "localhost:8080/request" when clicking myapp in the manager page.
I have to add "myapp" to the URL as "localhost:8080/myapp/request".In this way the requested page can be accessed.
But if i removed "/myapp" from application context leaving it blank in the Run/Debug configuration page then run tomcat i will access the requested page successfully.
The URL is "localhost:8080/request" now the same as before without "myapp".
If I just added the myapp.war file in /webapps folder the result is the same as the first scenario.
What i want is that I put the war file in /webapps folder and start the tomcat server then the page can be accessed.
Anything wrong i have done for the configuration or missed something?
Thanks in advance for the help.
This is the web.xml
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/root-context.xml
</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

Related

Servlet Mappings Jetty 8

I have a webapp that works with Tomcat 8 and Jetty 8. Recently, we have introduced servlet-mappings
<servlet>
<servlet-name>page</servlet-name>
<jsp-file>/Dashboard.html</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>page</servlet-name>
<url-pattern>/editjob</url-pattern>
</servlet-mapping>
When you put an url with "http://localhost:8080/app/editjob", in tomcat is redirected to "http://localhost:8080/app/Dashboard.html". But when we deploy it using embed Jetty, a 404 Not Found it is being returned. It seems that the servlet-mapping is not working.
HTTP ERROR 404
Problem accessing /app/page. Reason:
Not Found
Powered by Jetty://
I can enter in the app by using directly
http://localhost:8080/app/Dashboard.html. Without mappings, we have no problem with jetty
This is the code for embedding Jetty:
final Server server = new Server();
SocketConnector connector = new SocketConnector();
connector.setMaxIdleTime(-1);
connector.setSoLingerTime(-1);
connector.setPort(8080);
server.setConnectors(new Connector[]{connector});
final WebAppContext context = new WebAppContext();
context.setServer(server);
context.setContextPath("app");
context.setWar(location.toExternalForm());
server.setHandler(context);
context.start();
server.join();
This is the web.xml with the mappings.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>app</display-name>
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletAdaptor</servlet-name>
<url-pattern>/webresources/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<jsp-file>/Login.html</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>page</servlet-name>
<jsp-file>/Dashboard.html</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param>
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.allowGenericHttpRequests</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowSubdomains</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE, OPTIONS</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Origin, Content-Type, X-Requested-With, Access-Control-Allow-Origin</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>cors.maxAge</param-name>
<param-value>-1</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>page</servlet-name>
<url-pattern>/home</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>page</servlet-name>
<url-pattern>/jobs</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>Index.html</welcome-file>
</welcome-file-list>
</web-app>
I have tried to define the servlet-mappings when i start the server, but did not work.
This mappings are working perfectly with Tomcat, but Jetty...I dont know which could be the problem.
Thanks in advance.
Problem accessing /app/page.
That URL is not mapped anywhere in your pasted web.xml
The servlets with urls patterns (defined in <servlet-mapping> entries) are:
/webresources/*
/login
/home
/jobs
None of those will match on a request URL of /page, resulting in the DefaultServlet (which is default mapped at /) returning a 404 for that requested resource.
Also, you haven't setup JSP in your embedded-jetty environment, so no JSP is being used.
Copied from prior answer https://stackoverflow.com/a/28483349/775715
If that code snippet represents how you are initializing your webapp, then you are missing a lot of JSP initialization steps.
There's an example project produced by the Jetty Project showing how to use JSP with embedded Jetty at
https://github.com/jetty-project/embedded-jetty-jsp
Pay attention to ...
The dependencies you need
The required ClassLoader type
The scratchDir declaration
The ServletContainerInitializer setup
The Jsp Servlet Holder and mappings
The InstanceManager
(just to name a few big ones)

Spring Web application not running

I have a spring web application build with maven. If i run that through Netbean it runs but if i simple copy .war in webapps folder it doesn't run.
Here is context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/myapp"/>
web.xml
<display-name>myapp</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Here is the directory structure
myapp
|-----------META-INF
|-----------resources
|-----------Web-inf
Through Netbean i can run localhost:8084/myapp but if i just copy .war file to webapps folder i can't

how to direct default page to an spring controller?

The project(named:'myproject') use Spring MVC framework. The default page will be "index.action", web.xml configed as below:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.action</welcome-file>
</welcome-file-list>
The server response 404 not found When while visiting http://www.example.com/myproject/, but it works fine while visiting http://www.example.com/myproject/index.action.
Any help will be appreciated!
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Changing the servlet mapping to the above means all request mappings will handled by spring.

Cometd servlet in glassfish is returning Unexpected response 302

I'm completely new using cometd and I'm trying to use it to enable push messages in my web application. After testing successfully with jetty 8, I'm trying to plug cometd directly to my web application, so I've changed my web.xml this way:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="erp-hm" version="3.0">
<display-name>ERP HM</display-name>
<welcome-file-list>
<welcome-file>inicio.xhtml</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>Logout Servlet</servlet-name>
<servlet-class>com.hrgi.web.seguranca.ControladorLogout</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet>
<servlet-name>push</servlet-name>
<servlet-class>org.cometd.server.CometdServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet>
<servlet-name>Download Servlet</servlet-name>
<servlet-class>com.hrgi.web.erp.DownloadArquivoServlet</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Logout Servlet</servlet-name>
<url-pattern>/j_spring_security_logout</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>push</servlet-name>
<url-pattern>/push/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Download Servlet</servlet-name>
<url-pattern>*.pdf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.enableMissingResourceLibraryDetection</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appContext.xml</param-value>
</context-param>
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.application</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
<param-value>/inicio.xhtml</param-value>
</context-param>
<listener>
<listener-class>com.hrgi.web.erp.DataServletContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<async-supported>true</async-supported>
</filter>
<filter>
<filter-name>filtroLimpadorCache</filter-name>
<filter-class>com.hrgi.web.seguranca.FiltroLimpadorCache</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>filtroLimpadorCache</filter-name>
<url-pattern>/login*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<error-page>
<error-code>403</error-code>
<location>/acesso_negado.xhtml</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/endereco_invalido.xhtml</location>
</error-page>
<session-config>
<session-timeout>600</session-timeout>
</session-config>
</web-app>
The first time javascript client try to connect I get 400 error:
jQuery(document).ready(function ($) {
cometd = $.cometd;
cometd.configure('https://localhost:8181/erp-web/push/');
cometd.handshake();
});
when java client try to publish in the channel, I get this:
[#|2012-12-05T19:54:35.543+0000|INFO|oracle-glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=122;_ThreadName=Thread-8;|05/12/2012 - 19:54:35 [HttpClient-122] INFO org.cometd.client.BayeuxClient.2002219263 - Messages failed [{id=12, supportedConnectionTypes=[long-polling], channel=/meta/handshake, version=1.0}]
java.net.ProtocolException: Unexpected response 302: TransportExchange#5f331f10=POST//localhost:8181/erp-web/push/handshake#CONTENT(1ms)->COMPLETED(0ms)sent=22ms
at org.cometd.client.BayeuxClient$PublishTransportListener.onProtocolError(BayeuxClient.java:1161)
at org.cometd.client.transport.LongPollingTransport$TransportExchange.onResponseComplete(LongPollingTransport.java:324)
at org.eclipse.jetty.client.HttpExchange$Listener.onResponseComplete(HttpExchange.java:1158)
at org.eclipse.jetty.client.HttpExchange.setStatus(HttpExchange.java:305)
at org.eclipse.jetty.client.AbstractHttpConnection$Handler.messageComplete(AbstractHttpConnection.java:337)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
at org.eclipse.jetty.client.AsyncHttpConnection.handle(AsyncHttpConnection.java:133)
at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:722)
|#]
Is there something I can do to solve it?? Or I should use jetty to implement cometd server??
For the JS client problem, I suspect you should disable WebSocket on the client, because Glassfish does not support WebSocket and CometD only works with Jetty's WebSocket implementation.
See here for how to configure the JS client WebSocket transport.
For the Java client problem, if you get a 302 is probably because the URL you used to configure the BayeuxClient is not the CometD URL. The CometD servlet never replies with a 302, so you must be hitting the wrong URL.

Multiple JAX-RS applications

I have specified my JAX-RS Application in the web.xml as follows:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>
com.myapp.MYRestApplication
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Is it possible for me to pass another JAX-RS application class to this CXF servlet?
Regards,
Anand
While CXF can manage multiple JAX-RS applications within a single servlet — I use this configuration in my own code — it is sufficiently complex that you're far better off switching to using a Spring-based configuration. The CXFNonSpringJaxrsServlet can only support limited configuration. In my code, I have this (a little complex because I'm also using Spring security, but you can drop that filter):
<!-- Location of the main Spring/CXF configuration file -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<!-- Apply Spring Security as a wrapper to everything -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Hook for Spring lifecycle management; you want this -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- A single servlet to handle all CXF processing -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

Resources