I'm learning Struts 2 for a project requirement and I've met some issues.
Following this tutorial at:
http://www.mkyong.com/google-app-engine/google-app-engine-struts-2-example/
And what I've done extra:
Added an index.jsp into the war folder
Changed web.xml to
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="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/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<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>com.mkyong.listener.Struts2ListenerOnGAE</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Now, when I rebuild and loads
http://localhost:8888
Rather then seeing the content I should have in my index.jsp, I'm getting a
Error 404 There is no Action mapped for namespace [/] and action name [] associated with context path [].
Can someone point me to the right direction? I've seen some other similar questions in SO but their solutions do not work for this specific example of Struts 2 + GAE.
My struts.xml
<struts>
<package name="user" namespace="/User" extends="struts-default">
<action name="Login">
<result>pages/login.jsp</result>
</action>
<action name="Welcome" class="com.mkyong.user.action.WelcomeUserAction">
<result name="SUCCESS">pages/welcome_user.jsp</result>
</action>
</package>
</struts>
Folder structure
I cant post images so, http://i.imgur.com/KSPmaMr.png
Exact same libraries used for download
http://www[dot]mediafire[dot]com/?utliwvcmo63o8l7
ok ,i got your problem,
change your struts.xml to this
<struts>
<package name="default" extends="struts-default" namespace="/">
<action name="Login">
<result>pages/login.jsp</result>
</action>
<action name="Welcome" class="com.mkyong.user.action.WelcomeUserAction">
<result name="SUCCESS">pages/welcome_user.jsp</result>
</action>
</package>
</struts>
I guess this will work, because filterDispatcher search for struts.xml file in root folder if you put your struts.xml file in root directory.
#Eleazar I followed the mykong tutorial link that you mentioned in your question. There is no use of index.html as far as I see that tutorial. <welcome-list> file is used when the is no action mentioned on application startup.
On step:8 in that tutorial they has provided the url which is http://localhost:8888/User/Login.action you need to run the test. Its got nothing to do with file in welcome list...
UPDATE:
You are getting that error because you have added struts2 filter as /*, and your action namespace is for /User. There is not action namespace for /. Adding package with name="default" with namespace="/" i.e <package name="default" extends="struts-default" namespace="/"></package> will resolve you issue. It will hit <welcome-file>
Related
It is quite strange when I add faces-config.xml file in WEB-INF in my project it cause me an error "RES_NOT_FOUND"
note: I have try <link type="text/css" rel="stylesheet" href="style.css" />
and it's working fine without the faces-config.xml. I also try to move it inside resources folder
I have try to use this code to add a css file for my .xhtml page
<h:head>
<h:outputStylesheet name="styles.css" />
</h:head>
it will generate the following
<link type="text/css" rel="stylesheet" href="RES_NOT_FOUND">
I am using JSF 2.2 + Google App Engine as I follow the tutorial from this site
http://java.wildstartech.com/Java-Platform-Enterprise-Edition/JavaServer-Faces/javaserver-faces-22/configuring-jsf-22-to-run-on-the-google-app-engine-using-eclipse
the tutorial went good except until I try to import a external files like .css, .js, and image files; and when I access it directly from the link like localhost:8080/style.css the css file will display correctly.
here is my code
the web.xml
<?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>
My App
</display-name>
<description>
Template JSF 2.2 application configured to run on the Google
AppEngine for Java.
</description>
<!-- ***** Designate client-side state saving. ***** -->
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<!-- Set the default suffix for JSF pages to .xhtml -->
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<!-- Disable use of threading for single-threaded environments such as the Google AppEngine. -->
<context-param>
<param-name>com.sun.faces.enableThreading</param-name>
<param-value>false</param-value>
<!-- <description>
When enabled, the runtime initialization and default ResourceHandler
implementation will use threads to perform their functions. Set this
value to false if threads aren't desired (as in the case of running
within the Google Application Engine).
Note that when this option is disabled, the ResourceHandler will not
pick up new versions of resources when ProjectStage is development.
</description>-->
</context-param>
<!-- ***** Specify JBoss Expression Language Over Default -->
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
<!-- ***** Load the JavaServer Faces Servlet ***** -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
<context-param>
<param-name>primefaces.UPLOADER</param-name>
<param-value>commons</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config1.xml</param-value>
</context-param>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
<init-param>
<param-name>thresholdSize</param-name>
<param-value>2147483647</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
</web-app>
the index.xhtml
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<f:facet name="first">
<meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
<title>There is Hope!</title>
</f:facet>
<h:outputStylesheet name="style.css" />
</h:head>
<h:body>
<h:graphicImage url="logo.png"/>//this line works!
<br />
Hello from Facelets
<br />
<h:link outcome="welcomePrimefaces" value="Primefaces welcome page" />
</h:body>
</html>
the appengine-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://kenai.com/projects/nbappengine/downloads/download/schema/appengine-web.xsd appengine-web.xsd'>
<application>RetailSmarts</application>
<version>1</version>
<!--Allows App Engine to send multiple requests to one instance in parallel:-->
<threadsafe>true</threadsafe>
<!-- Configure java.util.logging -->
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<async-session-persistence enabled="true"></async-session-persistence>
</appengine-web-app>
the faces-config.xml(without this my web project works fine but I plan to use it later for these What is the use of faces-config.xml in JSF 2?
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2" 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-facesconfig_2_2.xsd">
<application>
<lifecycle>
<phase-listener>package.SessionPhaseListener</phase-listener>
</lifecycle>
</application>
</faces-config>
the SessionPhaseListener.java
public class SessionPhaseListener implements PhaseListener, Serializable {
private static final long serialVersionUID = 1L;
#Override
public void afterPhase(PhaseEvent arg0) {
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("CURRENT_TIME", System.currentTimeMillis());
}
#Override
public void beforePhase(PhaseEvent arg0) {
}
#Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
the tutorial stated I need to add the PhaseListener to Ensure the Contents of HttpSession Are Saved
Can anyone point which part of my project causes the error. I really want to use faces-config.xml without having a error. My whole point is, I cannot import css, js and other file with faces-config.xml present in my project. Is there any configuration or information I missed for JSF and GAE setup.
I am using microsoft enterprise validation framework. And I'm linking the file 'validation.config' in my app.config file.
<section name="validation" type="Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.ValidationSettings, Microsoft.Practices.EnterpriseLibrary.Validation, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
allowLocation="true" allowDefinition="MachineToApplication" restartOnExternalChanges="false" />
<validation configSource="LocalConfiguration\validation.config" />
In 'validation.config' file i have
<?xml version="1.0" encoding="utf-8" ?>
<validation>
<type name="Car">
<ruleset>
<properties>
<validators>...</validators>
</properties>
</ruleset>
</type>
<type name="Human">
<ruleset>
<properties>
<validators>...</validators>
</properties>
</ruleset>
</type>
</validation>
The question is: Can i put the 'Car' and 'Human' types in different files and link those files in validation.config or is there any other way of separation because my validators are too many and I want it to be clean and easy to read.
#.NETJunkie has a blog post on Splitting up Validation Application Block configuration into multiple files which should address your needs.
I tried Struts 2 in Google App Engine following example from http://www.mkyong.com/google-app-engine/google-app-engine-struts-2-example
It works perfectly but I can't accessed Development Console which is supposed to be accessed in http://localhost:8888/_ah/admin
Is it about the filter? How to fixed it?
Below is the content of web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="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/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<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>com.mkyong.listener.Struts2ListenerOnGAE</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
Yes, the <url-pattern>/*</url-pattern> maps everything to Struts filter.
I solved it by appending the code below to struts.xml
<constant name="struts.action.excludePattern" value="/_ah/admin"/>
Not sure what am i doing wrong, I am using http://www.tuckey.org/urlrewrite/#
1) put the jar file in lib directory
2) update web.xml with following code
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3) copied urlrewrite.xml into the WEB-INF directory and added following rule
<rule enabled="true">
<from>^/view/([a-z]+)/([a-z]+)$</from>
<to>/view?id=$1&title=$2</to>
</rule>
<outbound-rule>
<from>^/view?id=([a-z]+)&title=([a-z]+)$</from>
<to>/view/$1/$2</to>
</outbound-rule>
4) Also updated my JSP page with following - (/view -> is servlet which redirects to view.jsp?id=123&title=my%20title)
<a href="<%= response.encodeURL("/view?id="+id+"&title="+title)%>">
my expectation was -- to generate URL inside HTML as well as browser window as follows ...
www.mywebsite.com/view/123/my-title
5) but really - my URL is becoming ->
so not sure what am i doing wrong so my URL is not getting rewritten friendly way.
I'm trying to use Lift 2.1-SNAPSHOT on Google App Engine but the lift snippets in the HTML are not being processed. It simply returns the HTML file.
This is the lift.html file (just a simple test):
<lift:surround with="default" at="content">
Welcome to your Lift application
</lift:surround>
The web.xml has:
<filter>
<filter-name>LiftFilter</filter-name>
<display-name>Lift Filter</display-name>
<description>The Filter that intercepts lift calls</description>
<filter-class>net.liftweb.http.LiftFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LiftFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
The appengine-web.xml contains:
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>kivanotify</application>
<version>6</version>
<static-files/>
<resource-files/>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/classes/logging.properties"/>
<property name="in.gae.j" value="true" />
</system-properties>
<sessions-enabled>true</sessions-enabled>
<static-files>
<exclude path="/static/**" />
</static-files>
</appengine-web-app>
When running the project using " /opt/appengine-java-sdk-1.3.6/bin/dev_appserver.sh target/kivanotify" and accessing the url http://localhost:8080/lift.html is simple returns the lift.html as is without processing the tags.
Any idea why the tags are not being processed? There is no logging that hints at a problem.
Regards,
Gero
I remember you need the following setting in appengine-web-app.xml.
<static-files>
<exclude path="/**" />
</static-files>
BTW, I found stax.net is much Lift-friendly then GAE.