Рубрики
Без рубрики

Портлет Сервлет JSP

Учебное пособие по Портлету, Сервлет Портлета, JSP Портлета, Пример Портлета, Пример Сервлета Портлета, Учебное пособие По Веб-приложению Портлета, JSP Портала Портлета.

Автор оригинала: Pankaj Kumar.

В предыдущих руководствах, которые мы рассмотрели ранее, средство записи ответов на рендеринг используется в основном для записи фрагментов портлетов на страницу портала. Этот способ формирования содержимого портлетов не используется элегантно, поскольку он также не соответствует концепции разделения интересов (SoC).

Связное объединение бизнес-кода и фрагментов пользовательского интерфейса приведет нас к коду, который трудно поддерживать, трудно отслеживать и который менее гибок. Таким образом, для вас важно провести какое-то разделение между вашими частями; пользовательским интерфейсом и бизнесом.

Портлет Сервлет JSP

Этот учебник поможет вам реализовать все эти концепции, поскольку он покажет вам полный пример того, как можно организовать взаимодействие между портлетами, JSP и сервлетами для организации регистрации сотрудников.

Регистрационная форма, которую мы собираемся внедрить, является полноценной, так как вы можете заполнить всю необходимую информацию о сотруднике, которого вы, возможно, захотите зарегистрировать. Информация, такая как идентификатор сотрудника, имя сотрудника, должность сотрудника и зарплата сотрудника, принимается портлетом, и база данных должна сохраняться.

Любое профессиональное приложение должно предоставлять конечным пользователям сообщения с подтверждением, либо процесс завершился успешно, либо что-то пошло не так.

В промежутках вы узнаете всю подробную подробную информацию, которая может помочь вам добиться интеграции между портлетами, JSP и сервлетами. Различные принципы интеграции, такие как RequestDispatcher, Библиотека тегов портлетов, обработка исключений и способ, с помощью которого можно использовать все эти принципы, чтобы все было сделано гладко.

Библиотека тегов Портлета

Страницы JavaServer могут использовать библиотеку тегов портлета для доступа к функциям портлета. Любые страницы JSP могут импортировать библиотеку тегов портлетов, которая уже предоставлена pluto-taglib зависимостью.

<<определение объектов/> , <парам/> , , и <пространство имен/> , все это теги, предоставляемые для использования страницами JavaServer.

Тег используется для определения нескольких объектов из запроса вызывающего портлета на странице JSP. Использование определит три различные переменные, которые будут использоваться в ваших сценариях JSP. Этими переменными являются portletConfig , RenderRequest и RenderResponse .

Тег используется для отправки параметров для и . Каждый параметр должен содержать пару имени и значения.

и используются для создания URL-адреса действия для вызова фазы действия и URL-адреса визуализации для вызова фазы визуализации соответственно. Оба они предоставили атрибут var, который будет использоваться позже в действии формы или цели ссылки.

<пространство имен/> используется для создания уникального имени, которое будет использоваться с кодом JavaScript для создания уникальных переменных JavaScript, библиотек или ресурсов.

Диспетчер запросов Портлетов

Аналогично сервлету, Requestdispatcher предназначен для отправки запроса на другой веб-ресурс. Однако PortletRequestDispatcher – это объект, который вы можете получить, если вы вызвали getRequestDispatcher() или getNamedDispatcher() против PortletContext объекта.

Разница здесь в том, что getRequestDispatcher() использовал путь для поиска веб-ресурса, в то время как getNamedDispatcher() использовал определенное имя для поиска веб-ресурса.

Вы можете вызвать включить и перенаправить на свой PortletRequestDispatcher . Использование forward закроет выходной поток после его вызова, в то время как метод include оставляет выходной поток открытым.

Дизайн Стола Для сотрудников

Прежде чем приступить к реализации регистрационной формы, давайте рассмотрим структуру таблицы и ее соответствующие столбцы, а также инструкцию SQL, которая приведет вас к созданию аналогичной формы в вашей базе данных.

CREATE TABLE `employee` (
  `EMP_ID` int(11) NOT NULL AUTO_INCREMENT,
  `EMP_NAME` varchar(45) DEFAULT NULL,
  `EMP_JOB` varchar(45) DEFAULT NULL,
  `EMP_SALARY` int(11) DEFAULT NULL,
  PRIMARY KEY (`EMP_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

Сотрудник ПОЖО

Как мы уже указывали в таблице сотрудников ранее, вам очень легко ожидать, что сотрудник придет.

package com.journaldev.data;

public class Employee {
	private int id;
	private String name;
	private String job;
	private int salary;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}
}

Как вы видели, Employee POJO-это обычный Java-компонент, который содержит четыре разных атрибута с их методами get и set. идентификатор, имя, должность и зарплата-это атрибуты, которые пользователь должен предоставить для обычной регистрации сотрудника.

Проектный Вид

В основном, огромное количество фреймворков, которые были реализованы, рассматривали MVC (Модель, представление и контроллер) в качестве базового дизайна для них. MVC-это шаблон проектирования, который направлен на разделение проблем, чтобы позволить разрабатывать компоненты слабо связанным образом.

Поскольку MVC-это шаблон проектирования, он применим для вас, чтобы ваши портлеты соответствовали требованиям MVC. JSP можно использовать для просмотра, портлеты в качестве контроллеров и простой POJO (обычный старый объект Java) могут быть вашими моделями.

Ниже приведена схема последовательности, которая показывает, как обрабатывается процесс регистрации и как предлагаемые части работают сообща, делая эту миссию возможной.

Вот подробное объяснение приведенной выше диаграммы:

  • Страница JSP регистрации сотрудника-это представление, которое будет использоваться для сбора информации о регистрируемом сотруднике.
  • Портлет Зарегистрировать сотрудника является контроллером, он будет использоваться для обработки бизнеса и отправки в следующий просмотр. Мы добавили сервис регистрации сотрудников в качестве дополнительного компонента, предназначенного для ведения бизнеса по регистрации сотрудников.
  • EmployeeDAO и ConnectionUtility-это всего лишь компоненты, которые содержат весь соответствующий код базы данных.

Просмотры регистрации сотрудников

Мы определили различные представления для целей регистрации сотрудников, поскольку процесс регистрации может привести к статусу успеха или неудачи, мы добавили два дополнительных представления для основного ( registerEmployee.jsp ). success.jsp и failure.jsp должны помочь пользователю получить сообщения с подтверждением, чтобы узнать, был ли процесс успешно завершен или произошел сбой, и какова причина сбоя.

Мы определили различные представления для целей регистрации сотрудников, поскольку процесс регистрации может привести к статусу успеха или неудачи, мы добавили два дополнительных представления для основного ( || registerEmployee.jsp || ). || success.jsp || и || failure.jsp || должны помочь пользователю получить сообщения с подтверждением, чтобы узнать, был ли процесс успешно завершен или произошел сбой, и какова причина сбоя.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri='https://java.sun.com/portlet' prefix='portlet'%>



Register Employee


	
	
Enter Employee ID:
Enter Employee Name:
Enter Employee Job:
Enter Employee Salary:

Вот подробное объяснение кода, перечисленного выше:

  • Форма регистрации сотрудника не содержит никакого странного кода, за исключением кода, связанного с тегом <портлет:actionURL/> . В основном URL-адрес действия используется для создания URL-адреса, который вызывал бы processaction() при нажатии на него.
  • Мы использовали сгенерированный URL-адрес действия для формирования действия всей формы. Обратите внимание на использование скриптов для доступа к сгенерированному URL-адресу.

Мы использовали сгенерированный URL-адрес действия для формирования действия всей формы. Обратите внимание на использование скриптов для доступа к сгенерированному URL-адресу.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri='https://java.sun.com/portlet' prefix='portlet'%>



Register Employee

	
		
	
	
	
		Congratulations ! you've just add a new employee
Register Another

Вот подробное объяснение кода, перечисленного выше:

  • Мы использовали для создания URL-адреса рендеринга, который используется для вызова фазы рендеринга. Был передан один параметр, его статус, который будет использоваться для целей диспетчеризации.
  • Неявные объекты, такие как запрос , ответ , которые принимаются JSP и сервлетом, могут использоваться, но с ограничением, поскольку многие из их методов либо не выполняют никаких операций, либо возвращают значение null при использовании внутри контейнера портлета.

Неявные объекты, такие как || запрос||, || ответ||, которые принимаются JSP и сервлетом, могут использоваться, но с ограничением, поскольку многие из их методов либо не выполняют никаких операций, либо возвращают значение null при использовании внутри контейнера портлета.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri='https://java.sun.com/portlet' prefix='portlet'%>



Register Employee

	
	
		
	
	
		Unfortunately ! you may not be able of registering a new employee cause the reason below
		

<%=renderRequest.getAttribute("exception")%>

Try Again

Вот подробное объяснение кода, перечисленного выше:

  • Мы использовали два разных тега портлета: и <определение объектов/> .
  • Мы никогда не сможем получить доступ к неявному запросу на визуализацию объекта, если не будем использовать тег портлета .
  • Неявные объекты, такие как запрос , ответ , которые принимаются JSP и сервлетом, могут использоваться, но с ограничением, поскольку многие из их методов либо не выполняют никаких операций, либо возвращают значение null при использовании внутри контейнера портлета.

Портлет регистрации сотрудников

Поскольку мы определили представления, необходимые для освещения всех сценариев, с которыми вы можете столкнуться при регистрации сотрудника. Пришло время определить контроллер, следуя приведенному ниже Портлету регистрации сотрудников , который поможет вам выполнить отправку в требуемые представления.

package com.journaldev.portlet;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

public class RegisterEmployeePortlet extends GenericPortlet{

	public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
		if(request.getParameter("status") == null){
			// Create a dispatcher
			PortletRequestDispatcher dispatcher =  this.getPortletContext().getRequestDispatcher("/register/registerEmployee.jsp");
			dispatcher.include(request, response);
		}
		else if(request.getParameter("status") != null &&  request.getParameter("status").equals("initiate")){
			// Create a dispatcher
			PortletRequestDispatcher dispatcher =  this.getPortletContext().getRequestDispatcher("/register/registerEmployee.jsp");
			dispatcher.include(request, response);
		}
		else if(request.getParameter("status") != null &&  request.getParameter("status").equals("success")){
			// Create a dispatcher
			PortletRequestDispatcher dispatcher =  this.getPortletContext().getRequestDispatcher("/register/success.jsp");
			dispatcher.include(request, response);
		}
		else if(request.getParameter("status") != null &&  request.getParameter("status").equals("failed")){
			// Create a dispatcher
			PortletRequestDispatcher dispatcher =  this.getPortletContext().getRequestDispatcher("/register/failure.jsp");
			request.setAttribute("exception", request.getParameter("exception"));
			dispatcher.include(request, response);
		}		

	}

	public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException{
		// Create request dispatcher
		PortletRequestDispatcher dispatcher =  this.getPortletContext().getNamedDispatcher("RegisterEmployeeServlet");
		try {
			// Include
			dispatcher.include(request, response);
			// Set render parameter
			response.setRenderParameter("status", "success");
		}
		catch(Exception ex){
			// Set render parameter
			response.setRenderParameter("status", "failed");
			response.setRenderParameter("exception", ex.getMessage());
		}

	}
}

Вот подробное объяснение кода, перечисленного выше:

  • Портлет регистрации сотрудника отменил два метода из своего родительского класса GenericPortlet .
  • Метод doView() определит, для какого представления он должен быть делегирован, на основе параметра состояния.
  • Действие process() будет обрабатывать действие регистрации так, как оно должно делегировать действие в RegisterEmployeeServlet .
  • В случае, если Register EmployeeServlet успешно завершил свою работу, параметр status success будет установлен в качестве параметра визуализации для последующего доступа к фазе визуализации.
  • В случае, если Register EmployeeServlet инициировал исключение, блок catch обработает его и установит статус сбой в качестве параметра рендеринга для последующего доступа к фазе рендеринга.
  • JSP расположены с помощью getRequestDispatcher () , в то время как сервлет расположен с помощью getNamedDispatcher() . Мы передали имя сервлета, зарегистрированного в дескрипторе развертывания, в качестве параметра.

Сервлет регистрации сотрудников

Регистрация EmployeeServlet используется для завершения процесса регистрации.

package com.journaldev.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.journaldev.dao.EmployeeDAO;
import com.journaldev.data.Employee;

public class RegisterEmployeeServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	Logger logger = Logger.getLogger(RegisterEmployeeServlet.class);

    public RegisterEmployeeServlet() {
        super();
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Create employee
		Employee employee = new Employee();
		// Fill in required data from the request sent
		employee.setId(Integer.parseInt(request.getParameter("employeeID")));
		employee.setName(request.getParameter("employeeName"));
		employee.setJob(request.getParameter("employeeJob"));
		employee.setSalary(Integer.parseInt(request.getParameter("employeeSalary")));
		try {
			// Asking employeeDAO creating the employee against registered database
			Employee createdEmployee = EmployeeDAO.getInstance().createEmployee(employee);
			// Print out the created employee information
			logger.info("Employee Created"+createdEmployee);
		} catch (Exception e) {
			// Log the exception
			logger.error("Employee Creation Failed", e);
			// Throw another exception for notifying the Portlet
			throw new ServletException(e);
		}
	}

}

Вот подробное объяснение кода, перечисленного выше:

  • Поскольку форма, в которой было инициировано действие, использовала метод POST , сервлет должен предоставить для него реализацию.
  • Объект сотрудник был создан путем извлечения его свойств из объекта запроса.
  • Он использует EmployeeDAO для создания сотрудника.
  • Он обрабатывает исключение в случае, если оно у вас есть, и создает новое для информирования портлета.

Утилита EmployeeDAO и подключения

Мы реализовали два разных одноэлементных класса для обработки операций с базой данных сотрудника и получения необходимых подключений соответственно.

package com.journaldev.dao;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.journaldev.dao.utility.ConnectionUtility;
import com.journaldev.data.Employee;

public class EmployeeDAO {

	public static EmployeeDAO employeeDAO = null;

	private EmployeeDAO(){

	}

	public static EmployeeDAO getInstance(){
		synchronized(EmployeeDAO.class){
			if(employeeDAO == null){
				employeeDAO = new EmployeeDAO();
			}

		}
		return employeeDAO;
	}

	public Employee createEmployee(Employee employee) throws SQLException, IllegalAccessException, IOException, ClassNotFoundException{
		// Get connection instance
		Connection connection = ConnectionUtility.getInstance().getConnection();
		// Create Prepared Statement
		PreparedStatement query = connection.prepareStatement("INSERT INTO EMPLOYEE VALUES (?,?,?,?)");
		// Set variables
		query.setInt(1, employee.getId());
		query.setString(2, employee.getName());
		query.setString(3, employee.getJob());
		query.setInt(4, employee.getSalary());

		try {
			// Execute
			query.execute();
			// Return employee instance
			return employee;
		}
		catch(Exception e){
			// Close statement
			query.close();
			// Close connection
			connection.close();
			// Throw another exception for notifying the Servlet
			throw new SQLException(e);
		}
	}

	public boolean deleteEmployee(Employee employee){
		return false;
	}

	public boolean updateEmployee(Employee employee, int employeeId){
		return false;
	}
}

package com.journaldev.dao.utility;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class ConnectionUtility {

	private static ConnectionUtility connectionUtiliy = null;

	private Connection connection = null;

	private ConnectionUtility() {
	}

	public static ConnectionUtility getInstance() throws IOException, IllegalAccessException, SQLException, ClassNotFoundException{
		// Synchronized against connectionUtility instance
		synchronized(ConnectionUtility.class){
			// Check whether the connectionUtility is null or not
			if(connectionUtiliy == null){
				// Create a properties instance
				Properties properties = new Properties();
				// Load properties from classpath
				properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("connection.properties"));
				// Set connection with connectionUtility
				connectionUtiliy = new ConnectionUtility();
				// Load driver class
				Class.forName("com.mysql.jdbc.Driver");
				// Create connection
				connectionUtiliy.setConnection(DriverManager.getConnection("jdbc:mysql://localhost:3306/journaldev", properties));
			}
			return connectionUtiliy;
		}
	}

	public Connection getConnection() throws ClassNotFoundException, SQLException, IOException {
		if(connection.isClosed()){
			// Create a properties instance
			Properties properties = new Properties();
			// Load properties from classpath
			properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("connection.properties"));
			// Load driver class
			Class.forName("com.mysql.jdbc.Driver");
			// Create connection
			connectionUtiliy.setConnection(DriverManager.getConnection("jdbc:mysql://localhost:3306/journaldev", properties));
		}
		return connection;
	}

	public void setConnection(Connection connection) {
		this.connection = connection;
	}

}

Важно знать, что имя пользователя и пароль базы данных считываются из файла connection.properties, определенного в ресурсах.

Дескриптор развертывания





  Employee Registration
  
  	com.journaldev.servlet.RegisterEmployeeServlet
  	RegisterEmployeeServlet
  
  
  	RegisterEmployeeServlet
  	/registerEmployeeServlet
  
  
  	https://java.sun.com/portlet
  	/WEB-INF/portlet.tld
  


Файл сборки Maven


	4.0.0
	com.journaldev
	EmployeeRegistrationApp
	war
	0.0.1-SNAPSHOT
	EmployeeRegistrationApp
	https://maven.apache.org
	
		D:/Apache Pluto/pluto-2.0.3/webapps
	
	
		
		
			org.apache.portals
			portlet-api_2.0_spec
			1.0
			provided
		
		
			javax.servlet
			servlet-api
			2.4
			provided
		
		
			javax.servlet
			jsp-api
			2.0
			provided
		
		
			commons-fileupload
			commons-fileupload
			1.3
		
		
			log4j
			log4j
			1.2.17
		
		
			org.apache.pluto
			pluto-taglib
			1.1.7
		
		
			mysql
			mysql-connector-java
			5.1.32
		

	
	
		${project.artifactId}
		
			
			
			
				org.apache.portals.pluto
				maven-pluto-plugin
				2.1.0-M3
				
					
						generate-resources
						
							assemble
						
					
				
			
			
			
			
				maven-war-plugin
				2.1.1
				
					${project.build.directory}/pluto-resources/web.xml
				
			
			
				maven-antrun-plugin
				
					
						copy
						integration-test
						
							
								
							
						
						
							run
						
					
					
						delete
						clean
						
							
								
								
							
							true
						
						
							run
						
					
				
			
			
				org.apache.maven.plugins
				maven-compiler-plugin
				3.1
				
					1.7
					1.7
				
			
		
	

Демонстрация регистрации сотрудников

Теперь пришло время выполнить только что разработанное приложение. В начале убедитесь, что вы развертываете приложение на своем портале Pluto и получаете доступ к странице JournalDev.

Как только вы получите эту страницу, убедитесь, что метод doView() был выполнен, и он проверяет переменную состояния, которая уже равна нулю. В результате метод doView() отправил запрос в файл register Employee.jsp. Просто заполните всю информацию о сотруднике.

При нажатии на кнопку Зарегистрироваться выполняется действие processAction() вашего портлета Зарегистрировать сотрудника, и RegisterEmployeeServlet будет обрабатывать весь процесс регистрации. В результате сотрудник должен быть зарегистрирован, и пользователь должен быть подтвержден об этом.

Теперь у вас есть возможность вернуться в регистрационную форму, перейдя по другой ссылке Зарегистрироваться. Эта ссылка связана с , так как она передала значение статуса. Что произойдет, если вы попытаетесь зарегистрировать одного и того же сотрудника с тем же идентификатором. В основном у вас есть исключение, относящееся к базе данных.

Резюме

Использование портлетов в отношении JSP и сервлета считается настолько привлекательным, поскольку оно содержит множество деталей, о которых вы должны знать. Мы уже сделали это от вашего имени, поскольку вы можете загрузить исходный код, чтобы узнать, как все происходит. Внесите свой вклад, прокомментировав ниже, и дайте нам знать, если у вас есть какие-либо проблемы или вопросы, на которые вы хотите получить ответы.