Struts 2 getRequestDispatcher forward to *.action

Q

Q1tum

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
 
Q

Q1tum

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 />
</[email protected]>

..........
..........
</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

request.getRequestDispatcher("/home.action").forward(request,
response); can only forward to .jsp files.
 
Joined
Nov 24, 2009
Messages
1
Reaction score
0
Did you find a solution?

Trying to do a similar thing. a filter forwarding to a struts2 action

Cheers

Kris
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,767
Messages
2,569,571
Members
45,045
Latest member
DRCM

Latest Threads

Top