完整的Web應用程序Tomcat JSF Primefaces JPA Hibernate –第1部分

我們創建了這篇文章,將展示如何使用以下工具創建完整的Web應用程序:Tomcat7,帶有Primefaces的JSF2(Facelets和Libraries)(具有AutoComplete),JPA / Hibernate(具有NxN關系),使用Filter登錄。要查看具有JSF + EJB + JPA + JBoss 7的完整Web應用程序, 請單擊此處 。

要運行此文章的代碼,您將需要以下制品(在此文章最后一頁中將找到所有jar文件):

  • 日食靛藍
  • 雄貓7
  • 莫哈拉
  • 素面
  • 冬眠
  • 驅動程序Postgres

您可以使用所需的任何數據庫,您將需要數據庫的特定驅動程序并在persistence.xml上編輯URL連接。

在本文的結尾,您將找到帶有所有需要下載的庫的源代碼。

您將在今天的帖子中看到以下內容:

  • 模型的實體類。 關系NxN(@ManyToMany),具有JoinFetch,Enum作為屬性的NamedQueries。
  • 通用DAO,應用程序事務方法,用于填充查詢參數的通用方法。
  • 使用findReferenceOn方法對事務進行外觀處理,請注意使用entityManager.merge()方法。
  • 篩選器。
  • ManagedBeans。 如何在另一個ManagedBean中注入一個ManagedBean,有關@ViewScoped的觀察。
  • JSFMessageUtil。
  • 配置文件:log4j.properties,messages.properties。
  • xhtml頁面,Facelets。
  • Primefaces AutoComplete,帶有“ forClass”的JSF轉換器。
  • 在JSF中使用CSS / javascript / images的最簡單方法。
  • “ web.xml”配置。
  • 增強應用程序的安全性。
  • 運行應用程序。

您將在此處找到的應用程序具有Dog and Person CRUD(創建,讀取,更新和刪除); 只有管??理員才能訪問Dog CRUD。 在運行此應用程序之前,您應該創建一個名為“ JSFCrudDB”的數據庫

模型類

以下類是模型類,它們應位于“ com.model”包中:

package com.model;public enum Role {ADMIN, USER;
}
package com.model;import java.io.Serializable;import javax.persistence.*;@Entity
@Table(name = 'USERS')
@NamedQuery(name = 'User.findUserByEmail', query = 'select u from User u where u.email = :email')
public class User implements Serializable {private static final long serialVersionUID = 1L;public static final String FIND_BY_EMAIL = 'User.findUserByEmail';@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;@Column(unique = true)private String email;private String password;private String name;@Enumerated(EnumType.STRING)private Role role;// get and setpublic boolean isAdmin() {return Role.ADMIN.equals(role);}public boolean isUser() {return Role.USER.equals(role);}@Overridepublic int hashCode() {return getId();}@Overridepublic boolean equals(Object obj) {if (obj instanceof User) {User user = (User) obj;return user.getId() == id;}return false;}
}
package com.model;import java.io.Serializable;
import java.util.List;import javax.persistence.*;@Entity
@NamedQuery(name = 'Person.findUserByIdWithDogs', query = 'select p from Person p left join fetch p.dogs where p.id = :personId')
public class Person implements Serializable {private static final long serialVersionUID = 1L;public static final String FIND_USER_BY_ID_WITH_DOGS = 'Person.findUserByIdWithDogs';@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;private int age;private String name;@ManyToManyprivate List<Dog> dogs;// get and set@Overridepublic int hashCode() {return id;}@Overridepublic boolean equals(Object obj) {if (obj instanceof Person) {Person person = (Person) obj;return person.getId() == id;}return false;}
}
package com.model;import java.io.Serializable;
import java.util.List;import javax.persistence.*;@Entity
public class Dog implements Serializable{private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;private int age;private String name;@ManyToMany(mappedBy='dogs')private List<Person> persons;// get and set@Overridepublic int hashCode() {return id;}@Overridepublic boolean equals(Object obj) {if (obj instanceof Dog) {Dog dog = (Dog) obj;return dog.getId() == id;}return false;}@Overridepublic String toString() {return name;}
}

關于上面的代碼:

  • Person類具有名為“ Person.findUserByIdWithDogs”的查詢。 該查詢將熱切加載Person類的Dog列表。 如果我們嘗試在沒有事務的情況下訪問Dog列表,并且此查詢將發生LazyInitializationException。 解決這種情況的其他方法是使用OpenSessionInView模式。 此模式可能會產生N + 1個查詢效果。 如果您想了解更多有關此異常的信息,請單擊此處。
  • 使用JPA / Hibernate映射枚舉非常容易。 如您所見,有一個帶有@Enumerated批注的選項,它將數據庫表字段設置為String。 如果您想了解有關此注釋的更多信息,并了解如何將枚舉映射為ORDINAL,請單擊此處 。
  • 始終重寫equals / hashCode方法。 這些方法通常由幾個框架調用。 通過實施這些方法,解決了許多Primefaces“錯誤”。

您將需要在“ src / META-INF”文件夾中創建“ persistence.xml”文件:

<?xml version='1.0' encoding='UTF-8'?><persistence version='2.0'xmlns='http://java.sun.com/xml/ns/persistence' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd'><persistence-unit name='JSFCrudPU' transaction-type='RESOURCE_LOCAL'><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><property name='javax.persistence.jdbc.driver' value='org.postgresql.Driver' /><property name='javax.persistence.jdbc.url' value='jdbc:postgresql://localhost:5432/JSFCrudDB' /><property name='javax.persistence.jdbc.user' value='postgres' /><property name='javax.persistence.jdbc.password' value='postgres' /><property name='hibernate.dialect' value='org.hibernate.dialect.PostgreSQLDialect' /><property name='hibernate.connection.shutdown' value='true' /><property name='hibernate.hbm2ddl.auto' value='update' /><property name='hibernate.show_sql' value='false' /><property name='hibernate.format_sql' value='false'/></properties></persistence-unit>
</persistence>

關于上面的代碼:

  • 值為“ update”的“ hibernate.hbm2ddl.auto”屬性指示JPA在必要時根據模型類更新數據庫。 將此選項保留為“ update ”或任何其他可能會更新生產/客戶數據庫的值不是一個好習慣。 在生產環境中使用“ validate ”選項并手動創建和執行sql腳本始終是一件好事。
  • hibernate.show_sql和hibernate.format_sql屬性用于在控制臺中顯示查詢。 在文件log4j.properties(第08頁)中,有一個選項將允許顯示查詢參數值。

在“ com.dao”包中,您將需要創建以下類:

package com.dao;import java.io.Serializable;
import java.util.*;
import java.util.Map.*;import javax.persistence.*;
import javax.persistence.criteria.CriteriaQuery;abstract class GenericDAO<T> implements Serializable {private static final long serialVersionUID = 1L;private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory('JSFCrudPU');private EntityManager em;private Class<T> entityClass;public void beginTransaction() {em = emf.createEntityManager();em.getTransaction().begin();}public void commit() {em.getTransaction().commit();}public void rollback() {em.getTransaction().rollback();}public void closeTransaction() {em.close();}public void commitAndCloseTransaction() {commit();closeTransaction();}public void flush() {em.flush();}public void joinTransaction() {em = emf.createEntityManager();em.joinTransaction();}public GenericDAO(Class<T> entityClass) {this.entityClass = entityClass;}public void save(T entity) {em.persist(entity);}public void delete(T entity) {T entityToBeRemoved = em.merge(entity);em.remove(entityToBeRemoved);}public T update(T entity) {return em.merge(entity);}public T find(int entityID) {return em.find(entityClass, entityID);}public T findReferenceOnly(int entityID) {return em.getReference(entityClass, entityID);}// Using the unchecked because JPA does not have a// em.getCriteriaBuilder().createQuery()<T> method@SuppressWarnings({ 'unchecked', 'rawtypes' })public List<T> findAll() {CriteriaQuery cq = em.getCriteriaBuilder().createQuery();cq.select(cq.from(entityClass));return em.createQuery(cq).getResultList();}// Using the unchecked because JPA does not have a// query.getSingleResult()<T> method@SuppressWarnings('unchecked')protected T findOneResult(String namedQuery, Map<String, Object> parameters) {T result = null;try {Query query = em.createNamedQuery(namedQuery);// Method that will populate parameters if they are passed not null and emptyif (parameters != null && !parameters.isEmpty()) {populateQueryParameters(query, parameters);}result = (T) query.getSingleResult();} catch (NoResultException e) {System.out.println('No result found for named query: ' + namedQuery);} catch (Exception e) {System.out.println('Error while running query: ' + e.getMessage());e.printStackTrace();}return result;}private void populateQueryParameters(Query query, Map<String, Object> parameters) {for (Entry<String, Object> entry : parameters.entrySet()) {query.setParameter(entry.getKey(), entry.getValue());}}
}
package com.dao;import java.util.*;import com.model.Person;public class PersonDAO extends GenericDAO<Person> {private static final long serialVersionUID = 1L;public PersonDAO() {super(Person.class);}public Person findPersonWithAllDogs(int personId) {Map<String, Object> parameters = new HashMap<String, Object>();parameters.put('personId', personId);return super.findOneResult(Person.FIND_USER_BY_ID_WITH_DOGS, parameters);}
}
package com.dao;import java.util.*;import com.model.User;public class UserDAO extends GenericDAO<User> {private static final long serialVersionUID = 1L;public UserDAO() {super(User.class);}public User findUserByEmail(String email){Map<String, Object> parameters = new HashMap<String, Object>();parameters.put('email', email);     return super.findOneResult(User.FIND_BY_EMAIL, parameters);}
}
package com.dao;import com.model.Dog;public class DogDAO extends GenericDAO<Dog> {private static final long serialVersionUID = 1L;public DogDAO() {super(Dog.class);}
}

關于上面的代碼:

  • DAO類具有允許Fa?ades控制交易的方法。 應用此模式是為了避免使用OpenSessionInView模式。 OpenSessionInView模式可能會導致查詢的N + 1效果。 在開發人員控制交易的情況下,更容易理解交易流程,但是我們的代碼更加冗長。 如果您想了解有關OpenSessionInView和N + 1效果的更多信息, 請單擊此處 。
  • 您將在GenericDAO類中找到一個名為“ populateQueryParameters”的方法。 如果需要,此方法將動態填充查詢的所有參數。 類PersonDAO和UserDAO具有如何調用此方法的示例代碼。

外墻

在“ com.facade”包中,您將需要創建以下類:

package com.facade;import com.dao.UserDAO;
import com.model.User;public class UserFacade {private UserDAO userDAO = new UserDAO();public User isValidLogin(String email, String password) {userDAO.beginTransaction();User user = userDAO.findUserByEmail(email);if (user == null || !user.getPassword().equals(password)) {return null;}return user;}
}
package com.facade;import java.io.Serializable;
import java.util.List;import com.dao.DogDAO;
import com.model.Dog;public class DogFacade implements Serializable{private static final long serialVersionUID = 1L;private DogDAO dogDAO = new DogDAO();public void createDog(Dog dog) {dogDAO.beginTransaction();dogDAO.save(dog);dogDAO.commitAndCloseTransaction();}public void updateDog(Dog dog) {dogDAO.beginTransaction();Dog persistedDog = dogDAO.find(dog.getId());persistedDog.setAge(dog.getAge());persistedDog.setName(dog.getName());dogDAO.update(persistedDog);dogDAO.commitAndCloseTransaction();}public Dog findDog(int dogId) {dogDAO.beginTransaction();Dog dog = dogDAO.find(dogId);dogDAO.closeTransaction();return dog;}public List<Dog> listAll() {dogDAO.beginTransaction();List<Dog> result = dogDAO.findAll();dogDAO.closeTransaction();return result;}public void deleteDog(Dog dog) {dogDAO.beginTransaction();Dog persistedDog = dogDAO.findReferenceOnly(dog.getId());dogDAO.delete(persistedDog);dogDAO.commitAndCloseTransaction();}
}
package com.facade;import java.io.Serializable;
import java.util.List;import com.dao.DogDAO;
import com.dao.PersonDAO;
import com.model.Dog;
import com.model.Person;public class PersonFacade implements Serializable {private static final long serialVersionUID = 1L;private PersonDAO personDAO = new PersonDAO();private DogDAO dogDAO = new DogDAO();public void createPerson(Person person) {personDAO.beginTransaction();personDAO.save(person);personDAO.commitAndCloseTransaction();}public void updatePerson(Person person) {personDAO.beginTransaction();Person persistedPerson = personDAO.find(person.getId());persistedPerson.setName(person.getName());persistedPerson.setAge(person.getAge());personDAO.commitAndCloseTransaction();}public void deletePerson(Person person){personDAO.beginTransaction();Person persistedPersonWithIdOnly = personDAO.findReferenceOnly(person.getId());personDAO.delete(persistedPersonWithIdOnly);personDAO.commitAndCloseTransaction();}public Person findPerson(int personId) {personDAO.beginTransaction();Person person = personDAO.find(personId);personDAO.closeTransaction();return person;}public List<Person> listAll() {personDAO.beginTransaction();List<Person> result = personDAO.findAll();personDAO.closeTransaction();return result;}public Person findPersonWithAllDogs(int personId) {personDAO.beginTransaction();Person person = personDAO.findPersonWithAllDogs(personId);personDAO.closeTransaction();return person;}public void addDogToPerson(int dogId, int personId) {personDAO.beginTransaction();dogDAO.joinTransaction();Dog dog = dogDAO.find(dogId);Person person = personDAO.find(personId);person.getDogs().add(dog);dog.getPerson().add(person);personDAO.commitAndCloseTransaction();}public void removeDogFromPerson(int dogId, int personId) {personDAO.beginTransaction();dogDAO.joinTransaction();Dog dog = dogDAO.find(dogId);Person person = personDAO.find(personId);person.getDogs().remove(dog);dog.getPerson().remove(person);personDAO.commitAndCloseTransaction();}
}

關于上面的代碼:

  • 每筆交易都由開發者控制。 開發人員有責任永不忘記已完成的交易。
  • PersonFacade類使用名為“ findReferenceOnly ”的方法。 與僅涉及僅需要實體ID的操作的“ find ”方法相比,該方法具有更好的性能。 將在數據庫中觸發查詢,以僅獲取該實體的ID。 如果調用了其他任何屬性,則將在數據庫中激發一個新查詢以帶來該信息。 根據《 Pro JPA 2:掌握Java?持久性API 》一書,該方法還可以用于編輯列表中的項目。 例如,在方法Person.addDoAgToPerson中,可以將“ find ”方法替換為“ findReferenceOnly
  • 這兩種方法” Person.addDogToPerson”,并在DogDAO類‘Person.removeDogFromPerson’調用方法‘joinTransaction’。 DogDAO中的EntityManager將使用從PersonDAO開始的同一事務。

關心EntityManager.merge()

看一下下面的代碼:

只需調用這樣的方法:“ entityManager.merge(dog) ”,而不是查詢持久化對象并更新數據,會更容易。 如果在從視圖接收的文件中調用merge方法,則可能會損壞數據庫數據的完整性。 開發人員必須注意這種合并方法。 如果未加載惰性關系,并且在合并的實體中此關系為null,則JPA / Hibernate將在數據庫中擦除此關系。 例如,如果開發人員調用方法entityManager.merge(dog)和dog.getPersons()== null,則JPA / Hibernate將刪除數據庫中它們之間的所有關系。

最佳實踐是在數據庫中查找對象而不是對其進行編輯。

在這個項目中,對象是從數據庫中加載的,并且處于分離狀態。 對于這種特殊情況,您發現對象已分離并且惰性關系不為null,JPA不會刪除數據庫數據關系。 如果該對象是手動創建的,并且關系的值是List <Person> == null,則JPA將刪除數據庫數據。

過濾

在“ com.filter”包中,您將需要創建以下類:

package com.filter;import java.io.IOException;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;public class AbstractFilter {public AbstractFilter() {super();}protected void doLogin(ServletRequest request, ServletResponse response, HttpServletRequest req) throws ServletException, IOException {RequestDispatcher rd = req.getRequestDispatcher('/pages/public/login.xhtml');rd.forward(request, response);}protected void accessDenied(ServletRequest request, ServletResponse response, HttpServletRequest req) throws ServletException, IOException {RequestDispatcher rd = req.getRequestDispatcher('/pages/public/accessDenied.xhtml');rd.forward(request, response);}
}
package com.filter;import java.io.IOException;
import java.util.*;import javax.servlet.*;
import javax.servlet.http.*;import com.model.User;/*** Servlet Filter implementation class UserCheckFilter*/
public class LoginCheckFilter extends AbstractFilter implements Filter {private static List<String> allowedURIs;/*** @see Filter#init(FilterConfig)*/public void init(FilterConfig fConfig) throws ServletException {if(allowedURIs == null){allowedURIs = new ArrayList<String>();allowedURIs.add(fConfig.getInitParameter('loginActionURI'));allowedURIs.add('/JSFCrudApp/javax.faces.resource/main.css.xhtml');allowedURIs.add('/JSFCrudApp/javax.faces.resource/theme.css.xhtml');allowedURIs.add('/JSFCrudApp/javax.faces.resource/primefaces.js.xhtml');allowedURIs.add('/JSFCrudApp/javax.faces.resource/primefaces.css.xhtml');allowedURIs.add('/JSFCrudApp/javax.faces.resource/jquery/jquery.js.xhtml');allowedURIs.add('/JSFCrudApp/javax.faces.resource/messages/messages.png.xhtml');allowedURIs.add('/JSFCrudApp/javax.faces.resource/images/ui-icons_2e83ff_256x240.png.xhtml');allowedURIs.add('/JSFCrudApp/javax.faces.resource/images/ui-icons_38667f_256x240.png.xhtml');}}/*** @see Filter#destroy()*/public void destroy() {}/*** @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpSession session = req.getSession();if (session.isNew()) {doLogin(request, response, req);return;}User user = (User) session.getAttribute('user');if (user == null && !allowedURIs.contains(req.getRequestURI())) {System.out.println(req.getRequestURI());doLogin(request, response, req);return;}chain.doFilter(request, response);}
}
package com.filter;import java.io.IOException;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;import com.model.User;public class AdminPagesFilter extends AbstractFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;User user = (User) req.getSession(true).getAttribute('user');if (!user.isAdmin()) {accessDenied(request, response, req);return;}chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}
}
package com.filter;import java.io.IOException;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;import com.model.User;public class DefaultUserPagesFilter extends AbstractFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;User user = (User) req.getSession(true).getAttribute('user');if(!user.isUser() && !user.isAdmin()){accessDenied(request, response, req);return;}chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}
}

關于上面的代碼:

  • 實現Filter接口的類負責用戶的授權和身份驗證。 在第13頁上,將提供有關我們為什么需要檢查用戶是否已登錄及其在每次請求時的角色的更多信息。
  • 方法“ fConfig.getInitParameter(“ loginActionURI”); 在類LoginCheckFilter中調用的“”將從“ web.xml ”文件中加載屬性。 “ loginActionURI”屬性具有一個值,用于指示過濾器的登錄頁面; 過濾器將使用此屬性,以允許每個用戶(無論是否登錄)都訪問該特定頁面(您將在第12頁中看到該屬性值)。 將該屬性值添加到無需登錄用戶即可允許調用的URL列表中。 在“ web.xml”文件中保留此允許的URL列表是一個好習慣,但是對于商品,本文中的“ web.xml”中僅添加了一個以顯示操作方法。
  • 每個過濾器監視用戶可以訪問的目錄。 另一種方法是擁有一個帶有所有允許的URL及其允許的角色的文件,例如“ JSFCrud / protected / manager; admin-manager”。

繼續第二部分 。

參考:在uaiHebert博客上,我們的JCG合作伙伴 Hebert Coelho的Tomcat JSF Primefaces JPA Hibernate完整Web應用程序 。


翻譯自: https://www.javacodegeeks.com/2012/07/full-web-application-tomcat-jsf.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371816.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371816.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371816.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql主從架構升級_實戰項目——mysql主從架構的實現

一主一從1.1 環境準備&#xff1a;centos系統服務器2臺、 一臺用戶做Mysql主服務器&#xff0c; 一臺用于做Mysql從服務器&#xff0c; 配置好yum源、 防火墻關閉、 各節點時鐘服務同步、 各節點之間可以通過主機名互相通信1.2 準備步驟&#xff1a;1)iptables -F && s…

FastReport.Net使用:[30]對話框使用

使用對話框需要知道的地方 1.按鈕的DialogResult屬性。 假如DialogResult屬性值為OK的按鈕被點擊&#xff0c;報表將會展現后面的對話框或者報表頁&#xff1b;如果屬性值為None&#xff0c;則停留在當前窗體&#xff1b;如果為其他值&#xff0c;則直接退出報表打印&#xff0…

模擬聊天室顯示語句保持最新顯示

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>模擬聊天室顯示語句保持最新顯示</title> <style> *{ border-collapse: collapse; } .dialog_box{ width:400px; height: 600px; margin…

改善Java EE生產支持技能的8種方法

參與Java EE生產支持的每個人都知道這項工作可能很困難。 7/24傳呼機支持&#xff0c;定期處理的多個事件和錯誤修復&#xff0c;來自客戶和管理團隊的壓力&#xff0c;要求它們盡快解決生產問題并防止再次發生。 在日常工作中&#xff0c;您還必須照顧由多個IT交付團隊驅動的多…

plsql連接mysql_安裝了mysql和pl/sql,怎么配置讓pl/sql能聯接mysql數據庫

64位環境下&#xff0c;使用PL/SQL Developer連接Oracle&#xff1a;?1. 下載32位Oracle InstantClient&#xff0c;并展開到某目錄&#xff0c;例如C:\instantclient-basic-nt-11.2.0.2.0&#xff1b;?2. 將系統的tnsnames.ora拷貝到該目錄下&#xff1b;?3. 在PLSQL Devel…

varnish基礎

varnish概念 初步認識 首先來跟我學習&#xff0c;v~a~r~n~i~s~h~~ &#xff0c;學會了沒有~ 當然還有很重要的一個概念&#xff0c;它是高性能緩存服務器&#xff0c;舉個例子。 好比我們要去買東西&#xff0c;所有的我們需要的東西是在超市廠家生產出來的&#xff0c;我們需…

引入Spring集成

在本文中&#xff0c;我們介紹Spring Integration 。 如果您以前沒有使用過Spring Integration&#xff0c;那么可能會幫助您復習Gregor Hohpe的Enterprise Integration Patterns 。 我還將推薦Josh Long 撰寫的這篇出色的介紹性文章 。 上下文設置 簡而言之&#xff0c; 企業…

PAT 1024. 科學計數法 (20)

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法&#xff0c;其滿足正則表達式[-][1-9]"."[0-9]E[-][0-9]&#xff0c;即數字的整數部分只有1位&#xff0c;小數部分至少有1位&#xff0c;該數字及其指數部分的正負號即使對正數也必定明確給出。 現以科…

Mac上Hive環境搭建

本文介紹在Mac上搭建Hive環境。 建議首先配置好Hadoop&#xff0c;搭建與配置可以參考我之前的博文Mac Hadoop的安裝與配置。 當然你也可以選擇使用Docker搭建環境&#xff0c;本文不作介紹。 安裝 對于MacOs&#xff0c;推薦使用HomeBrew安裝hive&#xff0c;一步到位。 $ bre…

mysql+創建備份賬戶_mysql 添加用戶,授予權限,數據庫備份等 (轉載)

一&#xff0c;連接MySQL格式&#xff1a;mysql -h 遠程主機地址 -u 用戶名 -p 回車輸入密碼進入&#xff1a;mysql -u root -p 回車Enter password: ,輸入密碼就可以進入mysql> 進入了退出命令:>exit 或者ctrlD二&#xff0c;MySQL管理與授權1.修改密碼&#xff1a;格式…

分代緩存和轉換

康拉德&#xff08;Konrad&#xff09;最近在我們公司的技術室中分享了有關如何完成緩存的有趣文章&#xff0c;這是一個大型的波蘭社交網絡nk.pl。 算法中的核心概念之一是分代緩存 &#xff08;請參閱此處或此處 &#xff09;。 基本思想是&#xff0c;對于緩存鍵&#xff0c…

css精靈

○ css 精靈&#xff08;Sprites&#xff09;技術利用photoshop將圖片整合&#xff0c;然后用background-images&#xff0c;background-position&#xff0c;background-repeat技術&#xff0c;對圖片進行精確定位。 ○ 優點&#xff1a;減少http請求數量&#xff0c;減少服務…

基于Jenkins+Gitlab的自動化部署實戰

故事背景 一個中小型企業&#xff0c;是典型的互聯網公司&#xff0c;當初期的時候可能運維只能標配到2~3人&#xff0c;此時隨著公司的發展&#xff0c;項目會逐漸增多。前期部署項目可能都是手動的&#xff0c; 俗稱“人肉部署”&#xff0c;這簡直是無比的痛苦&#xff0c;不…

cmd如何刷新MySQL數據庫_怎樣在cmd中用命令操作MySQL數據庫 需要技巧

用命令來操作MySQL是工作必備的&#xff0c;今天我就來分享一下cmd命令操作MySQL數據庫的方法&#xff0c;希望有幫助。工具/材料電腦xampp操作方法01首先&#xff0c;啟動MySQL服務才行哦。這里我是用xampp集成的數據庫&#xff0c;方便&#xff0c;點擊‘start’。02如圖&…

Java順序IO性能

許多應用程序將一系列事件記錄到基于文件的存儲中&#xff0c;以供以后使用。 從日志記錄和審核&#xff0c;直到在事件源設計或其緊密相關的CQRS中保留事務重做日志&#xff0c;這都可以是任何東西。 Java具有多種方法&#xff0c;可以通過這些方法將文件順序寫入或重新讀取。…

text段,data段,bss段,堆和棧

.bss段和.data段的區別 text段,data段,bss段,堆和棧轉載于:https://www.cnblogs.com/jingzhishen/p/6203107.html

[BZOJ3529][Sdoi2014]數表

[BZOJ3529][Sdoi2014]數表 試題描述 有一張Nm的數表&#xff0c;其第i行第j列&#xff08;1 < i < n&#xff0c;1 < j < m&#xff09;的數值為能同時整除i和j的所有自然數之和。給定a&#xff0c;計算數表中不大于a的數之和。輸入 輸入包含多組數據。輸入的第一行…

ZK的實際應用:MVVM –表單綁定

這是我們從頭開始構建ZK應用程序的第二集。 上一篇文章涉及使用MVVM將數據加載和呈現到表中。 在本文中&#xff0c;我們將向您介紹ZK MVVM的表單綁定。 目的 我們將構建一個“添加”功能&#xff0c;使我們能夠將新條目保存到清單中。 單擊“添加”時出現表格 單擊“保存”…

群暉按裝mysql_如何連接群暉里的MYSQL數據庫

匿名用戶1級2018-08-27 回答一、連接遠程數據庫&#xff1a;1、顯示密碼如&#xff1a;MySQL 連接遠程數據庫(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用戶名為“root”&#xff0c;密碼“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隱藏密…

ZK的實際應用:MVVM –以編程方式更新視圖

在前兩篇文章中&#xff0c;我們使用ZK的MVVM功能來&#xff1a; 將數據加載到表中 使用表單綁定保存數據 我們已經看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;裝飾方法時&#xff0c;在執行完成后&#xff0c;將向Binder通知VM屬性的更改&#xff0c;以便B…