Примери за JSP програма: Форма за регистрация и вход

⚡ Умно обобщение

Примерите за JSP програми тук изграждат три модула - регистрационна форма, форма за вход и излизане и страница за обработка на формуляри - всеки от които свързва JSP изглед към сървлет контролер, така че MVC разделянето да остане видимо за начинаещи.

  • 🔘 Процес на регистрация: Register_1.jsp събира шест полета и ги изпраща към сървлета guru_register, който препраща към страница за успешно попълване само когато всяко поле е попълнено.
  • ☑️ Вход и изход: Register_3.jsp изпраща идентификационни данни към guru_login; Register_4.jsp поздравява потребителя и го връща към страницата за вход, за да излезе.
  • ✅ MVC роли: JSP страниците действат като изглед, сървлетът действа като контролер, а RequestDispatcher премества заявката между тях.
  • 🧪 Обработка на формуляри: getParameter(), getParameterValues(), getParameterNames() и getInputStream() четат подадени данни вътре в JSP или сървлет.
  • 🛠️ GET срещу POST: GET добавя кодирани стойности към URL и е ограничена по дължина; POST носи стойности в тялото на заявката, което е подходящо за пароли.
  • ⚠️ Бележка към версията: Тези обяви импортират javax.servlet, така че работят на Tomcat 9 или по-стара версия; Tomcat 10 и по-нови версии изискват пакетите jakarta.servlet.

Примери за JSP програми за регистрация и вход

Тези разработени примери показват как да се разработват примерни програми с JSP и как да се имплементира MVC архитектура около тях. Изградени са три модула по ред:

  • Форма за регистрация
  • Форма за влизане и излизане
  • JSP формуляр

Как да създадете регистрационен формуляр в JSP

Във формуляр за регистрация имаме формуляр за попълване на всички данни, които включват име, потребителско име, парола, адрес, телефонен номер и др.

Този формуляр ни помага да се регистрираме в приложението. Той събира всички наши данни и ги съхранява в база данни или кеш.

В този пример ще вземем „Guru „Регистрационна форма“, която има следните полета:

  1. Име
  2. Фамилия
  3. Потребител
  4. Парола
  5. Адрес
  6. Номер за контакт

След попълване на всички тези данни имаме бутон за изпращане; при щракване върху този бутон всички данни се изпращат към сървлета.

Пример 1: Register_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Registration Form</title>
</head>
<body>
<h1>Guru Register Form</h1>
<form action="guru_register" method="post">
			<table style="with: 50%">
				<tr>
					<td>First Name</td>
					<td><input type="text" name="first_name" /></td>
				</tr>
				<tr>
					<td>Last Name</td>
					<td><input type="text" name="last_name" /></td>
				</tr>
				<tr>
					<td>UserName</td>
					<td><input type="text" name="username" /></td>
				</tr>
					<tr>
					<td>Password</td>
					<td><input type="password" name="password" /></td>
				</tr>
				<tr>
					<td>Address</td>
					<td><input type="text" name="address" /></td>
				</tr>
				<tr>
					<td>Contact No</td>
					<td><input type="text" name="contact" /></td>
				</tr></table>
			<input type="submit" value="Submit" /></form>
</body>
</html>

Обяснение на кода:

Code Ред 11: Тук вземаме формуляр, който има действие, т.е. сървлетът, към който ще бъде подадена заявката, а името на сървлета е guru_register.java. Заявката ще бъде обработена чрез POST метода.

Code Ред 14-16: Тук приемаме входния тип като текст, а името е собствено_име.

Code Ред 18-20: Тук приемаме входния тип като текст, а името е last_name.

Code Ред 22-24: Тук приемаме входния тип като текст, а името е потребителско име.

Code Ред 26-28: Тук приемаме типа на въвеждане като парола (това скрива паролата, докато се въвежда) и името като парола.

Code Ред 30-32: Тук приемаме входния тип като текст и името като адрес.

Code Ред 34-36: Тук приемаме типа на въвеждане като текст и името като контакт.

Code Ред 37: Тук вземаме бутон от тип submit, чиято стойност също е Submit. При щракване върху този бутон действието се прехвърля към съответния servlet guru_register, където всички стойности на параметрите се предават в заявката.

Забележка: атрибутът на таблицата в Code Ред 12 гласи style="with: 50%"Правилното CSS свойство е width, така че списъкът се възпроизвежда точно както е публикуван, но таблицата няма да бъде оразмерена, докато тази печатна грешка не бъде поправена във вашето собствено копие.

Пример 2: Guru_register.java

package demotest;

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;

/**
 * Servlet implementation class guru_register
 */
public class guru_register extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String first_name = request.getParameter("first_name");
		String last_name = request.getParameter("last_name");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String address = request.getParameter("address");
		String contact = request.getParameter("contact");
		
		if(first_name.isEmpty() || last_name.isEmpty() || username.isEmpty() || 
				password.isEmpty() || address.isEmpty() || contact.isEmpty())
		{
			RequestDispatcher req = request.getRequestDispatcher("register_1.jsp");
			req.include(request, response);
		}
		else
		{
			RequestDispatcher req = request.getRequestDispatcher("register_2.jsp");
			req.forward(request, response);
		}
	}

}

Обяснение на кода:

Code Ред 14: Тук дефинираме сървлета guru_register, който разширява HttpServlet.

Code Ред 18: Това е методът doPost(), който се извиква, когато укажем POST като атрибут на метода във формата JSP по-горе.

Code Ред 20-25: Тук извличаме стойностите от заявката, т.е. собствено_име, фамилия, потребителско_име, парола, адрес и контакт, използвайки request.getParameter.

Code Ред 27-32: Тук използваме условие if, при което проверяваме дали някой от параметрите, извлечени от заявката, е празен. Ако някой параметър е празен, контролът въвежда това условие ( first_name.isEmpty() || last_name.isEmpty() || username.isEmpty() || password.isEmpty() || address.isEmpty() || contact.isEmpty()) и ние извличаме обект RequestDispatcher от обекта request, който изпраща заявката обратно към register_1.jsp. Тук включваме и обектите request и response.

Code Ред 33-37: Този клон се изпълнява, когато никой от параметрите не е празен. Извличаме обект RequestDispatcher от обекта request, който препраща заявката към register_2.jsp. Тук препращаме обектите request и response.

Разликата между двата клона е важна: include() изпълнява register_1.jsp и връща контрола на сървлета, докато forward() предава заявката към register_2.jsp и не се връща.

Пример 3: Register_2.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Success Page</title>
</head>
<body>
           <a><b>Welcome User!!!!</b></a>
</body>
</html>

Обяснение на кода:

Code Ред 10: Тук показваме приветственото съобщение. Този JSP се извиква, когато всички параметри са попълнени.

Когато изпълните горния код, получавате следния изход.

Изход:

Страницата за регистрация показва шестте обозначени полета с един бутон „Изпращане“, както е показано по-долу.

Guru Регистрационен формуляр в JSP с полета за име, фамилия, потребителско име, парола, адрес и контакт

След като всяко поле е попълнено и е щракнато върху „Изпрати“, guru_register препраща към register_2.jsp и се появява страницата за успех.

Страница за успех на Register_2.jsp, показваща съобщението „Добре дошъл потребител“ след регистрацията

Когато кликнем върху register_1.jsp, получаваме формуляр с име, фамилия, потребителско име, парола, адрес и контакт. След като всички данни са попълнени и бутонът за изпращане е кликнат, получаваме съобщението „Добре дошъл, потребителю“.

Как да създадете формуляр за вход и излизане в JSP

Подобно на регистрационната форма, сега ще изградим форма за вход и излизане.

В този пример сме взели формуляр за вход с две полета, „потребителско име“ и „парола“, и бутон за изпращане.

Когато кликнем върху бутона за изпращане, получаваме приветствено съобщение с бутон за излизане.

Когато кликнем върху бутона за излизане, се връщаме към формата за вход.

Пример 1: Register_3.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Login Form</title>
</head>
<body>
<form action="guru_login" method="post">
		<table style="with: 50%">

			<tr>
				<td>UserName</td>
				<td><input type="text" name="username" /></td>
			</tr>
				<tr>
				<td>Password</td>
				<td><input type="password" name="password" /></td>
			</tr>
		</table>
		<input type="submit" value="Login" /></form>
</body>
</html>

Обяснение на кода:

Code Ред 10: Тук вземаме формуляр, чието действие е сървлетът guru_login.java. Методът, чрез който се предават данните, е POST.

Code Ред 13-16: Тук приемаме поле за въвеждане „потребителско име“, което е от типа текст.

Code Ред 17-20: Тук приемаме поле за въвеждане „парола“, което е от типа password.

Code Ред 22: Тук вземаме бутон „изпращане“ със стойност „Вход“. При щракване върху него, контролът преминава към сървлета guru_login, където и двете полета се прочитат с помощта на обекта request.

Пример 2: Guru_login.java (сервлет)

package demotest;

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;

/**
 * Servlet implementation class guru_login
 */
public class guru_login extends HttpServlet {

    public guru_login() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		if(username.isEmpty() || password.isEmpty() )
		{
			RequestDispatcher req = request.getRequestDispatcher("register_3.jsp");
			req.include(request, response);
		}
		else
		{
			RequestDispatcher req = request.getRequestDispatcher("register_4.jsp");
			req.forward(request, response);
		}
	}

}

Обяснение на кода:

Code Ред 5-9: Тук импортираме необходимите класове в кода.

Code Ред 14: Тук декларираме сървлета guru_login, който разширява HttpServlet.

Code Ред 21: Тук използваме метода doPost(), защото формулярът използва метода POST.

Code Ред 23-24: Тук четем параметри, използвайки обекта на заявката, т.е. потребителско име и парола.

Code Ред 25-29: По този начин използваме условие „if“, което проверява дали потребителското име и паролата са празни. Ако някое от тях е празно, получаваме обект RequestDispatcher, който изпраща контрол обратно към register_3.jsp с обектите request и response.

Code Ред 30-34: Този клон се изпълнява, ако и двата не са празни; след това препраща заявката към register_4.jsp с обектите request и response.

Пример 3: Register_4.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Logged In</title>
</head>
<body>
	<table style="with: 50%">
	<tr><td>
	<% String username = request.getParameter("username"); %>
<a>Welcome   <% out.println(username); %> User!!!! You have logged in.</a></td></tr>
<tr></tr><tr><td></td><td></td><td><a href="register_3.jsp"><b>Logout</b></a></td></tr>
</table>
</body>
</html>

Обяснение на кода:

Code Ред 12: Тук получаваме параметъра „потребителско_име“ от обекта на заявката в обекта String username. Това работи, защото forward() запазва оригиналната заявка и следователно нейните параметри непокътнати.

Code Ред 13: Тук имаме приветствено съобщение с потребителското име.

Code Ред 14: Тук имаме линка за излизане, който връща потребителя обратно към register_3.jsp.

Когато изпълните горния код, получавате следния изход.

Изход:

Отварянето на register_3.jsp показва двете полета за идентификационни данни и бутон за вход.

Guru Формуляр за вход в JSP, показващ полета за потребителско име и парола с бутон за вход

След като щракнете върху бутона „Вход“, ще получите съобщението по-долу, заедно с линк за излизане.

Начален екран на Register_4.jsp, поздравяващ влезлия потребител с линк за излизане

Щракването върху връзката „Изход“ ви връща към страницата за вход, показана тук.

Страницата за вход се показва отново в браузъра, след като потребителят кликне върху „Изход“.

Забележка: Този пример сравнява само празни стойности, така че всяко потребителско име, което не е празно, се приема. Входът в производствения режим трябва да проверява идентификационните данни спрямо хранилище и да съхранява паролите хеширани, никога в обикновен текст.

Обработка на JSP формуляр с помощта на getParameter()

Формулярите са често срещан метод за събиране на входни данни при уеб обработка. Трябва да изпратим информация до уеб сървъра и след това да прочетем тази информация обратно от страната на сървъра.

Има два често използвани метода за изпращане и връщане на информация към уеб сървъра.

Метод GET:

  • Това е методът по подразбиране за предаване на информация от браузър към уеб сървър.
  • Изпраща кодираната информация, добавена към страницата URL, разделени със символ ?.
  • Също така има ограничение за размер; класическото ръководство е приблизително 1024 знака на заявка, въпреки че реалният таван се определя от браузъра и сървъра, а не от HTTP спецификацията.
  • Трябва да избягваме изпращането на пароли и чувствителна информация чрез метода GET.

Метод POST:

  • POST е по-надеждният метод за изпращане на информация до сървъра.
  • Изпраща информацията като отделно тяло на съобщението, а не в адресната лента.
  • Тъй като стойностите никога не се появяват след ? в URL, те не се съхраняват в историята на браузъра или в регистрационните файлове за достъп до сървъра.
  • Обикновено се използва за изпращане на чувствителна информация.

JSP обработва данни от формуляри, използвайки следните методи:

  1. getParameter(): използва се за получаване на стойността на един параметър на формуляр.
  2. getParameterValues(): използва се за връщане на множество стойности на параметър.
  3. getParameterNames(): използва се за получаване на имената на всички параметри.
  4. getInputStream(): използва се за четене на двоичните данни, изпратени от клиента.

Пример:

В този пример сме взели формуляр с две полета, „потребителско име“ и „парола“, и бутон за изпращане.

Action_form.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

<!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=ISO-8859-1">
<title>Guru Form</title>
</head>
<body>
<form action="action_form_process.jsp" method="GET">
UserName: <input type="text" name="username">
<br />
Password: <input type="text" name="password" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

Action_form_process.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<h1>Form Processing</h1>

<p><b>Welcome User:</b>
   <%= request.getParameter("username")%>
</p>

</body>
</html>

Обяснение на кода: Action_form.jsp

Code Ред 10: Тук сме дефинирали форма, чието действие се обработва от друга JSPВ атрибута action добавяме JSP-то, към което формулярът трябва да бъде изпратен чрез GET метода.

Тук използваме метода GET, за да предадем информацията, т.е. потребителско име и парола.

Code Ред 11-14: Тук приемаме полета като потребителско име и парола, които са текстови полета, и получаваме входните данни от потребителя.

Този вход може да бъде извлечен с помощта на метода getParameter. Също така имаме бутон за изпращане, който предава стойностите на полетата в action_form_process.jsp.

Action_form_process.jsp

Code Ред 14: Тук получаваме стойностите на входните полета от action_form.jsp, използвайки метода getParameter на обекта на заявката.

Когато изпълним горния код, получаваме следния изход.

Изход:

Action_form.jsp първо рендира формата с две полета, показана по-долу.

Action_form.jsp, рендиращ текстовите полета „Потребителско име“ и „Парола“ с бутон „Изпращане“

След изпращане, action_form_process.jsp повтаря прочетеното потребителско име с getParameter().

Изходна страница Action_form_process.jsp, показваща заглавието „Обработка на формуляр“ и приветственото съобщение

Когато изпълним action_form.jsp, получаваме формуляр с две полета, потребителско име и парола, и бутон за изпращане. След въвеждане на потребителско име и парола, кликваме върху „изпращане“ и заявката се обработва от следващата страница, която връща страницата за обработка на формуляри с приветствено съобщение.

Бележка към версията: И двата сервлета по-горе импортират javax.servlet, което е правилно за Tomcat 9 и по-стари версии. Jakarta EE 9 преименува API, така че на Tomcat 10 или по-нова версия всеки импорт на javax.servlet става jakarta.servlet или приложението трябва да бъде конвертирано с инструмента за миграция на Apache Tomcat за Jakarta EE.

Въпроси и Отговори

Списъците са насочени към Tomcat 9 и по-стари версии, където API се намира в javax.servlet. Jakarta EE 9 преименува пространството от имена, така че Tomcat 10 и по-нови версии се нуждаят от импортиране на jakarta.servlet и прекомпилиране или изпълнение чрез инструмента за миграция на Tomcat.

Никога не го съхранявайте като обикновен текст. Хеширайте го с бавен, солев алгоритъм, като BCrypt или Argon2, преди да достигне базата данни, и сравнявайте хешовете при влизане в системата. Примерният сървлет проверява само за празни стойности, така че хеширането трябва да се добави.

include() изпълнява целевия ресурс и връща контрола на извикващия сървлет, така че се появяват и двата изхода. forward() предава цялата заявка на целта и никога не се връща, така че сървлетът не трябва да е изпратил отговора първо.

JSP страниците са изгледът (view), сървлетът е контролерът, който чете параметри и решава къде да отиде, а база данни или bean слой биха предоставили модела. RequestDispatcher е връзката между контролера и изгледа (view).

Асистентите с изкуствен интелект могат да създават клонове за валидиране, да откриват липсващи нулеви проверки в getParameter(), да предлагат библиотеки за хеширане и да обясняват стека traces. Третирайте всяко предложение като чернова: проверете версията на API на сървлета и тествайте генерирания код преди изпращане.ping него.

Copilot е добър в повтарящи се шаблонни задачи, като например doPost stubs, четене на параметри и извиквания на диспечера. Често по подразбиране използва по-стари импортирани javax.servlet файлове, така че проверете пространството от имена, логиката за валидиране и esca.ping на всеки потребителски вход, който генерира.

Добавете JDBC слой в сървлета: отворете обединена връзка, използвайте PreparedStatement за вмъкване или търсене на идентификационни данни и затворете ресурсите в finally блок. Дръжте SQL кода извън JSP, така че изгледът да остане само презентационен.

Защото guru_login проверява само дали полетата са празни. Празно потребителско име или парола включва отново страницата за вход, вместо да пренасочва, което действа като много проста защита от валидиране, а не като истинско удостоверяване.

Обобщете тази публикация с: