By GokiSoft.com|
11:13 17/08/2022|
Spring MVC
[Source Code] Hướng dẫn tạo dự án CRUD người dùng SpringMVC - C2010G
Nội dung:
- CRUD
- Cookie & Session
========================================================
Viết chương trình quản lý người
- Thêm/sửa/xoá/hiển thị danh sách
B1) Thiết kế CSDL
create database C2010G
create table user (
id int primary key auto_increment,
rollno varchar(20),
fullname varchar(50),
email varchar(150)
)
B2) Tao du an
B3) Add thu vien mysql
B4) Gen entity & data controller
#persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="C2010GPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.gokisoft.entities.User</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/c2010g"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.password" value="123456"/>
</properties>
</persistence-unit>
</persistence>
#HomeController.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.gokisoft.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* @author pt987
*/
@Controller
public class HomeController {
@RequestMapping(value = "/index")
public String index(ModelMap modelMap) {
modelMap.addAttribute("msg", "Xin Chao sjkfhsdkfhsdkfj");
return "index";
}
}
#UserController.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.gokisoft.controller;
import com.gokisoft.data.UserJpaController;
import com.gokisoft.data.exceptions.NonexistentEntityException;
import com.gokisoft.entities.User;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
*
* @author pt987
*/
@Controller
@RequestMapping(value = "/user")
public class UserController {
EntityManagerFactory factory;
UserJpaController controller;
public UserController() {
factory = Persistence.createEntityManagerFactory("C2010GPU");
controller = new UserJpaController(factory);
}
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index(ModelMap modelMap) {
List<User> userList = controller.findUserEntities();
modelMap.addAttribute("userList", userList);
return "user/index";
}
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String add() {
return "user/add";
}
@RequestMapping(value = "/confirm-add", method = RequestMethod.POST)
public String confirmAdd(@RequestParam HashMap<String, String> formData) {
String rollno = formData.get("rollno");
String fullname = formData.get("fullname");
String email = formData.get("email");
User u = new User();
u.setFullname(fullname);
u.setRollno(rollno);
u.setEmail(email);
controller.create(u);
return "redirect:index.html";
}
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String edit(ModelMap modelMap, @RequestParam HashMap<String, String> formData) {
int id = Integer.parseInt(formData.get("id"));
User u = controller.findUser(id);
modelMap.addAttribute("user", u);
return "user/edit";
}
@RequestMapping(value = "/confirm-edit", method = RequestMethod.POST)
public String confirmEdit(@RequestParam HashMap<String, String> formData) {
int id = Integer.parseInt(formData.get("id"));
User u = controller.findUser(id);
String rollno = formData.get("rollno");
String fullname = formData.get("fullname");
String email = formData.get("email");
u.setFullname(fullname);
u.setRollno(rollno);
u.setEmail(email);
try {
controller.edit(u);
} catch (Exception ex) {
Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
}
return "redirect:index.html";
}
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String delete(ModelMap modelMap, @RequestParam HashMap<String, String> formData) {
int id = Integer.parseInt(formData.get("id"));
User u = controller.findUser(id);
modelMap.addAttribute("user", u);
return "user/delete";
}
@RequestMapping(value = "/confirm-delete", method = RequestMethod.POST)
public String confirmDelete(@RequestParam HashMap<String, String> formData) {
int id = Integer.parseInt(formData.get("id"));
try {
controller.destroy(id);
} catch (NonexistentEntityException ex) {
Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
}
return "redirect:index.html";
}
}
#UserJpaController.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.gokisoft.data;
import com.gokisoft.data.exceptions.NonexistentEntityException;
import com.gokisoft.entities.User;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
/**
*
* @author pt987
*/
public class UserJpaController implements Serializable {
public UserJpaController(EntityManagerFactory emf) {
this.emf = emf;
}
private EntityManagerFactory emf = null;
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void create(User user) {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
public void edit(User user) throws NonexistentEntityException, Exception {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
user = em.merge(user);
em.getTransaction().commit();
} catch (Exception ex) {
String msg = ex.getLocalizedMessage();
if (msg == null || msg.length() == 0) {
Integer id = user.getId();
if (findUser(id) == null) {
throw new NonexistentEntityException("The user with id " + id + " no longer exists.");
}
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
public void destroy(Integer id) throws NonexistentEntityException {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
User user;
try {
user = em.getReference(User.class, id);
user.getId();
} catch (EntityNotFoundException enfe) {
throw new NonexistentEntityException("The user with id " + id + " no longer exists.", enfe);
}
em.remove(user);
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
public List<User> findUserEntities() {
return findUserEntities(true, -1, -1);
}
public List<User> findUserEntities(int maxResults, int firstResult) {
return findUserEntities(false, maxResults, firstResult);
}
private List<User> findUserEntities(boolean all, int maxResults, int firstResult) {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(User.class));
Query q = em.createQuery(cq);
if (!all) {
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
}
return q.getResultList();
} finally {
em.close();
}
}
public User findUser(Integer id) {
EntityManager em = getEntityManager();
try {
return em.find(User.class, id);
} finally {
em.close();
}
}
public int getUserCount() {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
Root<User> rt = cq.from(User.class);
cq.select(em.getCriteriaBuilder().count(rt));
Query q = em.createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
} finally {
em.close();
}
}
}
#IllegalOrphanException.java
package com.gokisoft.data.exceptions;
import java.util.ArrayList;
import java.util.List;
public class IllegalOrphanException extends Exception {
private List<String> messages;
public IllegalOrphanException(List<String> messages) {
super((messages != null && messages.size() > 0 ? messages.get(0) : null));
if (messages == null) {
this.messages = new ArrayList<String>();
}
else {
this.messages = messages;
}
}
public List<String> getMessages() {
return messages;
}
}
#NonexistentEntityException.java
package com.gokisoft.data.exceptions;
public class NonexistentEntityException extends Exception {
public NonexistentEntityException(String message, Throwable cause) {
super(message, cause);
}
public NonexistentEntityException(String message) {
super(message);
}
}
#PreexistingEntityException.java
package com.gokisoft.data.exceptions;
public class PreexistingEntityException extends Exception {
public PreexistingEntityException(String message, Throwable cause) {
super(message, cause);
}
public PreexistingEntityException(String message) {
super(message);
}
}
#User.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.gokisoft.entities;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author pt987
*/
@Entity
@Table(name = "user")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
, @NamedQuery(name = "User.findById", query = "SELECT u FROM User u WHERE u.id = :id")
, @NamedQuery(name = "User.findByRollno", query = "SELECT u FROM User u WHERE u.rollno = :rollno")
, @NamedQuery(name = "User.findByFullname", query = "SELECT u FROM User u WHERE u.fullname = :fullname")
, @NamedQuery(name = "User.findByEmail", query = "SELECT u FROM User u WHERE u.email = :email")})
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "rollno")
private String rollno;
@Column(name = "fullname")
private String fullname;
@Column(name = "email")
private String email;
public User() {
}
public User(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRollno() {
return rollno;
}
public void setRollno(String rollno) {
this.rollno = rollno;
}
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;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof User)) {
return false;
}
User other = (User) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.gokisoft.entities.User[ id=" + id + " ]";
}
}
#redirect.jsp
<%--
Views should be stored under the WEB-INF folder so that
they are not accessible except through controller process.
This JSP is here to provide a redirect to the dispatcher
servlet but should be the only JSP outside of WEB-INF.
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% response.sendRedirect("index.html"); %>
#applicationContext.xml
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc">
<context:component-scan base-package="com.gokisoft.controller"></context:component-scan>
<mvc:annotation-driven/>
<!--bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" /-->
<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->
</beans>
#dispatcher-servlet.xml
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<!--
Most controllers will use the ControllerClassNameHandlerMapping above, but
for the index controller we are using ParameterizableViewController, so we must
define an explicit mapping for it.
-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.html">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/"
p:suffix=".jsp" />
<!--
The index controller.
-->
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
</beans>
#web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 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">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>
#add.jsp
<%--
Document : add
Created on : Aug 17, 2022, 10:19:06 AM
Author : pt987
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Add new user Page</title>
</head>
<body>
<form method="post" action="confirm-add.html">
<p>
<label>Full Name: </label>
<input type="text" name="fullname" size="50"/>
</p>
<p>
<label>RollNo: </label>
<input type="text" name="rollno" size="50"/>
</p>
<p>
<label>Email: </label>
<input type="text" name="email" size="50"/>
</p>
<button>Save</button>
</form>
</body>
</html>
#delete.jsp
<%--
Document : add
Created on : Aug 17, 2022, 10:19:06 AM
Author : pt987
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Edit new user Page</title>
</head>
<body>
<form method="post" action="confirm-delete.html">
<p>
<label>Full Name: ${user.fullname}</label>
<input type="text" name="id" size="50" style="display: none;" value="${user.id}"/>
</p>
<p>
<label>RollNo: ${user.rollno}</label>
</p>
<p>
<label>Email: ${user.email}</label>
</p>
<button>Confirm Delete</button>
</form>
</body>
</html>
#edit.jsp
<%--
Document : add
Created on : Aug 17, 2022, 10:19:06 AM
Author : pt987
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Edit new user Page</title>
</head>
<body>
<form method="post" action="confirm-edit.html">
<p>
<label>Full Name: </label>
<input type="text" name="id" size="50" style="display: none;" value="${user.id}"/>
<input type="text" name="fullname" size="50" value="${user.fullname}"/>
</p>
<p>
<label>RollNo: </label>
<input type="text" name="rollno" size="50" value="${user.rollno}"/>
</p>
<p>
<label>Email: </label>
<input type="text" name="email" size="50" value="${user.email}"/>
</p>
<button>Save</button>
</form>
</body>
</html>
#index.jsp
<%--
Document : index
Created on : Aug 17, 2022, 10:00:57 AM
Author : pt987
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User List Page</title>
</head>
<body>
<h1>User List Page</h1>
<a href="add.html"><button>Add user</button></a>
<table border="1" style="width: 100%">
<thead>
<tr>
<th>No</th>
<th>Full Name</th>
<th>Roll No</th>
<th>Email</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<c:forEach items="${userList}" var="item" varStatus="loop">
<tr>
<td>${loop.index + 1}</td>
<td>${item.fullname}</td>
<td>${item.rollno}</td>
<td>${item.email}</td>
<td>
<a href="edit.html?id=${item.id}"><button>Edit</button></a>
</td>
<td>
<a href="delete.html?id=${item.id}"><button>Delete</button></a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
Tags:
Phản hồi từ học viên
5
(Dựa trên đánh giá ngày hôm nay)