Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Хелп со STRUTS


Автор: ylims 11.4.2007, 11:43
имеется  JSP-ka: 
Код

.....
<html:form action="addUser.do">
   <html:text property="field"/>
  <html:submit value="Добавить" property="Submit"/>
 </html:form>
.....


Struts-config.xml
Код

<?xml version="1.0" encoding="WINDOWS-1251"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
    <form-beans>
        <form-bean name="uploadForm" type="inteface.addNewUser.beans.Form"/>
    </form-beans>
    <action-mappings>
    <action
        path="/addUser"
        name="uploadForm"
        scope="request"
        validate="false"
        type="inteface.addNewUser.AddUserAction">
       <forward   name="done"  path="/userAdd.jsp"/>
       <forward   name="error"  path="/main.jsp"/>
     </action>
  </action-mappings>
</struts-config>


описанный в struts-config BEAN содержит стандартные get set.

Вопрос следующий, в каком месте мне сделать запись данных из формы в БД, и как ? 
(Если из Action то как получить данные из бина)

Добавлено через 11 минут и 32 секунды
Вопрос снят. разобрался )

Автор: BlackD 11.4.2007, 12:04
ActionForms represent request data coming from the browser. ActionForms are used to populate HTML forms to
display to end users and to collect data from HTML forms. In order to create an ActionForm, you need to follow
these steps:

1. Create a new class in the strutsTutorial package called UserRegistrationForm that subclasses
org.apache.struts.action.ActionForm as follows:
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import javax.servlet.http.HttpServletRequest;
public class UserRegistrationForm extends ActionForm {

2. Now you need to create JavaBean properties for all the fields that you want to collect from the HTML
form. Let’s create firstName, lastName, userName, password, passwordCheck (make sure they
entered the right password), e-mail, phone, fax and registered (whether or not they are already registered)
properties. Add the following fields:
private String firstName;
private String lastName;

Add getter and setter methods for each field as follows:
public String getEmail() {
return email;
}
public void setEmail(String string) {
email = string;
}

3. Next you need validate the user entered valid values. In order to do this, you need to override the
validate method as follows:
public ActionErrors validate(
ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (firstName==null
|| firstName.trim().equals("")){
errors.add("firstName",
new ActionError(
"userRegistration.firstName.problem"));
}
...
return errors;
}


Я вчера с этим разбирался smile В общем, если юзаешь tags, то создаешь класс, наследуемый от ActionForm. При нажании на кнопку, ответ из браузера(вместе со всеми данными от тегов, например <html:text property="field"/>), переходит в этот класс. Нам обычно эти данные обрабатываются, и если они нас удовлетворяют (validate), то дальше все переходит в Action. 
Создай класс, наследуемый от ActionForm, там записывай данные в базу. В конфиге сделай из него бин, в <action сяжи его со страницей ввода и все вроде.

А вообще, посмотри в книге Jakarta Struts Live, если есть. Там отличный пример.


Опоздал.... :(

Автор: ylims 12.4.2007, 03:57
BlackD прикинь запоролся на том же что и ты, вылетает 
Код

javax.servlet.ServletException: Cannot find ActionMappings or ActionFormBeans collection
.....

хотя вроде всё верно, и всё работало, не понял чего вдруг стало вылетать

Struts-config
Код

<struts-config>
    <form-beans>
        <form-bean name="uploadForm" type="inteface.addNewUser.beans.Form"/>
    </form-beans>
    <action-mappings>
    <action
        path="/addUser"
        type="inteface.addNewUser.AddUserAction"
        name="uploadForm"
        scope="request"
        input="/userAdd.jsp"
        validate="false">
       <forward   name="done"  path="/userAdd.jsp"/>
       <forward   name="error"  path="/main.jsp"/>
     </action>
  </action-mappings>
</struts-config>


web.xml
Код

<web-app>
    <servlet>
        <servlet-name>InStrax</servlet-name>
        <servlet-class>inDb.InStrax</servlet-class>
    </servlet>

    <servlet>
     <servlet-name>action</servlet-name>
     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
     <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
     </init-param>
    </servlet>

    <servlet-mapping>
            <servlet-name>InStrax</servlet-name>
            <url-pattern>/writeInStrax</url-pattern>

            <servlet-name>action</servlet-name>
            <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <taglib>
       <taglib-uri>/tags/struts-html</taglib-uri>
       <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    </taglib>
    <taglib>
       <taglib-uri>/tags/struts-bean</taglib-uri>
       <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    </taglib>
    <taglib>
       <taglib-uri>/tags/struts-logic</taglib-uri>
       <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
  </taglib>
</web-app>


класс inteface.addNewUser.beans.Form
Код

package inteface.addNewUser.beans;
import org.apache.struts.action.ActionForm;
import dbConnect.db;
import encode.Encode;
import java.sql.SQLException;

public class Form extends ActionForm{
    String f;
    public String getF () {
     return this.f != null ? this.f: "";
    }
    public String setF ( String f) {
     this.f=f;
    }


Action
Код

public class AddUserAction extends Action {
    public ActionForward execute(ActionMapping mapping,
           ActionForm form,
           HttpServletRequest request,
           HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException
    {
      if (request.getParameter("f").equals("")) {
            return mapping.findForward("error");
        }
     else {
            //Form upForm=(Form)form;
            //try {
            //     upForm.addUser();
            //} catch (SQLException e) {
             //    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
             /// }
            return mapping.findForward("done");
         }

   }
}


Добавлено через 11 минут и 25 секунд
сори пометил как решённый, щас снял

Автор: tux 12.4.2007, 07:31
Причинами могут быть следующие:
  • в WEB-INF/lib не хватает библиотек, нужных Struts. Посмотри к нему в дистрибутив и возьми все оттуда
  • в странице JSP может быть какая-то ссылка, описанная тэгами <html:form> или <html:link>, а в struts-config.xml такой ссылки нет
  • и еще много-много, диагностика проблем в Struts не на высоте
Поэтому проверяй корректность всего, что есть в приложении, точнее диагностировать вряд ли получится.

Автор: ylims 12.4.2007, 07:53
ошибка вылазит очевидно из-за тега
Код

<html:form action="addUser.do">

т.е если заменить его на стандартный форм то страница грузиться

Автор: tux 12.4.2007, 09:11
Так напиши:
Код

<html:form action="/addUser">

Автор: ylims 12.4.2007, 09:48
Код

<%@ page contentType="text/html;charset=windows-1251" language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
 <head>
  <title>Добавлениепользователя</title>
  <style type="text/css">@import url("stylesheet.css");</style>
 </head>
 <body>

  <html:form action="/addUser">
    <html:text property="field"/>
    <html:submit/>
  </html:form>
  </body>
</html:html>


всё равно такая же ошибка. млин чо за ф..гня, всёж вроде правильно

Автор: ylims 12.4.2007, 11:36
млин добавил в web.xml
Код

<web-app>
    <servlet>
     <servlet-name>action</servlet-name>
     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
     <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
     </init-param>
     <init-param>
       <param-name>debug</param-name>
       <param-value>2</param-value>
     </init-param>
     <init-param>
        <param-name>detail</param-name>
        <param-value>2</param-value>
     </init-param>
     <load-on-startup>2</load-on-startup>   

    </servlet>
....

вроде заработало, а что они означают?

Автор: BlackD 12.4.2007, 11:38
у тебя
Код

package inteface.addNewUser.beans;    
import org.apache.struts.action.ActionForm;    
import dbConnect.db;    
import encode.Encode;    
import java.sql.SQLException;    
public class Form extends ActionForm{    
    String f;    
    public String getF () {    
     return this.f != null ? this.f: "";    
    }    
    public String setF ( String f) {    
     this.f=f;    
    }

Попробуй поменять имя переменной f на field. У тебя же <html:text property="field"/>, так откуда оно знает, что f - это field.

Автор: kkorsakoff 12.4.2007, 12:03
У тебя не было load-on-startup. Один раз случайно удалил строку, промучился пару дней. Причем ошибки выскакивали в совершенно неожиданных местах с совершенно необъяснимым описание и стектрейсом

Автор: ylims 13.4.2007, 07:06
Цитата(BlackD @ 12.4.2007,  11:38)
у тебя
Код

package inteface.addNewUser.beans;    
import org.apache.struts.action.ActionForm;    
import dbConnect.db;    
import encode.Encode;    
import java.sql.SQLException;    
public class Form extends ActionForm{    
    String f;    
    public String getF () {    
     return this.f != null ? this.f: "";    
    }    
    public String setF ( String f) {    
     this.f=f;    
    }

Попробуй поменять имя переменной f на field. У тебя же <html:text property="field"/>, так откуда оно знает, что f - это field.

сорри я ошибся просто, у мя везде поле называется f, так что не в этом проблема
BLACKD слушай просьба такая можеш мне выложить рабочий пример который ты сделал с ActionForm.

Добавлено через 2 минуты и 7 секунд
Цитата(kkorsakoff @ 12.4.2007,  12:03)
У тебя не было load-on-startup. Один раз случайно удалил строку, промучился пару дней. Причем ошибки выскакивали в совершенно неожиданных местах с совершенно необъяснимым описание и стектрейсом

после добывления данной строки, страница грузиться но при сабмите всё равно вылазит
Код

HTTP Status 500 - No action instance for path /addUser could be created

--------------------------------------------------------------------------------

type Status report

message No action instance for path /addUser could be created

description The server encountered an internal error (No action instance for path /addUser could be created) that prevented it from fulfilling this request.


--------------------------------------------------------------------------------

Apache Tomcat/5.0.28

Автор: ylims 13.4.2007, 10:58
всё, всем спасибо, разобрался. Ошибка глупейшая, не верно указал Package где находился Action, поэтому и не находил асtion
 (вот я д..блоид  smile )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)