এ সার্ভলেট ক্লাস রাখুন package
সবার আগে, জাভাতে সার্লেট ক্লাসটি রাখুন package
। আপনার সর্বদা প্যাকেজে সর্বজনীনভাবে পুনঃব্যবহারযোগ্য জাভা ক্লাস স্থাপন করা উচিত , অন্যথায় সেগুলি প্যাকেজে থাকা ক্লাসগুলির যেমন অদৃশ্য থাকে যেমন সার্ভার নিজেই। এইভাবে আপনি সম্ভাব্য পরিবেশ-নির্দিষ্ট সমস্যাগুলি নির্মূল করবেন। প্যাকেজবিহীন সার্লেটগুলি কেবল নির্দিষ্ট টোম্যাট + জেডিকে সংমিশ্রণে কাজ করে এবং এটি কখনই নির্ভর করা উচিত নয়।
একটি "প্লেইন" আইডিই প্রকল্পের ক্ষেত্রে, বর্গ চাহিদা তার প্যাকেজ গঠন "জাভা সম্পদ" ফোল্ডারে ভিতরে স্থাপন করা এবং এইভাবে না "WebContent", ওয়েব JSP যেমন ফাইলের জন্য এই হল। নীচে নেভিগেটর দৃশ্যে দেখা যায় এমন কোনও ডিফল্ট একলাইপস ডায়নামিক ওয়েব প্রকল্পের ফোল্ডার কাঠামোর উদাহরণ রয়েছে :
EclipseProjectName
|-- src
| `-- com
| `-- example
| `-- YourServlet.java
|-- WebContent
| |-- WEB-INF
| | `-- web.xml
| `-- jsps
| `-- page.jsp
:
একটি ম্যাভেন প্রকল্পের ক্ষেত্রে, বর্গ তার প্যাকেজ গঠন ভিতরে স্থাপন করা প্রয়োজন main/java
এবং এইভাবে না যেমন main/resources
, এই অ বর্গ ফাইলের জন্য হয় । নীচে একটি ডিফল্ট মাভেন ওয়েব অ্যাপ্লিকেশন প্রকল্পের ফোল্ডার কাঠামোর উদাহরণ রয়েছে যা গ্রহগ্রহের নেভিগেটর দৃশ্যে দেখা গেছে :
MavenProjectName
|-- src
| `-- main
| |-- java
| | `-- com
| | `-- example
| | `-- YourServlet.java
| |-- resources
| `-- webapp
| |-- WEB-INF
| | `-- web.xml
| `-- jsps
| `-- page.jsp
:
নোট করুন যে /jsps
সাবফোল্ডারটি কঠোরভাবে প্রয়োজনীয় নয়। আপনি এটি ব্যতীতও করতে পারেন এবং জেএসপি ফাইলটি সরাসরি ওয়েবকন্ট / ওয়েব অ্যাপ্লিকেশন রুটে রেখে দিতে পারেন, তবে আমি আপনার প্রশ্ন থেকে কেবল এটি গ্রহণ করছি।
সার্ভলেট ইউআরএল সেট করুন url-pattern
সার্লেলেট ইউআরএল সার্ভলেট ম্যাপিংয়ের "URL প্যাটার্ন" হিসাবে নির্দিষ্ট করা হয়েছে। এটি একেবারে সংজ্ঞা অনুসারে সার্ভলেট শ্রেণীর শ্রেণীর নাম / ফাইল নাম নয়। ইউআরএল প্যাটার্নটি @WebServlet
টীকাটির মান হিসাবে নির্দিষ্ট করতে হবে ।
package com.example;
@WebServlet("/servlet")
public class YourServlet extends HttpServlet {
}
আপনি যদি পথের পরামিতিগুলির মতো সমর্থন করতে চান /servlet/foo/bar
তবে তার /servlet/*
পরিবর্তে একটি URL প্যাটার্ন ব্যবহার করুন। আরও দেখুন / Xyz / {মান} / পরীক্ষা, কিভাবে web.xml দিকে মানচিত্র-এ মত সার্ভলেট এবং পথ পরামিতি?
@WebServlet
কেবল সার্লেলেট 3.0 বা আরও নতুনতে কাজ করে
ব্যবহারের জন্য @WebServlet
, আপনি শুধুমাত্র নিশ্চিত করুন যে আপনার করতে হবে web.xml
ফাইল, যদি থাকে (এটা সার্ভলেট 3.0 থেকে ঐচ্ছিক), ঘোষিত হয় সামঞ্জস্য সার্ভলেট 3.0+ সংস্করণ এবং এইভাবে না সামঞ্জস্য যেমন 2.5 সংস্করণ বা নীচু । নীচে একটি সার্লেট ৫.০ সামঞ্জস্যপূর্ণ রয়েছে (যা টমক্যাট 9+, ওয়াইল্ডফ্লাই 11+, পেয়ারা 5+ ইত্যাদির সাথে মেলে)।
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
>
</web-app>
অথবা, আপনি এখনও সার্লেট ৩.০++ তে নেই (যেমন টমক্যাট or বা তার বেশি), তারপরে টিকাটি সরিয়ে ফেলুন @WebServlet
।
package com.example;
public class YourServlet extends HttpServlet {
}
এবং এর পরিবর্তে সার্ভলেটটি নিবন্ধ করুন web.xml
:
<servlet>
<servlet-name>yourServlet</servlet-name>
<servlet-class>com.example.YourServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>yourServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
এইভাবে নোট করুন যে আপনার উভয় উপায় ব্যবহার করা উচিত নয়। হয় টীকা ভিত্তিক কনফিগারেশন বা এক্সএমএল ভিত্তিক কনফিগারেশন ব্যবহার করুন। আপনার উভয়ই থাকে, তবে এক্সএমএল ভিত্তিক কনফিগারেশন টীকা ভিত্তিক কনফিগারেশনকে ওভাররাইড করে ide
বিল্ড / স্থাপনার যাচাই করা হচ্ছে
আপনি যদি একটি বিল্ড টুল যেমন Eclipse এবং / অথবা Maven ব্যবহার করছেন তবে আপনার অবশ্যই একেবারে নিশ্চিত করতে হবে যে কম্পাইল করা সার্লেট ক্লাস ফাইলটি /WEB-INF/classes
উত্পাদিত WAR ফাইলের ফোল্ডারে তার প্যাকেজ কাঠামোর মধ্যে রয়েছে । ক্ষেত্রে package com.example; public class YourServlet
, এটি অবশ্যই অবস্থিত থাকতে হবে /WEB-INF/classes/com/example/YourServlet.class
। অন্যথায় আপনি @WebServlet
404 ত্রুটির ক্ষেত্রে বা <servlet>
নীচের মতো এইচটিটিপি 500 ত্রুটির ক্ষেত্রেও মুখোমুখি হবেন :
এইচটিটিপি স্থিতি 500
সার্ভলেট ক্লাস কম ইনস্টল করতে ত্রুটি erv
এবং সার্ভার লগ এ সন্ধান করুন java.lang.ClassNotFoundException: com.example.YourServlet
, এর পরে একটি java.lang.NoClassDefFoundError: com.example.YourServlet
অনুসরণ করুন javax.servlet.ServletException: Error instantiating servlet class com.example.YourServlet
।
সার্লেটটি সঠিকভাবে সংকলন করে শ্রেণিপথে স্থাপন করা হয়েছে কিনা তা যাচাই করার একটি সহজ উপায় হ'ল বিল্ড সরঞ্জামটি একটি ওয়ার ফাইল তৈরি করতে দেয় (যেমন রাইটক্লিক প্রকল্প, এক্সপোর্ট> এক্সিপিসে ওয়ার ফাইল ) এবং তারপরে একটি জিপ সরঞ্জাম দিয়ে এর সামগ্রীগুলি পরীক্ষা করে। সার্ভলেট শ্রেণিটি যদি অনুপস্থিত থাকে /WEB-INF/classes
বা রফতানিতে কোনও ত্রুটির কারণ হয়ে থাকে তবে প্রকল্পটি খারাপভাবে কনফিগার করা হয়েছে বা কিছু আইডিই / প্রকল্প কনফিগারেশন ডিফল্ট ভুল করে ফিরে গেছে (উদাহরণস্বরূপ প্রকল্প> বিল্ড অটোমেটিক ইলিপসে অক্ষম করা হয়েছে)।
আপনারও নিশ্চিত করতে হবে যে প্রকল্প আইকনটিতে কোনও বিল্ড ত্রুটি নির্দেশ করে কোনও রেড ক্রস নেই। আপনি সমস্যা ভিউতে সঠিক ত্রুটিটি খুঁজে পেতে পারেন ( উইন্ডো> প্রদর্শন দেখান> অন্যান্য ... )। সাধারণত ত্রুটির বার্তাটি গুগলেবল হয়। আপনার যদি কোনও চিহ্ন না থাকে তবে স্ক্র্যাচ থেকে পুনরায় চালু করা এবং কোনও আইডিই / প্রকল্পের কনফিগারেশন ডিফল্টগুলিকে স্পর্শ করবেন না best আপনি যদি Eclipse ব্যবহার করছেন তবে আপনি আমার Eclipse প্রজেক্টে javax.servlet এপিআই কীভাবে আমদানি করবেন তার দিকনির্দেশগুলি পেতে পারেন ?
সার্ভলেট স্বতন্ত্রভাবে পরীক্ষা করা হচ্ছে
তবে শর্ত থাকে যে সার্ভারটি চালু আছে localhost:8080
এবং ওয়ারটি সফলভাবে একটি প্রসঙ্গের পথে স্থাপন করা হয়েছে /contextname
(যা আইডিই প্রকল্পের নামের সাথে ডিফল্ট হয়, কেস সেনসিটিভ!), এবং সার্লেটটি তার প্রারম্ভিককরণে ব্যর্থ হয়নি (কোনও স্থাপনার জন্য সার্ভার লগগুলি পড়ুন / সার্লেট সাফল্য / ব্যর্থ বার্তাগুলি এবং প্রকৃত প্রসঙ্গের পথ এবং সার্লেট ম্যাপিং), এর URL প্যাটার্ন সহ একটি সার্লেট /servlet
এখানে উপলব্ধ http://localhost:8080/contextname/servlet
।
অদৃশ্যভাবে পরীক্ষা করার জন্য আপনি এটি সরাসরি ব্রাউজারের ঠিকানা বারে প্রবেশ করতে পারেন। যদি doGet()
এটি যথাযথভাবে ওভাররাইড করে এবং প্রয়োগ করা হয় তবে আপনি ব্রাউজারে এর আউটপুট দেখতে পাবেন। অথবা যদি আপনার কোনও না থাকে doGet()
বা এটি ভুলভাবে কল করে super.doGet()
তবে একটি " এইচটিটিপি 405: এইচটিটিপি পদ্ধতিটি জিআরটি এই ইউআরএল দ্বারা সমর্থিত নয় " ত্রুটি দেখানো হবে (যা 405 হিসাবে এখনও 404 এর চেয়ে ভাল যা সার্ভলেট প্রমাণ করে নিজেই পাওয়া যায়)।
ওভাররাইড service()
করা একটি খারাপ অভ্যাস, যদি না আপনি কোনও এমভিসি কাঠামো পুনরায় উদ্ভাবন করেন - যা আপনি কেবল সার্লেটগুলি দিয়ে শুরু করছেন এবং বর্তমান প্রশ্নে বর্ণিত সমস্যাটি সম্পর্কে নিখুঁত হয়ে থাকলে;) ডিজাইন প্যাটার্নস ওয়েব ভিত্তিক অ্যাপ্লিকেশনগুলিও দেখুন ।
নির্বিশেষে, সার্ভলেট যদি ইতিমধ্যে 404 অদৃশ্যভাবে পরীক্ষা করে ফিরে আসে তবে তার পরিবর্তে এইচটিএমএল ফর্ম দিয়ে চেষ্টা করা সম্পূর্ণরূপে অর্থহীন। যৌক্তিকভাবে, তাই কোনও সার্লেট থেকে 404 ত্রুটি সম্পর্কে প্রশ্নে কোনও HTML ফর্ম অন্তর্ভুক্ত করা পুরোপুরি অর্থহীন।
এইচটিএমএল থেকে সার্লেট ইউআরএল উল্লেখ করা হচ্ছে
একবার আপনি যাচাই করেছেন যে স্বতন্ত্রভাবে স্বতন্ত্রভাবে আহ্বান করা হলে ঠিকঠাক কাজ করে, তারপরে আপনি এইচটিএমএল এ যেতে পারেন। এইচটিএমএল ফর্মের সাথে আপনার কংক্রিট সমস্যা হিসাবে, <form action>
মানটি একটি বৈধ URL হওয়া দরকার। একই প্রযোজ্য <a href>
। পরম / আপেক্ষিক URL গুলি কীভাবে কাজ করে তা আপনাকে বুঝতে হবে You আপনি জানেন, একটি ইউআরএল হ'ল একটি ওয়েব ঠিকানা যা আপনি ওয়েব ব্রাউজারের ঠিকানা বারে প্রবেশ / দেখতে পাচ্ছেন। আপনি যদি কোনও আপেক্ষিক ইউআরএলটিকে ফর্ম ক্রিয়া হিসাবে নির্দিষ্ট করে থাকেন, অর্থাত্ http://
স্কিম ছাড়াই , তবে এটি আপনার ওয়েব ব্রাউজারের ঠিকানা বারে দেখলে এটি বর্তমান URL এর সাথে আপেক্ষিক হয়ে ওঠে । এটি সার্ভারের ওয়ার ফোল্ডারের কাঠামোর জেএসপি / এইচটিএমএল ফাইল অবস্থানের সাথে একেবারেই আপেক্ষিক নয় যেমন অনেক স্টার্টার মনে করেন।
সুতরাং, অভিমানী যে এইচটিএমএল ফর্ম সঙ্গে JSP পৃষ্ঠা দ্বারা খোলা হয় http://localhost:8080/contextname/jsps/page.jsp
, এবং আপনি মধ্যে অবস্থিত একটি সার্ভলেট জমা দিতে প্রয়োজন http://localhost:8080/contextname/servlet
, এখানে বিভিন্ন ক্ষেত্রে (মনে রাখবেন আপনি নিরাপদে প্রতিস্থাপন করতে পারেন <form action>
সঙ্গে <a href>
এখানে):
ফর্ম অ্যাকশন একটি শীর্ষস্থানীয় স্ল্যাশ সহ একটি URL এ জমা দেয়।
<form action="/servlet">
শীর্ষস্থানীয় স্ল্যাশ /
ইউআরএলটিকে ডোমেনের সাথে তুলনামূলক করে তোলে, সুতরাং ফর্মটি জমা দেবে
http://localhost:8080/servlet
তবে এটি সম্ভবত 404 এর ফলাফল হিসাবে দেখাবে কারণ এটি ভুল প্রসঙ্গে রয়েছে।
ফর্ম অ্যাকশন একটি শীর্ষস্থানীয় স্ল্যাশ ছাড়াই কোনও URL এ জমা দেয়।
<form action="servlet">
এটি ইউআরএলটিকে বর্তমান ইউআরএলের বর্তমান ফোল্ডারের সাথে সম্পর্কিত করে তোলে, সুতরাং ফর্মটি জমা দেওয়া হবে
http://localhost:8080/contextname/jsps/servlet
তবে এটির ফলস্বরূপ এটি 404 এ আসবে কারণ এটি ভুল ফোল্ডারে রয়েছে।
ফর্ম অ্যাকশনটি একটি URL এ জমা দেয় যা একটি ফোল্ডারে যায়।
<form action="../servlet">
এটি একটি ফোল্ডার উপরে যাবে (ঠিক যেমন স্থানীয় ডিস্ক ফাইল সিস্টেমের পাথের মতো!), সুতরাং ফর্মটি জমা দেওয়া হবে
http://localhost:8080/contextname/servlet
এই এক কাজ করা আবশ্যক!
ক্যানোনিকাল পন্থাটি হ'ল ইউআরএলকে ডোমেন-রিলেটিভ করে তুলতে হয় যাতে জেএসপি ফাইলগুলি অন্য কোনও ফোল্ডারে ঘুরিয়ে দেওয়ার সময় আপনার আর একবার URL সংশোধন করার প্রয়োজন হয় না।
<form action="${pageContext.request.contextPath}/servlet">
এটি উত্পন্ন হবে
<form action="/contextname/servlet">
যা এইভাবে সর্বদা সঠিক URL এ জমা দেবে।
এইচটিএমএলে সোজা উদ্ধৃতি ব্যবহার করুন
আপনি HTML মত বৈশিষ্ট্যাবলী মধ্যে নিশ্চিত করুন যে আপনি সোজা উদ্ধৃতি চিহ্ন ব্যবহার করছেন একেবারে করতে হবে action="..."
বা action='...'
এবং এইভাবে না মত কোঁকড়া কোট action=”...”
বা action=’...’
। কোঁকড়ানো উদ্ধৃতিগুলি এইচটিএমএলে সমর্থিত নয় এবং এগুলি কেবলমাত্র মানটির অংশ হয়ে যাবে। ব্লগগুলি থেকে কপি-পেস্ট কোড স্নিপেটগুলি দেখুন! কিছু ব্লগ ইঞ্জিন, উল্লেখযোগ্যভাবে ওয়ার্ডপ্রেস, ডিফল্টরূপে তথাকথিত "স্মার্ট কোটস" ব্যবহার করে যা এইভাবে কোড স্নিপেটে এইভাবে উদ্ধৃতিগুলি দূষিত করে। অন্যদিকে, অনুলিপি-কোডিং কোডের পরিবর্তে কোডটি নিজেই টাইপ করার চেষ্টা করুন। আপনার মস্তিষ্ক এবং আঙ্গুলের মাধ্যমে কোডটি পেতে আসলে অতিরিক্ত সুবিধা হ'ল এটি আপনাকে দীর্ঘমেয়াদে কোডটি আরও ভালভাবে মনে রাখতে এবং বুঝতে এবং আপনাকে আরও উন্নত বিকাশকারী করে তুলবে।
আরো দেখুন:
HTTP স্থিতির 404 ত্রুটির অন্যান্য ক্ষেত্রে: