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


Автор: Zamuta 21.11.2006, 15:59
Привет всем.

Решил повторить написанное на lib.juga.ru в статье введение в jsf. Вообще,  всё работает кроме самой записи в бд. БД MySQL 5. Параметры соединения хранятся в web.xml, jdbc драйвер использую скаченный с их сайта mysql-connector-java-5.0.4-bin.jar. Заранее таблицу создал.  Работаю в NetBeans 5.5. При правильной записи данных должна открываться страница с подтверждением успешного выполнения, а в обратном случае с неудачей, у меня как раз и открывается с неудачей. Непонятно.

Вот код:

GuestBean.java

Код


package regform;

import javax.faces.*;
import com.sun.jsfcl.app.*;
import javax.faces.component.html.*;
import javax.faces.context.*;
import java.sql.*; 
import com.sun.sql.rowset.*;
import java.util.regex.*;
import javax.servlet.*;

public class GuestBean extends FacesBean
{   
    private final String DRIVER_CLASS;
    private final String DB_HOST;
    private final String DB_USER;
    private final String DB_PASSWORD;    
                
    private HtmlForm frmGuest = new HtmlForm();
    public HtmlForm getFrmGuest()      {return frmGuest;}
    public void setFrmGuest(HtmlForm value)    {frmGuest = value;}
    
    private String name;
    public String getName() {return name;}    
    public void setName(String value)   {name = value;}    
    
    private String mail;
    public String getMail() {return mail;}    
    public void setMail(String value)   {mail = value;}    
    
    private String message;
    public String getMessage() {return message;}    
    public void setMessage(String value)   {message = value;}
    
    private String nameError = "";
    public String getNameError() {return nameError;}
    
    private String mailError = "";
    public String getMailError() {return mailError;}
    
    private String messageError = "";
    public String getMessageError() {return messageError;}
    
    private JdbcRowSetXImpl rowset;
    public JdbcRowSetXImpl getRowSet() {return rowset;}    
    public void setRowSet(JdbcRowSetXImpl value){rowset = value;}
   

    public GuestBean()
    {

        DRIVER_CLASS = this.getExternalContext().getInitParameter("driver_class");
  DB_HOST = this.getExternalContext().getInitParameter("db_host");
  DB_USER = this.getExternalContext().getInitParameter("db_user");
  DB_PASSWORD = this.getExternalContext().getInitParameter("db_password");
       

        rowset = getDataSource();
    } 
    

    private JdbcRowSetXImpl getDataSource()
    {
        try
        {
            Class.forName(DRIVER_CLASS).newInstance();
            JdbcRowSetXImpl jrs = new JdbcRowSetXImpl();
            jrs.setCommand("SELECT TOP 10 * FROM tblguest ORDER BY date DESC;");
            jrs.setUrl(DB_HOST);        
            jrs.setUsername(DB_USER);
            jrs.setPassword(DB_PASSWORD);
            jrs.execute();
            return jrs;        
        }
        catch(Exception e)
        {
            return null;
        }
    }    
   

    public String onClick()
    {        
        if(!validate())
            return "";
        
        boolean result = saveToDatabase();
        

        if(result)
            return "success";
        else
            return "failure";
    }
    
    private boolean validate()
    {

        
        boolean result = true;
        if(name.equals(""))
        {
            nameError = "Enter your name, please";
            result = false;
        }
        

        Pattern p = Pattern.compile("^[a-zA-Z0-9]+[@][a-z]+[.][a-z]{2,3}");
        Matcher m = p.matcher(mail);
        if(!m.matches())
        {
            mailError = "Enter your e-mail, please";
            mail = "";
            result = false;
        }
        
        if(message.equals(""))    
        {
            messageError = "Enter your message, please";
            result = false;
        }
        
        return result;
    }

    private boolean saveToDatabase()
    {
        try
        {        
            Class.forName(DRIVER_CLASS).newInstance();
            Connection con = DriverManager.getConnection(DB_HOST, DB_USER, DB_PASSWORD);
            Statement statement = con.createStatement();           
            statement.execute("INSERT INTO tblguest (name, mail, message) VALUES ('"+name+"', '"+mail+"', '"+message+"');");
        }
        catch(Exception e)
        {
            return false;
        }
        
        name = "";
        mail = "";
        message = "";
        
        return true;
    }
}




index.jsp

Код


<?xml version="1.0" encoding="UTF-8"?>
<jsp:root version="1.2" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ui="http://www.sun.com/web/ui">
    <jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"/>
    <f:view>
        <ui:page binding="#{index.page1}" id="page1">
            <ui:html binding="#{index.html1}" id="html1">
                <ui:head binding="#{index.head1}" id="head1">
                    <ui:link binding="#{index.link1}" id="link1" url="/resources/stylesheet.css"/>
                </ui:head>
                <ui:body binding="#{index.body1}" id="body1" style="background-color: rgb(153, 153, 0); -rave-layout: grid">
                    <ui:form binding="#{index.frmGuest}" id="frmGuest">
                        <ui:staticText binding="#{index.staticText1}" id="staticText1"
                            style="height: 24px; left: 48px; top: 48px; position: absolute; width: 46px" text="NAME:"/>
                        <ui:staticText binding="#{index.staticText2}" id="staticText2"
                            style="height: 24px; left: 48px; top: 96px; position: absolute; width: 46px" text="E-MAIL:"/>
                        <ui:staticText binding="#{index.staticText3}" id="staticText3"
                            style="height: 24px; left: 48px; top: 144px; position: absolute; width: 70px" text="MESSAGE:"/>
                        <h:inputText binding="#{index.txtName}" id="txtName" style="position: absolute; left: 144px; top: 48px; width: 144px; height: 24px" value="#{GuestBean.name}"/>
                        <h:inputText binding="#{index.txtMail}" id="txtMail" style="position: absolute; left: 144px; top: 96px; width: 144px; height: 24px" value="#{GuestBean.mail}"/>
                        <h:inputTextarea binding="#{index.txtMessage}" id="txtMessage"
                            style="position: absolute; left: 48px; top: 192px; width: 240px; height: 144px" value="#{GuestBean.message}"/>
                        <h:commandButton action="#{GuestBean.onClick}" binding="#{index.btnSend}" id="btnSend"
                            style="position: absolute; left: 48px; top: 360px; width: 240px; height: 24px" value="SEND"/>
                        <h:outputText binding="#{index.txtNameError1}" id="txtNameError1"
                            style="color: red; height: 24px; left: 312px; top: 48px; position: absolute; width: 264px" value="#{GuestBean.nameError}"/>
                        <h:outputText binding="#{index.txtMailError}" id="txtMailError"
                            style="color: red; height: 24px; left: 312px; top: 96px; position: absolute; width: 264px" value="#{GuestBean.mailError}"/>
                        <h:outputText binding="#{index.txtMessageError}" id="txtMessageError"
                            style="color: red; height: 24px; left: 312px; top: 192px; position: absolute; width: 264px" value="#{GuestBean.messageError}"/>
                    </ui:form>
                </ui:body>
            </ui:html>
        </ui:page>
    </f:view>
</jsp:root>




navigation.xml

Код

<faces-config>
    <navigation-rule>
        <from-view-id>/index.jsp</from-view-id>
        <navigation-case>
            <from-action>#{GuestBean.onClick}</from-action>
            <from-outcome>success</from-outcome>
            <to-view-id>/ok.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-action>#{GuestBean.onClick}</from-action>
            <from-outcome>failure</from-outcome>
            <to-view-id>/error.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>




managed-beans.xml

Код

<faces-config>
    <managed-bean>
        <managed-bean-name>SessionBean1</managed-bean-name>
        <managed-bean-class>regform.SessionBean1</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>index</managed-bean-name>
        <managed-bean-class>regform.index</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>ApplicationBean1</managed-bean-name>
        <managed-bean-class>regform.ApplicationBean1</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>RequestBean1</managed-bean-name>
        <managed-bean-class>regform.RequestBean1</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>ok</managed-bean-name>
        <managed-bean-class>regform.ok</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>error</managed-bean-name>
        <managed-bean-class>regform.error</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>GuestBean</managed-bean-name>
        <managed-bean-class>regform.GuestBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>



web.xml

Код


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/navigation.xml,/WEB-INF/managed-beans.xml</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.validateXml</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.verifyObjects</param-name>
<param-value>false</param-value>
</context-param>
    <context-param>
        <param-name>db_host</param-name>
        <param-value>jdbc:mysql://localhost:3306/registration</param-value>
    </context-param>
    <context-param>
        <param-name>db_class</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <context-param>
        <param-name>db_user</param-name>
        <param-value>root</param-value>
    </context-param>
    <context-param>
        <param-name>db_password</param-name>
        <param-value>password</param-value>
    </context-param>
    <filter>
<filter-name>UploadFilter</filter-name>
<filter-class>com.sun.rave.web.ui.util.UploadFilter</filter-class>
<init-param>
<description>
          The maximum allowed upload size in bytes.  If this is set
          to a negative value, there is no maximum.  The default
          value is 1000000.
        </description>
<param-name>maxSize</param-name>
<param-value>1000000</param-value>
</init-param>
<init-param>
<description>
          The size (in bytes) of an uploaded file which, if it is
          exceeded, will cause the file to be written directly to
          disk instead of stored in memory.  Files smaller than or
          equal to this size will be stored in memory.  The default
          value is 4096.
        </description>
<param-name>sizeThreshold</param-name>
<param-value>4096</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UploadFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet>
<servlet-name>ExceptionHandlerServlet</servlet-name>
<servlet-class>com.sun.errorhandler.ExceptionHandler</servlet-class>
<init-param>
<param-name>errorHost</param-name>
<param-value>localhost</param-value>
</init-param>
<init-param>
<param-name>errorPort</param-name>
<param-value>24444</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>ThemeServlet</servlet-name>
<servlet-class>com.sun.rave.web.ui.theme.ThemeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ExceptionHandlerServlet</servlet-name>
<url-pattern>/error/ExceptionHandler</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ThemeServlet</servlet-name>
<url-pattern>/theme/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
        <welcome-file>faces/index.jsp</welcome-file>
        </welcome-file-list>
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/error/ExceptionHandler</location>
</error-page>
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/error/ExceptionHandler</location>
</error-page>
<error-page>
<exception-type>javax.faces.FacesException</exception-type>
<location>/error/ExceptionHandler</location>
</error-page>
<error-page>
<exception-type>com.sun.rave.web.ui.appbase.ApplicationException</exception-type>
<location>/error/ExceptionHandler</location>
</error-page>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jspf</url-pattern>
<is-xml>true</is-xml>
</jsp-property-group>
</jsp-config>
</web-app>


Автор: Sherst 21.11.2006, 18:12
Посмотри что происходит в блоке Exception строка 139 - 142

Автор: Zamuta 22.11.2006, 23:25
Сделал вот так:

Код

private boolean saveToDatabase() {
        try {
            Class.forName(DRIVER_CLASS).newInstance();
            Connection con = DriverManager.getConnection(DB_HOST, DB_USER, DB_PASSWORD);
            Statement statement = con.createStatement();
            statement.execute("INSERT INTO tblguest (name, mail, message) VALUES ('"+name+"', '"+mail+"', '"+message+"');");
        } catch(Exception e) {

            System.err.println(" error ");
            e.printStackTrace(System.err);
            return false;
            
        } 
            name = "";
            mail = "";
            message = "";
            return true;
        
        
    }


блок 

            name = "";
            mail = "";
            message = "";
            return true;

не смог заключить в эксепшн, говорит, эксепшн уже и так ловится. 

В результате в консоли получаю:

error 
java.lang.NullPointerException
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:164)
        at regform.GuestBean.saveToDatabase(GuestBean.java:129)
        at regform.GuestBean.onClick(GuestBean.java:91)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:146)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:92)
        at com.sun.rave.web.ui.appbase.faces.ActionListenerImpl.processAction(ActionListenerImpl.java:57)
        at javax.faces.component.UICommand.broadcast(UICommand.java:332)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:287)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:401)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:95)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:110)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:213)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at com.sun.rave.web.ui.util.UploadFilter.doFilter(UploadFilter.java:195)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)


Что скажите? Как блок  

            name = "";
            mail = "";
            message = "";
            return true;


заключить в эксепшн? Создать свой?


Автор: tux 22.11.2006, 23:42
Во время выполнения вот этой строки
Код

Class.forName(DRIVER_CLASS).newInstance();

у тебя значение DRIVER_CLASS равно null.

Автор: Zamuta 23.11.2006, 00:17
Понял, спасибо.

в web.xml писал db_class, а нужно driver_class....

Затем получил сообщение о том, что id у меня в таблице не должно быть пустым, установил значение  "1" , запись прошла успешно, получил страницу success. Но при следующей попытке записи данных пишет:

error 
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 1
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3099)
        at com.mysql.jdbc.Statement.execute(Statement.java:695)
        at regform.GuestBean.saveToDatabase(GuestBean.java:132)
        at regform.GuestBean.onClick(GuestBean.java:91)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:146)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:92)
        at com.sun.rave.web.ui.appbase.faces.ActionListenerImpl.processAction(ActionListenerImpl.java:57)
        at javax.faces.component.UICommand.broadcast(UICommand.java:332)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:287)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:401)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:95)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:110)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:213)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at com.sun.rave.web.ui.util.UploadFilter.doFilter(UploadFilter.java:195)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)

Ругается на id?

И ещё, через MySQL Administrator я не вижу полученных данных в таблице, это нормально? В бд новичок, не судите строго.....

Автор: tux 23.11.2006, 00:27
Поле id - это, очевидно, первичный ключ. Значения первичных ключей должны быть уникальны, а ты пытаешься создать вторую запись со значением id=1. Настоятельно рекомендовал бы почитать про базы данных иначе сейчас подобные вопросы посыпятся как из рога изобилия.

Автор: Zamuta 23.11.2006, 00:40
Спасибо за доходчивые ответы  smile .........пошёл читать.........

Автор: Armiol 24.11.2006, 13:18
Еще один вариант, который значительно облегчает подобную задачу -- использовать JSF совместно со Spring и Hibernate. Это позволяет разделять бизнес-логику приложения и логику работы с базой, порой достаточно сложную.
Туториалов и статей по этой теме в сети предостаточно, взять хотя бы http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html

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