Struts 2 getRequestDispatcher forward to *.action
Hi all,
I hope this is the right place to ask this question.
I'm started learning JSP / Java and need some advice regarding an
issue.
I created a tutorial project which makes use of the following:
- Maven (as local server)
- Struts 2
- Freemarker (template engine)
This is (a part) of my web.xml:
<web-app>
................
................
<servlet>
<servlet-name>LoginService</servlet-name>
<servlet-class>tutorial.services.LoginService</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginService</servlet-name>
<url-pattern>/LoginService.do</url-pattern>
</servlet-mapping>
</web-app>
-------------------------------
This is my struts.xml:
<struts>
<package name="tutorial" extends="struts-default">
<action name="index" class="indexAction">
<result type="freemarker">/ftl/index.ftl</result>
</action>
<action name="login*" method="{1}" class="loginAction">
<result name="input" type="redirect-action">index</result>
<result name="success" type="redirect-action">home</result>
</action>
<action name="home">
<result type="freemarker">/ftl/home.ftl</result>
</action>
</package>
</struts>
-------------------------------
Login Action (tutorialSupport extends ActionSupport):
package tutorial.actions;
import tutorial.comon.tutorialSupport;
import tutorial.dao.UserDAO;
import tutorial.vo.UserVO;
import com.opensymphony.xwork2.conversion.annotations.Conversion;
public class loginAction extends tutorialSupport {
private String login = null;
private String password = null;
public String execute() throws Exception {
String result = INPUT;
UserDAO userDAO = new UserDAO();
UserVO userVO = userDAO.getUserByLogin(login, password);
if( userVO != null) {
result = SUCCESS;
}
return result;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
-------------------------------
index.ftl (FreeMarker template file):
<html>
...........
...........
<@s.form action="LoginService.do" method="post">
<@s.textfield label="Login" name="login" />
<@s.password label="Password" name="password" />
<@s.submit />
</@s.form>
...........
...........
</htm>
-------------------------------
LoginService.java:
package tutorial.services;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import tutorial.dao.UserDAO;
import tutorial.vo.UserVO;
public class LoginService extends HttpServlet {
protected void doPost( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
UserDAO userDAO = new UserDAO();
UserVO userVO =
userDAO.getUserByLogin( request.getParameter("login") ,
request.getParameter("password") );
if( userVO == null ) {
request.setAttribute("error", "login");
request.getRequestDispatcher("/login.action").forward(request,
response);
}
else {
HttpSession httpSession = request.getSession(true);
httpSession.setAttribute("userVO", userVO);
request.getRequestDispatcher("/home.action").forward(request,
response);
}
}
}
--------------------
Problem:
When I submit the form, LoginService is called, lets assume my login
was incorrect, as soon as it gets to this line:
request.getRequestDispatcher("/login.action").forward(request,
response);
I get the following error:
#Start of the Error:
HTTP ERROR: 404
NOT_FOUND
RequestURI=/tutorial/login.action
#End of the Error
If I would replace request.getRequestDispatcher("/
login.action").forward(request, response); with
request.getRequestDispatcher("/login.jsp").forward(request, response);
or something, then it will find the page but I'm not using the Action
class anymore then.
I hope I made my problem clear, my questions are:
1. Why can't I forward to any action?
2. Is this the logical way of handling forms, actions etc.
3. Any other suggestions or remarks?
Thanks and regards,
Arno