完整的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.mzph.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…

改善Java EE生产支持技能的8种方法

参与Java EE生产支持的每个人都知道这项工作可能很困难。 7/24传呼机支持&#xff0c;定期处理的多个事件和错误修复&#xff0c;来自客户和管理团队的压力&#xff0c;要求它们尽快解决生产问题并防止再次发生。 在日常工作中&#xff0c;您还必须照顾由多个IT交付团队驱动的多…

varnish基础

varnish概念 初步认识 首先来跟我学习&#xff0c;v~a~r~n~i~s~h~~ &#xff0c;学会了没有~ 当然还有很重要的一个概念&#xff0c;它是高性能缓存服务器&#xff0c;举个例子。 好比我们要去买东西&#xff0c;所有的我们需要的东西是在超市厂家生产出来的&#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如图&…

[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;使我们能够将新条目保存到清单中。 单击“添加”时出现表格 单击“保存”…

ZK的实际应用:MVVM –以编程方式更新视图

在前两篇文章中&#xff0c;我们使用ZK的MVVM功能来&#xff1a; 将数据加载到表中 使用表单绑定保存数据 我们已经看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;装饰方法时&#xff0c;在执行完成后&#xff0c;将向Binder通知VM属性的更改&#xff0c;以便B…

mysql安装与配置的截图_windows下MySQL5.6版本安装及配置过程附有截图和详细说明...

随着MYSQL版本的更新以及电脑系统的变化&#xff0c;我们给大家整理了各种电脑环境下安装MYSQL的图解过程&#xff0c;希望我们整理的内容能够帮助到大家&#xff1a;mysql安装图解总结https://www.jb51.net/article/142398.htm编辑者&#xff1a;Vocabulary下面详细介绍5.6版本…

c# mysql 插入 和 查询_C#对数据库的操作(增删改查)

1、【在web.config文件中配置】2、【连接字符串】private static readonly string StrCon ConfigurationManager.ConnectionStrings["sqlConnection"].ToString();3、【查询数据方法】/// /// 查询数据/// /// 查询语句/// 参数/// public static DataTable QueryDa…

2017年07月03号课堂笔记

2017年07月03号 星期一 多云 空气质量&#xff1a;轻度污染~中度污染 内容&#xff1a;MySQL第四节课 in和not in&#xff1b;两个表的内连接&#xff1b;exists和not exsits的使用&#xff1b;all,any和some&#xff1b; 使用子查询的注意事项&#xff1b;sql优化&#xff08…

excel文件被写保护怎么解除_u盘被写保护怎么解除,看完你就知道了

在平常我们使用U盘存储资料过程中&#xff0c;有时会发现U盘出现无法正常读写的现象&#xff0c;具备表现为U盘被写保护&#xff0c;无法正常执行读写操作。对于小编给大家提供以下解决方法&#xff0c;希望对大家能有所帮助。对U盘执行重置操作01上网搜索并下载“USBOOT”程序…

OSGi案例研究:模块化vert.x

OSGi使Java代码可以清晰地划分为多个模块&#xff0c;这些模块称为捆绑软件 &#xff0c;可以访问由每个捆绑软件的类加载器控制的代码和资源。 OSGi 服务提供了一种附加的分离机制&#xff1a;接口的用户不需要依赖于实现类&#xff0c;工厂等。 以下案例研究旨在使OSGi捆绑包…

mysql一些常用操作_表的一些常用操作_MySQL

bitsCN.com-创建表(也就是创建表结构)&#xff1a;create table tbl_name(列结构&#xff0c;即有哪些属性)[表选项]; 如&#xff1a;班级的信息&#xff1a;(班级编号&#xff0c;开班日期)create table java_class(class_num varchar(10),date_start date);注&#xff1a;该表…

如何调整自定义标签样式

用chromeF12&#xff0c;查看网页代码在自定义标签上加class&#xff0c;写样式&#xff1a;例如&#xff1a;JSP文件&#xff1a;来自为知笔记(Wiz)转载于:https://www.cnblogs.com/anobugworld/p/7112116.html

无需部署即可测试JPQL / HQL

您是否曾经想在不完全部署应用程序的情况下测试JPQL / HQL&#xff1f; 我们今天在这里看到的是适用于任何JPA实现的简单解决方案&#xff1a;Hibernate&#xff0c;OpenJPA&#xff0c;EclipseLink等。 这篇文章中找到的基本源代码来自于本书&#xff1a;“ Pro JPA 2&#xf…

python加密模块教程_Python加密模块的hashlib,hmac模块使用解析

这篇文章主要介绍了Python加密模块的hashlib,hmac模块使用解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下在写搬砖脚本中&#xff0c;碰到一个加密的信号标签文件无法运行。import hashlibimport timem ha…

SCREEN屏幕编程时候必须保证SCREN中词典的字段格式必须和数据表中字段的类型长度一致!...

此时任意操作都会出现如下问题 /h调试 回车调试被激活任意操作 执行到第23行时候报错“请输入一个数值”&#xff0c;检查数据表中字段参考数据元素以及对应的域均是char类型&#xff0c;此时检查screen屏幕设置字段类型&#xff0c;/n退出程序 重新进入程序 单击 点击屏幕9000…

zabbix 3.0.3 (nginx)安装过程中的问题排错记录

特殊注明&#xff1a;安装zabbix 2.4.8和2.4.6遇到2个问题&#xff0c;如下&#xff1a;找了很多解决办法&#xff0c;实在无解&#xff0c;只能换版本&#xff0c;尝试换&#xff08;2.2.2正常 | 3.0.3正常&#xff09;都正常&#xff0c;最后决定换3.0.31、Error connecting …