Всем привет! В этой статье я расскажу о том, как связать JSP с Hibernate при помощи сервлета. Я надеюсь, что вы умеете работать с Hibernate, если же нет, то настоятельно рекомендую прочитать эту статью. Также я надеюсь, что вы знакомы с сервлетами и хоть раз их успешно запускали.
Для того, чтобы у вас была такая же база данных в MySQL, вставьте туда следующий код:
Создаём maven проект и вставляем следующие зависимости и не только:
Подключаемся к базе данных. Опять же: если вы не знаете, как это делается, то статья об этом и не только выше.
Затем подключаем web модуль.
Заходим в File,Project Structure вкладка modules. Передварительно удалите всё, что есть во вкладке modules(если оно там есть) нажав на -(красненький).Нажимаете на +(зелёный)
и добавьте web модуль:
Дальше во вкладке Artifacts тоже удаляете все артефакты и добавляете новый +,Web Application:Exploded,From modules,OK:
Дальше развертываем Hibernate и для того, чтобы было удобно, засуньте эту модель в папку model, которая находится в by, указав в этот путь при развертке Hibernate.
В папке by создайте папку util, а в ней класс HibernateUtil:
Благодаря HibernateUtil мы можем создать специальный SessionFactory под наш проект.
В папке by создаём папку DAO, в ней класс DAOImple (мы не создаём интерфейс DAO, так как пример небольшой):
Класс DAOImple нам нужен для того, чтобы работать с той информацией, что есть в базе данных.
В папке by создаём папку servlets, а в ней создаём сервлет (не класс!) SaveServlet (комментарии в коде):
Регестрируем сервлет в web.xml:
В папке web создаём index.jsp стартовую страницу:
а также list.jsp:
и update.jsp:
Дальше настраиваем TomCat:
Даём ему артефакт(можно просто нажать внизу на кнопку с красной лампочкой и названием Fix):
Я надеюсь, что вам удалось запустить этот пример. Этот пример на github:здесь.
Удачи!
Для того, чтобы у вас была такая же база данных в MySQL, вставьте туда следующий код:
CREATE SCHEMA `hero` ;
CREATE TABLE `hero`.`heroes`
(
`idhero` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idhero`));
Создаём maven проект и вставляем следующие зависимости и не только:
<packaging>war</packaging>
<properties>
<hibernate.version>4.3.5.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<!— https://mvnrepository.com/artifact/org.apache.commons.. —>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
Подключаемся к базе данных. Опять же: если вы не знаете, как это делается, то статья об этом и не только выше.
Затем подключаем web модуль.
Заходим в File,Project Structure вкладка modules. Передварительно удалите всё, что есть во вкладке modules(если оно там есть) нажав на -(красненький).Нажимаете на +(зелёный)
и добавьте web модуль:
Дальше во вкладке Artifacts тоже удаляете все артефакты и добавляете новый +,Web Application:Exploded,From modules,OK:
Дальше развертываем Hibernate и для того, чтобы было удобно, засуньте эту модель в папку model, которая находится в by, указав в этот путь при развертке Hibernate.
В папке by создайте папку util, а в ней класс HibernateUtil:
package by.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory=buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try{
return new Configuration().configure().buildSessionFactory();
}catch (Exception e){
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Благодаря HibernateUtil мы можем создать специальный SessionFactory под наш проект.
В папке by создаём папку DAO, в ней класс DAOImple (мы не создаём интерфейс DAO, так как пример небольшой):
package by.DAO;
import by.model.HeroesEntity;
import by.util.HibernateUtil;
import org.hibernate.Query;
import org.hibernate.Session;
import java.util.List;
public class DAOImple {
public void saveHero(HeroesEntity heroesEntity){
Session session= HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.save(heroesEntity);
session.getTransaction().commit();
session.close();
}
public List<HeroesEntity> getAll(){
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
List<HeroesEntity> list=session.createQuery("from HeroesEntity").list();
session.getTransaction().commit();
session.close();
return list;
}
public void update(HeroesEntity heroesEntity){
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.update(heroesEntity);
session.getTransaction().commit();
session.close();
}
public HeroesEntity getHeroById(int id){
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Query query= session.createQuery("from HeroesEntity where idhero=:id");
query.setInteger("id",id);
HeroesEntity heroesEntity= (HeroesEntity) query.uniqueResult();
session.getTransaction().commit();
session.close();
return heroesEntity;
}
public void deleteHeroes(int id){
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Query query=session.createQuery("from HeroesEntity where idhero=:id");
query.setInteger("id",id);
HeroesEntity heroesEntity= (HeroesEntity) query.uniqueResult();
session.delete(heroesEntity);
session.getTransaction().commit();
session.close();
}
}
Класс DAOImple нам нужен для того, чтобы работать с той информацией, что есть в базе данных.
В папке by создаём папку servlets, а в ней создаём сервлет (не класс!) SaveServlet (комментарии в коде):
package by.servlets;
import by.DAO.DAOImple;
import by.model.HeroesEntity;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SaveServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
DAOImple daoImple=new DAOImple();
////////////////////////////////////////
//INDEX.JSP
////////////////////////////////////////
if(request.getParameter("add")!=null){//при нажатии на кнопку add
HeroesEntity heroesEntity=new HeroesEntity();//создаём экземпляр класса модели базы данных
heroesEntity.setIdhero(Integer.parseInt(request.getParameter("id")));//задаём ему id взятый из поля c именем id
heroesEntity.setName(request.getParameter("name"));//аналогично с прошлой строкой
daoImple.saveHero(heroesEntity);//сохраняем в базу данных полученный объект
request.setAttribute("list",daoImple.getAll());//создаём аттрибут который взял в себя всё что есть в базе данных
RequestDispatcher requestDispatcher=request.getRequestDispatcher("list.jsp");//перебрасываемся на list.jsp
requestDispatcher.forward(request,response);
}
if(request.getParameter("showAll")!=null){//при нажатии на кнопку showALL
request.setAttribute("list",daoImple.getAll());//создаём аттрибут который взял в себя всё что есть в базе данных
RequestDispatcher requestDispatcher=request.getRequestDispatcher("list.jsp");//перебрасываемся на list.jsp
requestDispatcher.forward(request,response);
}
///////////////////////////////////////////////////
//LIST.JSP
///////////////////////////////////////////////////
String action=request.getParameter("action");//создаём action который будет реагировать на те или иные действия
if(action.equalsIgnoreCase("update")){//если action отреагировал на update
request.setAttribute("hero",daoImple.getHeroById(Integer.parseInt(request.getParameter("idhero"))));//создаём атрибут который по id возвращает определённого HeroesEntity
RequestDispatcher requestDispatcher=request.getRequestDispatcher("update.jsp");////перебрасываемся на update.jsp
requestDispatcher.forward(request,response);
}
if(action.equalsIgnoreCase("delete")){//если action отреагировал на update
daoImple.deleteHeroes(Integer.parseInt(request.getParameter("idhero")));//удаляем по id
request.setAttribute("list",daoImple.getAll());//создаём аттрибут который взял в себя всё что есть в базе данных
RequestDispatcher requestDispatcher=request.getRequestDispatcher("list.jsp");//перебрасываемся на list.jsp
requestDispatcher.forward(request,response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
DAOImple daoImple = new DAOImple();
//////////////////////////////////
// UPDATE.JSP
//////////////////////////////////
if (request.getParameter("update") != null) {//при нажатии на кнопку update
HeroesEntity heroesEntity = new HeroesEntity();//создаём экземпляр класса
heroesEntity.setIdhero(Integer.parseInt(request.getParameter("idhero")));//задаём id из поля idhero
heroesEntity.setName(request.getParameter("name"));//задаём name из поля name
daoImple.update(heroesEntity);//апдейтим
request.setAttribute("list", daoImple.getAll());//создаём аттрибут который взял в себя всё что есть в базе данных
RequestDispatcher requestDispatcher = request.getRequestDispatcher("list.jsp");//перебрасываемся на list.jsp
requestDispatcher.forward(request, response);
}
}
}
Регестрируем сервлет в web.xml:
<?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_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>SaveServlet</servlet-name>
<servlet-class>by.servlets.SaveServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SaveServlet</servlet-name>
<url-pattern>/save</url-pattern>
</servlet-mapping>
</web-app>
В папке web создаём index.jsp стартовую страницу:
<%--
Created by IntelliJ IDEA.
User: УВД
Date: 29.05.2017
Time: 18:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="get" action="/save">
<input type="text" name="id">
<input type="text" name="name">
<input type="submit" name="add" value="add">
<input type="submit" name="showAll" value="showAll">
</form>
</body>
</html>
а также list.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>id</td>
<td>name</td>
</tr>
<c:forEach items="${list}" var="list">
<tr>
<th>${list.idhero}</th>
<th>${list.name}</th>
<th><a href="/save?action=update&idhero=<c:out value="${list.idhero}"/>">update</a> </th>
<th><a href="/save?action=delete&idhero=${list.idhero}">delete</a> </th>
</tr>
</c:forEach>
</table>
</body>
</html>
и update.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="/save">
<input type="text" name="idhero" readonly="readonly" value="<c:out value="${hero.idhero}"/>">
<input type="text" name="name" value="<c:out value="${hero.name}"/>">
<input type="submit" value="ok" name="update">
</form>
</body>
</html>
Дальше настраиваем TomCat:
Даём ему артефакт(можно просто нажать внизу на кнопку с красной лампочкой и названием Fix):
Я надеюсь, что вам удалось запустить этот пример. Этот пример на github:здесь.
Удачи!