首先在搭建一个网站后台前,需要明确出一个合理的网页搭建的结构框架,即从DB  ==>  Dao层 ==>Service层 ==>Control层 ==>View层(该层严格意义上不属于后台)当中,各层的概念和设计思路。

Dao层(Data Acess Object):所谓的Dao层,主要是网页的数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,包括网页数据当中的增删改查,DAO层的设计首先是设计DAO的接口的抽象,然后在Spring的配置文件中定义此接口的实现类,之后对于上一层的service层来说,不需要关注此接口的具体实现类是哪个类,只需要关注这个接口能实现的功能即可,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。

Service层:主要负责业务模块的逻辑应用设计。同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的DAO层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。

Controller层:负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程,并且控制前端相应的操作之后,页面需要如何跳转,作出何种反应等。控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。

View层:此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示。

在本文当中介绍的例子当中,因为不存在太复杂的业务处理逻辑,所以不单独抽象出Service层进行设计,即在本文当中,Service层和Dao层合并为一层,负责处理简单的业务。网页主要功能是记录在本网页当中注册的用户之间的债务关系,并且有借债的详情。作为Admin的用户可对其他用户数据进行管理。以下是网页的效果图:

首先是工程搭建,在eclipseEE下,创建一个Dynamic web project,之后将所需要用到的Spring和hibernate的jar包复制到 WEB-INF目录下的lib文件夹当中,并且build the path,本文中采用的是Spring 4.2.5和Hibernate 5.1.0版本:

1.将Hibernate5.1.0根目录下的 /lib/required和 /lib/java8目录下的jar复制到上述WEB-INF目录下的lib文件夹

2.将Spring根目录下的 /libs 下的所有jar包也引入到WEB-INF目录下的lib文件夹,则开发环境搭建完毕。

接下来根据我们的网页搭建的设计思路,首先需要设计DB的持久化结构,即数据库的表结构,因为根据需求,我们知道需要存储网页的注册用户信息,并且还要存储各个用户之间的欠债关系,所以至少需要两张表格。表结构设计如下:

1.数据库名moneyrecordsys。

2.表格MoneyRecordInfo

3.表格UserInfo

DB的持久化结构设计完成以后,我们开始根据我们需要的功能,抽象Dao当中的接口以及接口功能:

1.用户信息的Dao接口,依据我们的需求,我们需要对用户信息的表进行一下操作,常规的增删改查,以及根据用户名进行用户查询,根据密码进行用户查询,查询返回所有用户等功能(在起初设计的时候,很难一次性想全所有的功能,所以我们前文提出的设计思路,是一个反复的过程,即在Dao接口设计完要去完成Control层的实现发现缺乏某些功能的时候,还需要返回到Dao层进行添加)

  1. package Fmu.wellhold.dao.ITF;
  2.  
  3. import java.util.List;
  4.  
  5. public interface UserInfoDaoITF {
  6.  
  7. public void delete(Integer number);
  8. public List<Object>findAll();
  9. public Object findByld(Integer number);
  10. public void insert(Object o);
  11. public void update(Object o);
  12. public List findByNamePwd(String id,String pwd);
  13. public boolean findByName(String id);
  14.  
  15. }

2.债务信息的Dao接口,与用户信息的Dao接口设计思路雷同,此处不再进行赘述

  1. package Fmu.wellhold.dao.ITF;
  2.  
  3. import java.util.List;
  4.  
  5. public interface MoneyRecordInfoDaoITF {
  6.  
  7. public void delete(Integer number);
  8. public List<Object>findAll();
  9. public Object findByld(Integer number);
  10. public void insert(Object o);
  11. public void update(Object o);
  12.  
  13. }

之后是对Dao层接口的实现,在实现接口之前,我们需要在Spring的配置文件当中,配置hibernate与数据库的联通,此处连接池我们使用的是C3P0(注意引C3P0相应的jar包)。首先在Spring的配置数据库连接池

  1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
  2. <property name="driverClass">
  3. <value>com.mysql.jdbc.Driver</value>
  4. </property>
  5. <property name="jdbcUrl">
  6. <!--
  7. <value>jdbc:mysql://localhost:3306/moneyrecordsys?useUnicode=true&amp;characterEncoding=UTF-8</value>
  8. <value>jdbc:mysql://123.206.82.174:3306/moneyrecordsys?useUnicode=true&amp;characterEncoding=UTF-8</value>
  9. <value>jdbc:mysql://123.56.23.127:3306/moneyrecordsys?useUnicode=true&amp;characterEncoding=UTF-8</value>
  10. -->
  11. <value>jdbc:mysql://123.56.23.127:3306/moneyrecordsys?useUnicode=true&amp;characterEncoding=UTF-8</value>
  12.  
  13. </property>
  14. <property name="user">
  15. <value>root</value>
  16. </property>
  17. <property name="password">
  18. <value>root</value>
  19. </property>
  20. <!--连接池中保留的最小连接数。-->
  21. <property name="minPoolSize" value="10"/>
  22. <!--连接池中保留的最大连接数。Default: 15 -->
  23. <property name="maxPoolSize" value="100"/>
  24. <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
  25. <property name="maxIdleTime" value="1800"/>
  26. <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
  27. <property name="acquireIncrement" value="3"/>
  28. <property name="maxStatements" value="1000"/>
  29. <property name="initialPoolSize" value="10"/>
  30. <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
  31. <property name="idleConnectionTestPeriod" value="60"/>
  32. <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
  33. <property name="acquireRetryAttempts" value="30"/>
  34. <property name="breakAfterAcquireFailure" value="true"/>
  35. <property name="testConnectionOnCheckout" value="false"/>
  36. </bean>

配置好连接池之后,我们需要建立hibernate POJO类到数据的hbm映射配置文件。此处补充一个定义POJO类(POJO(Plain Ordinary Java Object)如果项目中使用了Hibernate框架,有一个关联的xml文件,使对象与数据库中的表对应,对象的属性与表中的字段相对应。

  1. package Fmu.wellhold.dao.pojo;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Date;
  5.  
  6. public class MoneyRecordInfo implements Serializable{
  7.  
  8. private Integer number;
  9. private Integer money;
  10. private Date date;
  11. private String owner;
  12. private String debtor;
  13. private String remarks;
  14.  
  15. public MoneyRecordInfo()
  16. {
  17.  
  18. }
  19.  
  20. public MoneyRecordInfo(Integer number, Integer money, Date date, String owner, String debtor, String remarks) {
  21. super();
  22. this.number = number;
  23. this.money = money;
  24. this.date = date;
  25. this.owner = owner;
  26. this.debtor = debtor;
  27. this.remarks = remarks;
  28. }
  29.  
  30. @Override
  31. public String toString() {
  32. return "MoneyRecordInfo [number=" + number + ", money=" + money + ", date=" + date + ", owner=" + owner
  33. + ", debtor=" + debtor + ", remarks=" + remarks + "]";
  34. }
  35.  
  36. public Integer getNumber() {
  37. return number;
  38. }
  39. public void setNumber(Integer number) {
  40. this.number = number;
  41. }
  42. public Integer getMoney() {
  43. return money;
  44. }
  45. public void setMoney(Integer money) {
  46. this.money = money;
  47. }
  48. public Date getDate() {
  49. return date;
  50. }
  51. public void setDate(Date date) {
  52. this.date = date;
  53. }
  54. public String getOwner() {
  55. return owner;
  56. }
  57. public void setOwner(String owner) {
  58. this.owner = owner;
  59. }
  60. public String getDebtor() {
  61. return debtor;
  62. }
  63. public void setDebtor(String debtor) {
  64. this.debtor = debtor;
  65. }
  66. public String getRemarks() {
  67. return remarks;
  68. }
  69. public void setRemarks(String remarks) {
  70. this.remarks = remarks;
  71. }
  72.  
  73. }
  1. package Fmu.wellhold.dao.pojo;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Date;
  5.  
  6. public class UserInfo implements Serializable{
  7.  
  8. private Integer number;
  9. private String id;
  10. private String name;
  11. private String Sex;
  12. private Date birthday;
  13. private String come;
  14. private String pwd;
  15. private String remark;
  16.  
  17. public UserInfo(){}
  18.  
  19. public Integer getNumber() {
  20. return number;
  21. }
  22.  
  23. public void setNumber(Integer number) {
  24. this.number = number;
  25. }
  26.  
  27. public String getId() {
  28. return id;
  29. }
  30.  
  31. public void setId(String id) {
  32. this.id = id;
  33. }
  34.  
  35. public String getName() {
  36. return name;
  37. }
  38.  
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42.  
  43. public String getSex() {
  44. return Sex;
  45. }
  46.  
  47. public void setSex(String sex) {
  48. Sex = sex;
  49. }
  50.  
  51. public Date getBirthday() {
  52. return birthday;
  53. }
  54.  
  55. public void setBirthday(Date birthday) {
  56. this.birthday = birthday;
  57. }
  58.  
  59. public String getCome() {
  60. return come;
  61. }
  62.  
  63. public void setCome(String come) {
  64. this.come = come;
  65. }
  66.  
  67. public String getPwd() {
  68. return pwd;
  69. }
  70.  
  71. public void setPwd(String pwd) {
  72. this.pwd = pwd;
  73. }
  74.  
  75. public String getRemark() {
  76. return remark;
  77. }
  78.  
  79. public void setRemark(String remark) {
  80. this.remark = remark;
  81. }
  82.  
  83. public UserInfo(Integer number, String id, String name, String sex, Date birthday, String come, String pwd,
  84. String remark) {
  85. super();
  86. this.number = number;
  87. this.id = id;
  88. this.name = name;
  89. Sex = sex;
  90. this.birthday = birthday;
  91. this.come = come;
  92. this.pwd = pwd;
  93. this.remark = remark;
  94. }
  95.  
  96. @Override
  97. public String toString() {
  98. return "UserInfo [number=" + number + ", id=" + id + ", name=" + name + ", Sex=" + Sex + ", birthday="
  99. + birthday + ", come=" + come + ", pwd=" + pwd + ", remark=" + remark + "]";
  100. }
  101.  
  102. }

有了pojo类作为数据库条目到java的对象之后,需要建立相应的映射,即hbm.xml(此处如不熟悉什么的hbm.xml概念的同学,可以自行查阅Hibernate的使用手册)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <!DOCTYPE hibernate-mapping PUBLIC
  4. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  5. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  6.  
  7. <hibernate-mapping package="Fmu.wellhold.dao.pojo">
  8. <class name="UserInfo" table="UserInfo">
  9. <!-- 选择pojo类 -->
  10. <id name="number" type="java.lang.Integer">
  11. <column name="number"/>
  12. <generator class="native"/>
  13. </id>
  14. <!-- 配置序号,即主键的 -->
  15.  
  16. <!-- 配置其他项 -->
  17. <property name="id" type="java.lang.String">
  18. <column name="id">
  19. <comment>登陆名称</comment>
  20. </column>
  21. </property>
  22.  
  23. <property name="name" type="java.lang.String">
  24. <column name="name">
  25. <comment>姓名</comment>
  26. </column>
  27. </property>
  28.  
  29. <property name="sex" type="java.lang.String">
  30. <column name="sex">
  31. <comment>性别</comment>
  32. </column>
  33. </property>
  34.  
  35. <property name="birthday" type="java.util.Date">
  36. <column name="birthday">
  37. <comment>生日</comment>
  38. </column>
  39. </property>
  40.  
  41. <property name="come" type="java.lang.String">
  42. <column name="come">
  43. <comment>报道时间</comment>
  44. </column>
  45. </property>
  46.  
  47. <property name="pwd" type="java.lang.String">
  48. <column name="pwd">
  49. <comment>密码</comment>
  50. </column>
  51. </property>
  52.  
  53. <property name="remark" type="java.lang.String">
  54. <column name="remark">
  55. <comment>个人介绍</comment>
  56. </column>
  57. </property>
  58.  
  59. </class>
  60.  
  61. </hibernate-mapping>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <!DOCTYPE hibernate-mapping PUBLIC
  4. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  5. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  6.  
  7. <hibernate-mapping package="Fmu.wellhold.dao.pojo">
  8. <class name="MoneyRecordInfo" table="MoneyRecordInfo">
  9.  
  10. <id name="number" type="java.lang.Integer">
  11. <column name="number"/>
  12. <generator class="native"/>
  13. </id>
  14.  
  15. <property name="date" type="java.util.Date">
  16. <column name="date">
  17. <comment>欠款日期</comment>
  18. </column>
  19. </property>
  20.  
  21. <property name="owner" type="java.lang.String">
  22. <column name="owner">
  23. <comment>出钱人</comment>
  24. </column>
  25. </property>
  26.  
  27. <property name="debtor" type="java.lang.String">
  28. <column name="debtor">
  29. <comment>欠债人</comment>
  30. </column>
  31. </property>
  32.  
  33. <property name="money" type="java.lang.Integer">
  34. <column name="money">
  35. <comment>金额</comment>
  36. </column>
  37. </property>
  38.  
  39. <property name="remarks" type="java.lang.String">
  40. <column name="remarks">
  41. <comment>备注</comment>
  42. </column>
  43. </property>
  44.  
  45. </class>
  46.  
  47. </hibernate-mapping>

因为hibernate是通过对Session这个接口去对数据库进行增删改查的操作的,建立好数据库到对象的映射之后,还需要在Spring的配置文件中,配置hibernate的sessionFactory:

  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  2. <property name="dataSource" ref="dataSource"/>
  3. <property name="mappingResources">
  4. <list>
  5. <value>Fmu/wellhold/hbm/UserInfo.hbm.xml</value>
  6. <value>Fmu/wellhold/hbm/MoneyRecordInfo.hbm.xml</value>
  7. <!-- 可以直接索引到代码目录 -->
  8. </list>
  9. </property>
  10. <property name="hibernateProperties">
  11. <props>
  12. <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
  13. <prop key="hibernate.show_sql">false</prop>
  14. <prop key="hibernate.hbm2ddl.auto">update</prop>
  15. <prop key="hibernate.format_sql">false</prop>
  16. </props>
  17. </property>
  18. </bean>

之后在注册一个对于基于该session的事务管理器,即可开始我们的后台Dao层的接口实现工作

  1. <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  2. <property name="sessionFactory" ref="sessionFactory"></property>
  3. </bean>
  4. <!-- 开启TX的注释模式,加载注释驱动 -->
  5. <tx:annotation-driven transaction-manager="txManager"/>

首先实现债务信息接口功能:

  1. package Fmu.wellhold.dao.service;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import javax.annotation.Resource;
  7.  
  8. import org.hibernate.SessionFactory;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.transaction.annotation.Propagation;
  11. import org.springframework.transaction.annotation.Transactional;
  12.  
  13. import Fmu.wellhold.dao.ITF.MoneyRecordInfoDaoITF;
  14. import Fmu.wellhold.dao.pojo.MoneyRecordInfo;
  15.  
  16. @Transactional
  17. @Service("moneyRecordInfoService")
  18. public class MoneyRecordInfoService implements MoneyRecordInfoDaoITF {
  19.  
  20. @Resource private SessionFactory sessionFactory;
  21.  
  22. @Override
  23. @Transactional(propagation=Propagation.REQUIRED)
  24. public void delete(Integer number) {
  25. MoneyRecordInfo moneyRecordInfo = (MoneyRecordInfo)sessionFactory.getCurrentSession().get(MoneyRecordInfo.class, number);
  26. sessionFactory.getCurrentSession().delete(moneyRecordInfo);
  27. }
  28.  
  29. @Override
  30. @Transactional(propagation=Propagation.REQUIRED)
  31. public List<Object> findAll() {
  32. List list = new ArrayList<>();
  33. list=sessionFactory.getCurrentSession().createQuery("from MoneyRecordInfo").list();
  34. return list;
  35. }
  36.  
  37. @Override
  38. @Transactional(propagation=Propagation.REQUIRED)
  39. public Object findByld(Integer number) {
  40. MoneyRecordInfo moneyRecordInfo = (MoneyRecordInfo)sessionFactory.getCurrentSession().get(MoneyRecordInfo.class, number);
  41. return moneyRecordInfo;
  42. }
  43.  
  44. @Override
  45. @Transactional(propagation=Propagation.REQUIRED)
  46. public void insert(Object o) {
  47. System.out.println("o:"+o.toString());
  48. sessionFactory.getCurrentSession().save(o);
  49.  
  50. }
  51.  
  52. @Override
  53. @Transactional(propagation=Propagation.REQUIRED)
  54. public void update(Object o) {
  55. System.out.println("update"+o.toString());
  56. sessionFactory.getCurrentSession().update(o);
  57.  
  58. }
  59.  
  60. }

之后是用户信息的接口代码:

  1. package Fmu.wellhold.dao.service;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.annotation.Resource;
  6.  
  7. import org.hibernate.SessionFactory;
  8. import org.springframework.stereotype.Service;
  9. import org.springframework.transaction.annotation.Propagation;
  10. import org.springframework.transaction.annotation.Transactional;
  11.  
  12. import Fmu.wellhold.dao.ITF.UserInfoDaoITF;
  13. import Fmu.wellhold.dao.pojo.UserInfo;
  14.  
  15. @Transactional
  16. @Service("UserInfoService")
  17. public class UserInfoService implements UserInfoDaoITF {
  18.  
  19. @Resource private SessionFactory sessionFactory;
  20.  
  21. @Override
  22. @Transactional(propagation=Propagation.REQUIRED)
  23. public void delete(Integer number) {
  24. UserInfo user = (UserInfo)sessionFactory.getCurrentSession().get(UserInfo.class,number);
  25. sessionFactory.getCurrentSession().delete(user);
  26. }
  27.  
  28. @Override
  29. @Transactional(propagation=Propagation.REQUIRED,readOnly=true)
  30. public List<Object> findAll() {
  31. List list = sessionFactory.getCurrentSession().createQuery("from UserInfo").list();
  32. return list;
  33. }
  34.  
  35. @Override
  36. @Transactional(propagation=Propagation.REQUIRED,readOnly=true)
  37. public Object findByld(Integer number) {
  38. UserInfo user=(UserInfo)sessionFactory.getCurrentSession().get(UserInfo.class, number);
  39. return user;
  40. }
  41.  
  42. @Override
  43. @Transactional(propagation=Propagation.REQUIRED)
  44. public void insert(Object o) {
  45. sessionFactory.getCurrentSession().save(o);
  46.  
  47. }
  48.  
  49. @Override
  50. @Transactional(propagation=Propagation.REQUIRED)
  51. public void update(Object o) {
  52. sessionFactory.getCurrentSession().update(o);
  53.  
  54. }
  55.  
  56. @Override
  57. @Transactional(propagation=Propagation.REQUIRED,readOnly=true)
  58. public List findByNamePwd(String id1, String pwd) {
  59. List list = sessionFactory.getCurrentSession().createQuery("FROM UserInfo WHERE id='"+id1+"' AND pwd='"+pwd+"'").list();
  60. return list;
  61. }
  62.  
  63. @Override
  64. public boolean findByName(String id) {
  65. List list = sessionFactory.getCurrentSession().createQuery("FROM UserInfo WHERE id="+id+"").list();
  66. if(list.isEmpty())return true;
  67.  
  68. return false;
  69. }
  70.  
  71. }

将两个实现类注册到Spring的配置文件当中,利用@Service注解的方式,只需要在Spring的配置文件beans.xml当中添加以下声明即可:

  1. <!-- 开启Spring注释功能,扫描下包当中是否含有注释项 -->
  2. <context:annotation-config/>
  3. <context:component-scan base-package="Fmu.wellhold.controller"/>
  4. <context:component-scan base-package="Fmu.wellhold.dao.service"/>

至此,我们的Dao层(本例中Service层与Dao层不进行区分)就已经实现完成,可以通过一个测试例进行测试

  1. package Fmu.wellhold.controller;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. import Fmu.wellhold.dao.ITF.MoneyRecordInfoDaoITF;
  7. import Fmu.wellhold.dao.ITF.UserInfoDaoITF;
  8.  
  9. public class BackGroundTest {
  10.  
  11. private static UserInfoDaoITF userInfoDaoITF;
  12. private static MoneyRecordInfoDaoITF moneyRecordInfoDaoITF;
  13.  
  14. public static void main(String[] args) {
  15.  
  16. ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
  17.  
  18. System.out.println(">>>> 测试SpringMVC后台功能");
  19. userInfoDaoITF=(UserInfoDaoITF)ctx.getBean("UserInfoService");
  20. moneyRecordInfoDaoITF=(MoneyRecordInfoDaoITF)ctx.getBean("moneyRecordInfoService");
  21. System.out.println(userInfoDaoITF.findByld(1));
  22. System.out.println(moneyRecordInfoDaoITF.findAll().size());
  23.  
  24. }
  25.  
  26. }

如果能返回正确数据,说明我们DAO层就已经搭建完成。

SpringMVC + Hibernate + MySQL 的简易网页搭建(Dao层 实现篇)的更多相关文章

  1. SpringMVC + Hibernate + MySQL 的简易网页搭建(Control实现篇)

    在完成Dao层的实现之后,接下来我们需要继续开发我们网页的Control层以及View层. 从开发网页的角度来说: 1. Control层之下的Dao层和Service层可以看做是一个网页的底层负责与 ...

  2. JSP+Spring+SpringMVC+Hibernate+Mysql实现的校园失物招领网站

    项目简介 项目来源于:https://github.com/wenlongup/LostAndFound 因原github仓库无数据库文件,经过本人修改,现将该仓库重新上传至个人gitee仓库. ht ...

  3. 搭建DAO层和Service层代码

    第一部分建立实体和映射文件 1 通过数据库生成的实体,此步骤跳过,关于如何查看生成反向工程实体类查看SSH框架搭建教程-反向工程章节 Tmenu和AbstractorTmenu是按照数据库表反向工程形 ...

  4. CentOS 7 yum nginx MySQL PHP 简易环境搭建

    用centos自带的yum源来安装nginx,mysql和php,超级方便,省去编译的麻烦,省去自己配置的麻烦,还能节省非常多的时间. 我们先把yum源换成国内的阿里云镜像源(当然不换也可以),先备份 ...

  5. SpringMvc+Hibernate+Mysql保存表情字符(昵称)到数据库报错的问题?

    背景: 一个中小型H5游戏 描述: 游戏通过微信授权登入, 获取到用户昵称并将用户信息保存至Mysql数据库, 当遇到有些用户微信昵称中带有表情(特殊字符)时, 保存至数据库出错! 核心错误: Cau ...

  6. CentOS 7 yum nginx MySQL PHP7 简易环境搭建(精)

    用centos自带的yum源来安装nginx,mysql和php,超级方便,省去编译的麻烦,省去自己配置的麻烦,还能节省非常多的时间. 我们先把yum源换成国内的阿里云镜像源(当然不换也可以),先备份 ...

  7. springMvc+hibernate的web application的构建

    闲来没事,想整理下一些知识. 这篇文章是关于spring的web程序的搭建,有什么不对的地方希望大家批评指正. 首先我们要了解什么是spring,这里可能很多大家也都明白,无非是一个管理对象的一个容器 ...

  8. springMVC+angular+bootstrap+mysql的简易购物网站搭建

    springMVC+angular+bootstrap+mysql的简易购物网站搭建 介绍 前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(a ...

  9. Maven搭建SpringMVC+Hibernate项目详解 【转】

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

随机推荐

  1. PJSIP-PJLIB-Socket

    As we all know,most our projects are need to use the socket to programme.Use socket we can connect o ...

  2. java编程-无锁初始化

    private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == ...

  3. 剑指Offer - 九度1524 - 复杂链表的复制

    剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...

  4. HA集群基本概念详解

    一.高可用集群的定义 二.高可用集群的衡量标准 三.高可用集群的层次结构 四.高可用集群的分类 五.高可用集群常用软件 六.共享存储 七.集群文件系统与集群LVM 八.高可用集群的工作原理 一.高可用 ...

  5. React02

    目录 React 进阶提升 条件渲染 受控组件* 状态提升* 组件数据流 TODO-LIST 设置服务器端口 列表渲染 条目PropTypes检查类型 export & import Refs ...

  6. node+express+nginx搭建站点

    window系统 1.安装node 2.新建文件夹test 3. cmd 命令行 cd test 进入test文件夹下 输入命令:npm -v查看版本 确认node是否安装成功 4.npm init ...

  7. HS 光流法详解

    前言 本文较为详细地介绍了一种经典的光流法 - HS 光流法. 光流法简介 当人的眼睛与被观察物体发生相对运动时,物体的影像在视网膜平面上形成一系列连续变化的图像,这一系列变化的图像信息不断 &quo ...

  8. (总结)Nginx 502 Bad Gateway错误触发条件与解决方法

    一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现.以下是从Google搜集整理的一些Nginx 502错误的排查方法,供参考: Nginx 502 ...

  9. Dictionary & Chinese

    Dictionary & Chinese DC & dict https://github.com/zollero/simplified-chinese https://github. ...

  10. 使用pdb模块调试Python

    在Python中,我们需要debug时,有三种方式: 加log语句.最简单的方式是添加print()语句来输出我们想要获知的状态或者变量,好处是简单容易操作,坏处是debug完了之后,还需要将prin ...