• 0
daziplqa

درس في بناء تطبيق ويب بإستخدام Eclipse (و إستخدام MVC)

سؤال

السلام عليكم ورحمة الله و بركاته,

سوف أتحدث عن كيفيه إستخدام eclipse لبناء مشروع ويب بإستخدام jsp/servlet على طريقة ال Model-View-Controller

١- قم بتزيل eclipse من هنا : Eclipse IDE for Java EE Developers

2- قم بتحميل tomcat من هنا

٣- قم بفك ضغظ كلا الملفين في مجلد من إختيارك, و لنقل ل eclipse

/home/mhewedy/programs/eclipse_ee 

و ل tomcat :

/home/mhewedy/programs/tomcat6.0.26

(ملحوظه: قم بتنصيب mysql إذ لم يكن منصب لديك, أو أي برنامج إدارة قواعد بيانات أخر, ولكن, قم بتغير ال url, user, password على حسب البرنامج الذي سوف تستخدمه)

٤- إذهب إلى المجلد الذي يحتوي على eclipse و قم بالنقر على (تشغيل) الملف eclipse (أو eclipse.exe إذا كنت تستخدم ويندوز)

٥- لإنشاء تطبيق ويب جديد, إختر File , ثم New ثم Other ثم إكتب في مربع النص dynamic , ثم إختر Dynamic Web Project , إضغط Next

6- أدخل إسم لمشروعك, و ليكن, MyWebApp

٧- تحت Target runtime إنقر New, إختر Apache tomcat 6.0 , ثم إضغط Next, إضغط Browse , ثم إختر المسار الذي يحوي tomcat, إضغط finish

٩- نحن مازلنا في معالج إنشاء تطبيق جديد, إضغط Next, Next, Finish.

١٠- تعالي على WebContent و إضغط بزر الفأره الأيمن و إختر New ثم JSP ثم أدخل إسم , مثلا index.jsp ثم إضغط finish

(تأكد من أن الصفحه سوف يتم إنشاؤها داخل المجلد : MyWebApp/WebContent )

١١ -سيكون لدينا تطبيق بالشكل التالي:

post-70497-12731494855552_thumb.png

دعنا نتحدث عن مشروعنا, المشروع عباره عن صفحة تسجيل عاديه, يقوم المستخدم بتسجيل بياناته لدينا,,,

هذه هي شفرة قاعدة البيانات:

create database register;
use register;
create table user(
id int not null AUTO_INCREMENT PRIMARY KEY,
username varchar(50) not null,
password varchar(50) not null,
fullname varchar(200),
email varchar(50)
);

قم بتنفيذها على قاعدة بياناتك

بعد ذلك, تعالي لنصمم البرنامج,

أولا لنبدأ بال Model :

سوف نمثل بيانات المستخدم بالفئة User , قم بإنشاء صنف جديد و سمه User , و إكتب به الشفره التاليه:

package com.forat.model;

import java.io.Serializable;

public class User implements Serializable {
private int id;
private String username;
private String password;
private String fullName;
private String email;

public User() {
}

public int getId() {
return id;
}
private void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

تعالي معا لنكتب الكود الذي سوف يخزن الكائن من نوع User إلي قاعدة البيانات:

أولا , هذه هي العمليات التي سوف نقوم بتنفيذها على أي كائن عندنا في تطبيقنا, قمت بوضعها داخل واجهه لكي تكون بمثابة عقد يقوم بإبرامه أي كائن يريد أن يُخزن في قاعدة البيانات:

package com.forat.model;

import java.util.List;

public interface DAO<T> {
public void persist(T o);
public T find (int id);
public List<T> findAll();
public void remove(int id);
public void update(T o);
}

و لأننا نريد أن نخزن الكائن User, سوف نوقع هذا العقد:

package com.forat.model;

import java.util.List;

public class UserDAO implements DAO<User> {

@Override
public void persist(User o) {

}
@Override
public User find(int id) {
return null;
}

@Override
public List<User> findAll() {
return null;
}

@Override
public void remove(int id) {

}

@Override
public void update(User o) {

}

}

سوف نقوم بكتابة الكود لهذه الفئة لاحقا, ولكن دعنا أولا نقوم بكتابة الكود الذي سوف يتعامل مباشرة مع قاعدة البيانات:

بداية, قم بتحميل ال jdbc driver الخاص ب mysql من هنا

ثم ضعه في مشروعك داخل المجلد

MyWebApp/WebContent/WEB-INF/lib

بالنسبه للكود الخاص بال JDBC,

قم بإنشاء الثلاث فئات التاليه:

package com.forat.db;

import java.sql.Connection;

public class PooledConnection {

private Connection connection;
private boolean inUse = false;

public PooledConnection(Connection connection) {
this.connection = connection;
}

/**
*
* @return
*/
public synchronized Connection getConnection() {
if (!inUse) {
inUse = true;
return connection;
}
return null;
}


Connection _getUnderlyingConn() {
return connection;
}

public synchronized void releaseConnection() {
inUse = false;
}
}

package com.forat.db;

import java.sql.Connection;
import java.sql.DriverManager;

class ConnectionFactory {
static Connection createConnection() {
try {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/register", "root", "system");
}catch(Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex.getMessage(), ex);
}
}

static {
try {
Class.forName("com.mysql.jdbc.Driver");
}catch(Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex.getMessage(), ex);
}
}
}


package com.forat.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.forat.model.User;

/**
* This class needs extensive testing before used in real applications
* @author mohammed
*
*/
public class Manager {

private static List<PooledConnection> connectionPool = new ArrayList<PooledConnection>();

public static synchronized Connection getConnection() {
for (PooledConnection pconn : connectionPool) {
Connection conn = pconn.getConnection() ;
if (conn != null)
return conn;
}

PooledConnection pconn = new PooledConnection(ConnectionFactory.createConnection());
connectionPool.add(pconn);
return pconn.getConnection();
}

public static synchronized void closeConnection(Connection conn) {
for (PooledConnection pconn : connectionPool) {
if (pconn._getUnderlyingConn() == conn) {
pconn.releaseConnection();
return;
}
}
System.err.println("Connection " + conn + " Cannot be release!");
}

static {
for (int i=0; i < 10; i++) {
connectionPool.add(new PooledConnection(ConnectionFactory.createConnection()));
}
}

}

, ثم تعال ثانية نرجع للفئة UserDAO لنكتب الكود للداله persist:


@Override
public void persist(User o) {
Connection conn = null;
try {
conn = Manager.getConnection();
String sql = "INSERT INTO user (username, password, fullname, email) VALUES (?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, o.getUsername());
pstmt.setString(2, o.getPassword());
pstmt.setString(3, o.getFullName());
pstmt.setString(4, o.getEmail());
int result = pstmt.executeUpdate();

if (result != 1)
throw new SQLException("no row inserted!");
}catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException("Cannot add new User", ex);
}finally {
Manager.closeConnection(conn);
}
}

و بذلك يكون الكود النهائي لهذه الفئة (UserDAO) :


package com.forat.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import com.forat.db.Manager;

public class UserDAO implements DAO<User> {

@Override
public void persist(User o) {
Connection conn = null;
try {
conn = Manager.getConnection();
String sql = "INSERT INTO user (username, password, fullname, email) VALUES (?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, o.getUsername());
pstmt.setString(2, o.getPassword());
pstmt.setString(3, o.getFullName());
pstmt.setString(4, o.getEmail());
int result = pstmt.executeUpdate();

if (result != 1)
throw new SQLException("no row inserted!");
}catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException("Cannot add new User", ex);
}finally {
Manager.closeConnection(conn);
}
}
@Override
public User find(int id) {
return null;
}

@Override
public List<User> findAll() {
return null;
}

@Override
public void remove(int id) {

}

@Override
public void update(User o) {

}

public static void main(String[] args) {
User u = new User();
u.setUsername("Ahmed");
u.setPassword("system");
u.setEmail("[email protected]");
new UserDAO().persist(u);
}

}

لاحظ الدالة main , قم بتشغليها لتجرب الداله persist.

إلي الأن قمنا بعمل ال Model, ويتبقي لنا جزءئ ال View و ال Controller,

,,,

سنكمل في اللقاء القادم إن شاء الله تعالي

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

30 إجابة على هذا السؤال .

  • 0

بسم الله الرحمن الرحيم,

نكمل الدرس,

توقفت في المشاركة السابقة عند عمل جزء ال Model , لذا يتبقي لدينا جزئيين, و هما ال View و ال Controller.

لأننا كما قلنا, سوف نبني تطبيق ويب بإستخدام المعيارية (أو النمط) Model-View-Controller.

من المشاركة السابقة, يجب أن يكون لديك عدد من الفئات كما بالشكل التالي:

post-70497-12734545512063_thumb.png

كما تري بالصورة, لدينا ٦ فئات , وهي:

ConnectionFactory - Manager - PooledConnection - DAO - User - UserDAO

الأن سوف نتكمل عن جزء العرض (View), و مكونات العرض في تطبيقنا هذه سوف يكون عبارة عن ٣ صفحات, صفحة لإدخال بيانات المستخدم حال التسجيل, و صفحة تأكد عملية التسجل و صفحة لعرض الأخطاء.

(ملاحظة: في التطبيقات الحقيقيه, عادة ما يتم إظهار رسائل الخطأ و المعلومات في نفس الصفحة)

بالنسبة لصفحة التسجيل:

إفتح الصفحة التي أنشأناها من قبل و التي تسمي index.jsp (تم إنشاؤها في الخطوه رقم ١٠ في المشاركة الأولي)

تعالي علي هذه الصفحة و أدخل بها الكود التالي:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>تسجيل</title>
</head>
<body dir="rtl">
<form action="UserServlet">
<table>
<tr>
<td>إسم المستخدم</td><td><input type="text" name="usernameTxt"/> </td>
</tr>
<tr>
<td>كلمة المرور</td><td><input type="password" name="passwdTxt"/> </td>
</tr>
<tr>
<td>الإسم الكامل</td><td><input type="text" name="fullNameTxt"/> </td>
</tr>
<tr>
<td>البريد الإلكتروني</td><td><input type="text" name="emailTxt"/> </td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="تسجيل"/> </td>
</tr>

</table>
</form>
</body>
</html>

قم بعمل تشغيل للصفحة, بالضغط على المفتاحين CTRL+F11 , سيظهر لك مربع حوار بالشكل التالي:

post-70497-12734571632352_thumb.png

إختر : "Always use this server to run this project ", ثم إضغط على Next

سيظهر لك في المربع التالي قائمين, إحداهما على اليمين و الأخري على اليسار, تأكد من أن إسم مشروعك مدرج بالقائمة التي باليمين و التي مكتوب أعلاها النص Configure ثم إضغط على finish.

ستظهر لك الصفحة التي قمنا بكتابتها بالشكل التالي:

post-70497-12734574077168_thumb.png

ماذا لو لم يدخل المستخدم الحقول المطلوبه, مثل حقل إسم المستخدم أو كلمة المرور؟؟ لابد من التطبيق أن يرفض طلب المستخدم في إخال البيانات.

إذن كيف نقوم بهذا العمل؟؟

من أحد هذه الطرق هو إستخدام javasript لرفض طلب المستخد في ال client-side (جهة العميل) (ملاحظة, من الممكن أيضا, بل و من المستحسن أن نقوم بهذا الفحص على الخادم بإستخدام كود java, ولكن سأترك لك هذا كواجب تقوم بعمله :D )

إذن تعال سويا نكتب كود الجافاسكربت (أنا مبتدأ أيضا مثلك في الجافاإسكربت - و في الجافا الغير إسكربت أيضا :D ) و لكن دعنا نحاول.

و هذه هي الدالة التي سوف تقوم بالفحص علي إسم المستخدم و كلمة المرور:

<script type="text/javascript">
function checkRequiredFields(frm){
if (frm.usernameTxt.value.length == 0 || frm.passwdTxt.value.length == 0){
alert ("قم بإدخال إسم المستخدم و كلمة المرور");
return false;
}
}
</script>

(بحث صغير في جوجل, يقوم بالمهمة :D )

و بذلك, يكون الشكل النهائي ل index.jsp هو:


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript">
function checkRequiredFields(frm){
if (frm.usernameTxt.value.length == 0 || frm.passwdTxt.value.length == 0){
alert ("قم بإدخال إسم المستخدم و كلمة المرور");
return false;
}
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>تسجيل</title>
</head>
<body dir="rtl">
<form action="UserServlet" method="post" onsubmit="return checkRequiredFields(this)">
<table>
<tr>
<td>إسم المستخدم</td><td><input type="text" name="usernameTxt"/> </td>
</tr>
<tr>
<td>كلمة المرور</td><td><input type="password" name="passwdTxt"/> </td>
</tr>
<tr>
<td>الإسم الكامل</td><td><input type="text" name="fullNameTxt"/> </td>
</tr>
<tr>
<td>البريد الإلكتروني</td><td><input type="text" name="emailTxt"/> </td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="تسجيل" /> </td>
</tr>

</table>
</form>
</body>
</html>

لاحظ بداية ال from:

<form action="UserServlet" method="post" onsubmit="return checkRequiredFields(this)">

نحن نخبر المتصفح أن يستخدم الطريقة post لضخ البيانات للخادم على المسار UserServlet .

إذن نريد أن نكتب هذا المسار, أو بالأحري ال Servlet الذي سوف يقوم بمعالجة البيانات و إرسالها لل Model الذي أنشأناه بالمشاركة الأولي الذي سوف يقوم هو بدوره بتخزين البيانات في قاعدة البيانات.

جزء ال Contoller (المتحكم)

لكتابة جزء المتحكم (ال Controller ) الذي هو بالنهاية عبارة عن Servlet , قم بإتباع الخطوات التالية:

قم بالضغط على إسم المشروع من قائمة عرض المشاريع التي هي في اليسار, ثم إختر New ثم Other ثم إختر Servlet.

سيظهر لك المربع الحواري التالي:

post-70497-12734608809603_thumb.png

المهم ستجد مربع الحوار به خانه لإدخال ال "Java package": قم بإدخال : com.forat.web

ستجد خانه يطلب منك إدخال ال "Class name", أدخل UserServlet (الإسم الذي إستخدمناه في الوسم form ), ثم إضغط على finish للإنهاء.

سيظهر لك الان ال Servlet التي قمت بإنشاءه, تعالي سويا نكتب الكود له:

package com.forat.web;

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 com.forat.model.User;
import com.forat.model.UserDAO;

public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String ENCODING = "UTF-8";

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding(ENCODING);
response.setCharacterEncoding(ENCODING);

String nextView = "sucess.jsp";

try {
User u = new User();
System.out.println(request.getParameter("usernameTxt"));
u.setUsername(request.getParameter("usernameTxt"));
u.setPassword(request.getParameter("passwdTxt"));
u.setEmail(request.getParameter("fullNameTxt"));
u.setFullName(request.getParameter("emailTxt"));
new UserDAO().persist(u);
}catch (Exception ex) {
nextView = "failure.jsp?msg=" + ex.getMessage();
}

RequestDispatcher dispatcher = request.getRequestDispatcher(nextView);
dispatcher.forward(request, response);
}
}

في الكود السابق:

أولا نقرأ مدخلات المستخدم بإستخدام

request.getParameter("usernameTxt")

ثم نقوم بإستدعاء دوال ال Model لحفظ بيانات المستخدم في قاعدة البيانات

ثم نحدد الصفحة التالية التي سوف نقوم بعرضها (Next view), و هي إما sucess.jsp في حالة النجاح أو failure.jsp في حالة الفشل, لاحظ أيضا أننا في حالة الفشل سوف نرسل رسالة الفشل للصفحة failure لعرضها للمستخدم ( والتي قمنا بتحديها مسبقا في الداله persist في الفئة persist

(ملاحظه: عند طباعة رساله للمستخدم, قم بالتأكد من أن الرساله لا تحمل معلومات مهمه كإسم مستخدم قاعدة البيانات أو كلمة المرور أو إسم خادم قاعدة البيانات )

يتبقي الأن أن نصمم الصفحتان sucess.jsp و failure.jsp

بالنسبة ل sucess.jsp, إستخدم الكود التالي:


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body dir="rtl">
لقم تم التسجيل بنجاح, إضغط
<a href="index.jsp" >هنا</a>
للعوده
</body>
</html>

و إستخدم الكود التالي للصفحة failure.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body dir="rtl">
حدث الخطأ التالي عند التسجيل
<br />
${param['msg']}
<br />
إضغط
<a href="index.jsp" >هنا</a>
لإعادة المحاوله

</body>
</html>

و بهذا نكون قد أنهينا هذا الدرس,

أرجو منك دعوه لي و لأهلي و للمسلمين بظهر الغيب.

التطبيق في المرفقات.

MyWebApp.zip

تم تعديل بواسطه {هويدي}
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا هويدي ،

يتهيأ لي من مشاركاتك انك مهتم بالويب كثير ؟ ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله كل خير ، وجعله في ميزان حسناتك، ورحم أبويك والمسلمين أجمعين

مواضيعك كلها ممتازة جدا ،، ونحتاج منها الكثير :)

عندي سؤال ربما لا يخص الدرس ولكن هو بمناسبة الويب

عند بناء web site او web application

يكون لدينا اكثر من page ، وعند الانتقال من صفحة الي اخري ،، نلاحظ اجزاء ثابته في الصفحه كالـ banner وبعض اللينكات الاساسية

هنا السؤال .. هل نقوم بعمل ذلك عن طريق فصل الاجزاء الاساسية في ملفات مشتركة css, html, jsp .... etc

وفي كل صفحه نقوم بعمل include لهذه الصفحات داخل الصفحه الحالية ؟ باستخدام الـ include directive

"@ include"

ام في كل صفحه  بتحديد جميع الاجزاء يدويا ؟؟

أرجو ان يكون السؤال مفهوم :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا هويدي ،

يتهيأ لي من مشاركاتك انك مهتم بالويب كثير ؟ ...

لا, بصراحة أنا بحب الويب بس موش حابب أشتغل بيه في, الويب هو الطريق الأولي للبرمجة المؤسساتيه في الجافا (Enterprise Applications), و بصراحة أنا بحب البرمجة المؤسساتيه جدا.

مشكلة الويب, إنك سوف تضطر للعمل معا أشياء غريبه من قبيل ال CSS و التصميم شكل الصفحة , إلخ.

هل نقوم بعمل ذلك عن طريق فصل الاجزاء الاساسية في ملفات مشتركة css, html, jsp .... etc

وفي كل صفحه نقوم بعمل include لهذه الصفحات داخل الصفحه الحالية ؟ باستخدام الـ include directive

"@ include"

ام في كل صفحه بتحديد جميع الاجزاء يدويا ؟؟

أرجو ان يكون السؤال مفهوم :)

السؤال مفهوم جدا :D

هناك طريقان لعمل القوالب (templates), أولهما كما أوضحت أنت, و هو عمل ذلك عن طريق الموجه (Directive) أو الوسم include.

الطريقة الأخري و هي إستخدام apache tiles

و بصراحة, لقد إستخدمت tiles في أحد المشاريع و كان رائع جدا, و به مميزات كبيره و جاهزه (out-of-the-box).

تم تعديل بواسطه {هويدي}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله عليك :lol:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

درس اكثر من رائع

ستجدني ان شاء الله دائما في المقاعد الاولى

ارجوا في المرة القادمة وضع امثلة سهلة

سيكون فيه اسئلة بعد القراءة

تم تعديل بواسطه med reda
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي الكريم

لم تلمح الى محتوى الملف:web.xml

كما ان ناتج كومبايلينغ الفئة UserDAO يعطي الخطا التالي:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:885)

at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3421)

at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1247)

at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775)

at com.mysql.jdbc.Connection.<init>(Connection.java:1555)

at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)

at java.sql.DriverManager.getConnection(Unknown Source)

at java.sql.DriverManager.getConnection(Unknown Source)

at com.forat.db.ConnectionFactory.createConnection(ConnectionFactory.java:9)

at com.forat.db.Manager.<clinit>(Manager.java:39)

at com.forat.model.UserDAO.persist(UserDAO.java:16)

at com.forat.model.UserDAO.main(UserDAO.java:59)

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.forat.db.Manager

at com.forat.model.UserDAO.persist(UserDAO.java:31)

at com.forat.model.UserDAO.main(UserDAO.java:59)

هل معناه ان الكونكشن لم تتحقق علما انني قمت بتغيير اليوزر والباس حسب ما هو مظبوط عندي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبه لمحتوى الملف web.xml , لم أشر إليه لأننا لن نغير الكود الذي سيتولد بالمعالجات, اي أن المعالجات (Wizards) سوف تقوم بكتابة الكود المطلوب. (و هو كود ل Servlet واحد فقط).

Access denied for user 'root'@'localhost'

مايبدو انك كما ذكرت.

تأكد من أنك قادر على أن تصل للخادم بإستخدام إسم المستخدم و كلمة المرور الخاصين بك من خارج البرنامج,

من Linux shell/M$ Dos prompt أكتب :

mysql -u root -p <إضغط زر العوده>
<أكتب كلمة المرور عندما يطلبها منك>

تم تعديل بواسطه {هويدي}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكور اخ هويدي

وارجوا ان يكون الدرس القادم باستخدام قاعدة البيانات JDBC & MySQL

تم تعديل بواسطه med reda
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وارجوا ان يكون الدرس القادم باستخدام قاعدة البيانات JDBC & MySQL

:blink: ماذا إستخدمنا إذن؟؟!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اقصد مثال سهل اخي الكريم

وبارك الله مرة اخرى اخي الكريم

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وضحي أكثر الصعوبة الموجودة في الدرس

عل الأخ هويدي يستفيد من رأيك في دروس أخرى

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبه لمحتوى الملف web.xml , لم أشر إليه لأننا لن نغير الكود الذي سيتولد بالمعالجات, اي أن المعالجات (Wizards) سوف تقوم بكتابة الكود المطلوب. (و هو كود ل Servlet واحد فقط).

مايبدو انك كما ذكرت.

تأكد من أنك قادر على أن تصل للخادم بإستخدام إسم المستخدم و كلمة المرور الخاصين بك من خارج البرنامج,

من Linux shell/M$ Dos prompt أكتب :

mysql -u root -p <إضغط زر العوده>
<أكتب كلمة المرور عندما يطلبها منك>

اسف على الازعاج بالاسئلة التافهة اخي

وشكرا على الدعم

لم استطع الوصول الى قاعدة البيانات من خلال الدوس ايضا حيث:

c:\mysql -u root -p 1111

اعطتني هذه الرسالة:

'mysql' n'est pas reconnu en tant que commande interne ou externe..........

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تم اصلاح المشكلة والسبب كان في متغيرات النظام

حيث انني لم اقم باظافة مجلد MySql/bin

لكن بعد الرجوع للمشروع بقيت نفس المشكلة access denied for user [email protected]

اعتقد انه يحتاج الى اظافة الدرايفر الخاص بال Mysql

الى Eclipse.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
سوف نقوم بكتابة الكود لهذه الفئة لاحقا, ولكن دعنا أولا نقوم بكتابة الكود الذي سوف يتعامل مباشرة مع قاعدة البيانات:

بداية, قم بتحميل ال jdbc driver الخاص ب mysql من هنا

ثم ضعه في مشروعك داخل المجلد

MyWebApp/WebContent/WEB-INF/lib

ألم تقم بهذه الخطوه؟ نعم هي كافه.

ما تحتاجه هو أن تكتب كلمة المرور الصحيحة داخل الفئة ConnectionFactory :

تأكد من أن هذا السطر يحمل معلوماتك الصحيحه (كلمة المروو و إسم المستخدم)

 return DriverManager.getConnection("jdbc:mysql://localhost:3306/register", "root", "system");

تم تعديل بواسطه {هويدي}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تم اصلاح الكونكشن ايضا

بارك الله فيك اخي الكريم السبب اني كنت اقوم بادخال معطيات الاتصال في الفئة UserDao

كنت ارجوا ان يكون الدرس بسيط لكن لاباس ساقوم بتحليل الكود والعودة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ترتيب وتنظيم مميز للدرس، لدي مشروع سأبدأ فيه خلال شهر تقريباً وهو نظام ( لإدارة الموارد البشرية) بإستخدام تقنيات j2ee إن شاء الله وساضع بعض الوثائق والافكار والتلميحات المهمّة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
كنت ارجوا ان يكون الدرس بسيط لكن لاباس ساقوم بتحليل الكود والعودة

الكود الخاص ب ال Connection pool هو كود إفتكاسه مني, ربما تجده ملئ بالأخطاء :D

ترتيب وتنظيم مميز للدرس، لدي مشروع سأبدأ فيه خلال شهر تقريباً وهو نظام ( لإدارة الموارد البشرية) بإستخدام تقنيات j2ee إن شاء الله وساضع بعض الوثائق والافكار والتلميحات المهمّة.

شكرا لك يا أخي, و مرحبا بك, ننتظر إضافاتك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي الكريم الكلاس PooledConnection لا غبار عليها بالنسبة لي

لكن هل تفضلت وشرحت قليلا الكلاس Manager

بارك الله فيك

تم تعديل بواسطه med reda
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبه للفئة Manager

عند أول وصول لهذه الفئة فإن

١- يتم تنفيذ هذا السطر:

private static List<PooledConnection> connectionPool = new ArrayList<PooledConnection>();

و كما هو واضح يقوم بإنشاء List لتحتوي على كائنات من نوع pooledConnection

٢- يتم تنفيذ ال static init block :

static {
for (int i=0; i < 10; i++) {
connectionPool.add(new PooledConnection(ConnectionFactory.createConnection()));
}
}

نقوم بإضافه عدد ١٠ كائنات من نوع PooledConnection لل List التي أنشأناها في الخطوه رقم ١

٣- كل من يستخدم هذه الفئة يقوم بإستدعاء الداله التاليه للحصول على كائن من نوع java.sql.Connection لإستخدامه في الوصول لقاعدة البيانات:

public static synchronized Connection getConnection() {
for (PooledConnection pconn : connectionPool) {
Connection conn = pconn.getConnection() ;
if (conn != null)
return conn;
}

PooledConnection pconn = new PooledConnection(ConnectionFactory.createConnection());
connectionPool.add(pconn);
return pconn.getConnection();
}

فإننا في الكود السابق نبحث في كل ال List التي أنشأناها في الخطوه ١ و قمنا بملئها في الخطوه ٢, نبحث عن كائن من نوع PooledConnection غير مستخدم أي أن :

 Connection conn = pconn.getConnection() ; 
if (conn != null)

فإن وجدتنا ضالتنا, نقوم بإرجاع هذا الكائن و ننهي الداله, وإلا:


PooledConnection pconn = new PooledConnection(ConnectionFactory.createConnection());
connectionPool.add(pconn);
return pconn.getConnection();

نقوم بإنشاء كائن جديد, و نضيفه لل List و نرجعه.

٤- و نستخدم الداله التاليه لتحرير الكائن PooledConnection لكي نستخدمه مجددا إذا إحتجناه :

 public static synchronized void closeConnection(Connection conn) {
for (PooledConnection pconn : connectionPool) {
if (pconn._getUnderlyingConn() == conn) {
pconn.releaseConnection();
return;
}
}
System.err.println("Connection " + conn + " Cannot be release!");
}

فنحن نقول , هات الكائن المرسل لنا ك parameter , ثم إبحث في ال list لتجده, فإن وجدته (و يجب عليك أن تجده) فقم بإغلاقه :


if (pconn._getUnderlyingConn() == conn) {
pconn.releaseConnection();
return;
}

و إلا, فأبلغنا أن هناك خطأ ما وأن أحد الكائنات من نوع PooledConnection لم يتم إغلاقه:

System.err.println("Connection " + conn + " Cannot be release!");

هذا كل شئ يا أخي.....

تم تعديل بواسطه {هويدي}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي الكريم

اشكرك كثيرا ثانية على هذا المثال

هو صعب لكن جد مهم

بعد دراسة عميقة حإولت البحث قليلا عن مفهوم ConnectionPool

ارجوا ان تعطيني باختصار كيف هو مبدا ConnectionPool الذي استعملته هنا

و لماذا استخدمت 10instances لل PooledConnection

ارجوا ان تعذرني لاني لا اتقبل الامور ببساطة كيفما جاءت :lol: :lol:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
ارجوا ان تعطيني باختصار كيف هو مبدا ConnectionPool الذي استعملته هنا

و لماذا استخدمت 10instances لل PooledConnection

يا أخي أنا قلتلك سابقا أن هذا الكود إفتكاسيه :blush:

بالنسبة للعدد 10, فعشان أنا بحب الرقم ده (أي حاجه يعني)

إقرا عن ال Connection Pool في ويكيبديا

لو عاوز تشوف حاجه إحترافيه:

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html

تم تعديل بواسطه {هويدي}
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا اخي الكريم

المشكلة كانت في انه لم افهم كلمة افتكاسة :wink:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم أخي هويدي وجزاك الله كل خير

عندي أسئلة ابتدائية بحكم اني للتو بدأت تعلم برمجة الويب باستخدام جافا

1- ما هو الفرق بين servers المختلفة حيث انني عندما ابدأ ببناء الويب باستخدام NetBeans يبدأ بسؤالي عن نوع السيرفر هل هو Tomcat او Java system Application Server أو GlassFish v3

مش فاهمة اش الفرق وعندما أختار احدها يطالبني بتحديد مكانه على القرص الصلب وأنا لم أحمل أي منها بماذا تنصحني ؟ وهل لابد أن أضيفها لمتغيرات النظام بعد التحميل حتى لو كنت أعمل بالNetBeans

2- مالفرق بين JSF و J2EE حيث أني قرأت عن الأولى بأنها Framework تسهل عمل تطبيقات الويب بأدوات سهلة وجاهزة للاستعمال ولم أكمل القراءة بعد لان المصدر الذي اقرا منه كتاب مشفرة كل الصور فيه وغير واضحة فهل هناك مصدر جيد وبسيط للمبتدئين يشرحها على NetBeans

شكرا جزيلا واسفة على الاطالة

تم تعديل بواسطه bochra
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

1- ال tomcat هو نسخة خفيفه مخصصه لتطبيقات الويب فقط , أما الأخرون فهم خوادم لتطبيق مختلف نواحي ال Java EE.

نصيحيتي, إن لم تكوني مهتميه غير بالويب (سواء JSP/Servlet أو JSF ), ف tomcat يكفي جدا

اما إذا أردتي إستخدام كل مميزات ال Java EE من EJB, JMS و غيرها, فلابد من إستخدام Application server مثل GlassFish أو غيره (يوجد العديد منها)

2- ال JSF جزء من أجزاء ال Java EE , نصيحتي أن تتعلمي ال JSF بعيدا عن أي بيئة تطوير, أما إذا كنتي في عجلة من أمرك و تريدين كتابة تطبيق JSF بإستاخدام ال NetBeans فأعتقد أن موقع NetBeans يحتوي على الكثير من الشروح, بالمناسبة من أفضل كتب تعلم ال JSF (في رأي) هو Core JavaServer Faces

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .