愷风(Wei)之Java for Web学习笔记
文章平均质量分 89
Professional Java for Web Applications学习篇
恺风
我思故我在,如果一个人无法独立思考,即使熟习各种工具,实质只是工具的一部分,永远无法创造工具。
展开
-
Java for Web学习笔记(一四二)Spring security准备(3)初窥
了解Spring Security的基本知识完全J2EE的web container也能提供完整的安全框架,但tomcat不是。Spring Security可以使用JDBC,或者我们的服务或仓库来认证用户,也提供了内置的对微软Active Derectory,Jasig的CAS(Central Authentication Service),JAAS(Java Authentication ...原创 2018-09-27 11:45:34 · 1196 阅读 · 0 评论 -
Java for Web学习笔记(一四一)Spring security准备(2)授权
访问的范围和权限属于授权。Principals和Identities就Java而言,很方便利用java.security.Principal。Principal至少会包含已被认证的用户identity,例如用户名,还可能有其他信息。此外还可以保护用户的授权信息,这些信息的表述应采用常量,例如枚举或者有限的字符串,否者过多的授权会对内存有影响,进而影响性能。Roles,Groups,Ac...原创 2018-09-27 11:44:15 · 1206 阅读 · 0 评论 -
Java for Web学习笔记(一四十)Spring security准备(1)认证
匿名认证匿名认证有多种方式:不是通过你的ID进行认证,例如通过HTTP的session ID,实际是认证你曾经访问。 作为其他认证缺失的情况:,例如可以匿名登录论坛进行浏览。当让如果要做更多的事情,通常需要进行身份认证。密码认证密码认证古来有之。有密码和反密码,例如空降兵密码为flash,地面部队为thunder,避免抢先问密码,导致密码泄漏。这有点类似https在使用前,用户先检...原创 2018-09-27 11:39:54 · 1193 阅读 · 0 评论 -
Java for Web学习笔记(一三九)篇外之数据库的ACID和JPA(3)隔离性
SQL中的Isolation实验SQL语句案例:-- SELECT @@session.tx_isolation; 查看当前的isolationSET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;-- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;-- SE...原创 2018-09-27 11:24:56 · 1055 阅读 · 0 评论 -
Java for Web学习笔记(一三八)篇外之数据库的ACID和JPA(2)JPA
在测试中,我们发现在一个JPA事务中:Spring Data的写SQL是在最后commit前发出,这最大程度地缩短了写操作和commit之间的时间。 对相同的ID的读,JPA只从数据库中读取一次。 从数据库中获取entity,修改entity的数据,即使最后没有执行save,在commit之前,发送update。下面是其中一个测试小例子:@Transactionalpublic ...原创 2018-09-27 11:15:07 · 984 阅读 · 0 评论 -
Java for Web学习笔记(一三七)篇外之数据库的ACID和JPA(1)原子性
ACID大家都听过,看似也了解,但是在实际的项目中,发现不是所有人都正确理解。所以想谈一下当中容易忽略或者错误理解的地方。现在的开发语言和开发工具都很丰富,如果这要一一了解,也真是耗不起,但是有些是工具,知道怎么用就行,有些是基础知识,需要掌握。ACID就是基础知识,只有真正了解,才能在代码中进行合适的选择,特别是在异常处理和并发处理。在这个小系列中,基于下面的表格CREATE TABL...原创 2018-09-27 11:08:14 · 1102 阅读 · 0 评论 -
Java for Web学习笔记(一三六)映射(12)还谈FetchType.LAZY
说明在前面的学习中(见Java for Web学习笔记(一二七)映射(3)OneToOne),加上fetch = FetchType.LAZY的属性是集合或者Map。反映在SQL中,就是读取其他表格的信息(无论是通过join还是什么)。例如前面学习的@OneToMany、@ElementCollection。就单个表格而言,一次读取所有的列的数据,实际上在MySQL中,即使我们只是SELECT...原创 2018-08-24 16:23:03 · 2668 阅读 · 0 评论 -
Java for Web学习笔记(一三五)映射(11)代码触发器
说明数据库是有触发器Trigger。但我们希望业务逻辑能从底层的具体数据存储抽象出来(有需要时可以更好存储机制),也就是要在应用中编写trigger,而不是依赖底层数据库来实现。Entity内部触发器我们随便挑选以前的某个entity,在里面加入触发器。@Entitypublic class Person { ... ... // 【触发器说明】 //1...原创 2018-08-15 16:49:15 · 2093 阅读 · 0 评论 -
Java for Web学习笔记(一三四)映射(10)@SecondaryTables
说明@SecondaryTables在实际中很少使用。相当于是将一个entity的基础属性(不是collection)拆分到不同表中存放。这在表格设计中是不合理的。常用于遗留数据库,以及表格列太多查出数据库供应商的限制。和OneToOne不同,没有使用外键进行表格关联,而是两个表的主键代表同样含义。小例子数据库表格CREATE TABLE Employee ( Employe...原创 2018-08-09 17:12:10 · 1806 阅读 · 0 评论 -
Java for Web学习笔记(一三三)映射(9)中文输入
这个小例子中,我们已经:整个项目在eclipse中指定采用UTF-8 在web.xml中对jsp的配置已经设置了<page-encoding>UTF-8</page-encoding> 在jsp文件中,已经给出了<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">但是我们...原创 2018-08-08 15:55:50 · 1077 阅读 · 0 评论 -
Java for Web学习笔记(一三二)映射(8)@ElementCollection
说明在前面我们学习了OneToOne、OneToMany、ManyToOne,将数据库中不同表格的关联转换为spring中不同entity的关联。但是在不少场景中,我们希望在一个entity的视图中同查看到这几个表的信息,而无需通过entity之间的关联。在这个小例子中,我们还将学习和讨论到:表格有Employee,Employee_Address中存放员工多个地址,Employee_...原创 2018-08-08 15:52:33 · 9283 阅读 · 1 评论 -
Java for Web学习笔记(一三一)映射(7)entity的抽象和继承
Mapped superclass我们通过@javax.persistence.MappedSuperclass定义一个Mapped superclass,定义表格的通用属性,提供给Entity继承。它和Entity的属性映射是一样,但需注意:entity可以重写@Column。类标记为 @AttributeOverride或@AttributeOverrides,在里面给出需要overr...原创 2018-08-03 17:25:11 · 1896 阅读 · 0 评论 -
Java for Web学习笔记(一三十)映射(6)@Version
@VersionJPA可以将entity的某个属性(只允许一个)标记为@javax.persistence.Version。这个属性可以是整形和java.sql.Timestamp。如果是整形,Version从0开始,每次update,每次自动+1;如果是Timestamp,就是每次更新为now()。如果数据没有实际变化,version不会变更。小例子代码CREATE TABLE...原创 2018-08-02 14:38:05 · 2422 阅读 · 0 评论 -
Java for Web学习笔记(一二九)映射(5)ManyToMany
ManyToMany需要中间表格。小例子一本书可以有N个作者,一个作者可以有N本书。CREATE TABLE `Book` ( `Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, `BookName` varchar(50) COLLATE utf8_unicode_ci NOT NULL) ENG...原创 2018-08-01 11:37:21 · 1391 阅读 · 1 评论 -
Java for Web学习笔记(一二八)映射(4)OneToMany和ManyToOne
OneToMany和ManyToOne是更为常见的例子。如果A和B的关系是OneToMany,则B和A的关系就是ManyToOne。小例子我们继续前面书的例子,增加书评表。一本书可以有多条书评,一条书评对应一本书。CREATE TABLE Book ( Id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Book...原创 2018-07-31 14:17:54 · 1456 阅读 · 0 评论 -
Java for Web学习笔记(一二七)映射(3)OneToOne
OneToOneEntityA和EntityB是一对一的关联关系。这在实际中较少使用到。如果某个Entity具有上百个属性,我们可能会将某些属性分别放入子entity中另外存放。有点似列式数据库(如HBase)。用于属性很多,属性可以归类,很可能会有新增属性的情况。小例子CREATE TABLE Book ( Id BIGINT UNSIGNED NOT NULL AUTO_...原创 2018-07-30 11:52:32 · 788 阅读 · 0 评论 -
Java for Web学习笔记(一二六)映射(2):自定义类作为Entity属性
说明在之前的学习中,表格的一列对应Entity的一个属性。数据库表格的列都是比较简单的类型,由此也限制了属性也只能是简单的类型。本文将学习利用@Embeddable 实现多个类映射到复杂类型。多个列映射到类数据表格结构:CREATE TABLE `Person` ( `PersonId` bigint(20) unsigned NOT NULL AUTO_INCREMENT,...原创 2018-07-18 17:37:45 · 1316 阅读 · 1 评论 -
Java for Web学习笔记(一二五)映射(1):再谈converter
我们在《Java for Web学习笔记(一零八):再谈Entity映射(1)数据转换》中已经给出了通过转换器将数据库列的信息和指定类属性进行转换的例子。原生JDBC的时间日期转换JDBC的版本我们原来使用的mysql-connector-java-5.1.x支持多个JDBC的版本,我们可以通过下面的原生jdbc代码来检查当前使用的版本:try(Connection conn...原创 2018-07-17 16:26:47 · 2877 阅读 · 0 评论 -
Java for Web学习笔记(一二四):搜索(6)Lucene和Hibernate search
LuceneLucene是很强大的检索工具,Hibernate Search将lucene core和JPA/Hibernate ORM结合起来,当我们通过JPA添加或者修改数据时,自动在Lucene中index了entity,在检索时采用lucene core搜索引起进行搜索,并返回JPA对象实体。<dependency> <groupId>org.hibern...原创 2018-05-29 16:59:58 · 705 阅读 · 1 评论 -
Java for Web学习笔记(一二三):搜索(5)MySQL全文索引(下)
小例子我们在表格Ticket和TicketComment中加入了fulltext key。小例子在Ticket的Subject或Body,以及在TicketComment的Body检索内容,按分页方式显示出来,同时显示关联分数,并按关联分数降序排列。 -- Ticket中队Subject和Body这两列进行全文检索 FULLTEXT KEY `Ticket_Search` (`Subject`,...原创 2018-05-24 17:22:37 · 912 阅读 · 0 评论 -
Java for Web学习笔记(一二二):搜索(4)MySQL全文索引(上)
全文索引全文索引存储在索引数据中的词频和所在记录,频率越高,权重越低,用过一定的算个给出相关性评分(relevance score)。MySQL的MyISAM和InnoDB支持全文检索,但要注意: InnoDB在版本5.6.4才开始提供全文索引 虽然语法一样,但MyISAM和InnoDB在实现和算法是不同的,它们之间的相关性评分是不具备可比性,即不要用一个InnoDB表的相关度值和一个MyIASM...原创 2018-05-24 16:28:33 · 820 阅读 · 0 评论 -
Java for Web学习笔记(一二一):搜索(3)JPA的动态条件搜索(下)
例子的具体实现仓库的实现使用spring data,增加自定义接口SearchableRepository,具体如下:public interface PersonRepository extends CrudRepository<Person, Long>, SearchableRepository<Person>{}public class PersonReposit...原创 2018-04-15 20:53:27 · 785 阅读 · 0 评论 -
Java for Web学习笔记(一二零):搜索(2)JPA的动态条件搜索(中)
通用的检索定义可以获得Predicate[]的SearchCriteriaSearchCriteria: 单个条件Criterion的集合SearchCriteria是单个条件Criterion的集合List<Criterion>/*代码很简单,也很有趣。由于List<T>是一个接口,必须有具体的实现,例子采用了ArrayList<T>,但我们希望只开放List...原创 2018-04-15 20:50:09 · 998 阅读 · 0 评论 -
Java for Web学习笔记(一一九):搜索(1)JPA的动态条件搜索(上)
关于搜索数据库中的index需要平衡考虑: 索引会使查询更快 索引会使持续化更慢这需要我们具体个例具体衡量。 一般来讲95%的请求都应还有index,多个条件的请求,必须有一个带有index。 LIKE的比对中不应将通配符方在前面,这会引发全局扫描,如果非要这样,应必须带有其他index的条件。 OR的效率没有AND的高 待用index的条件应该放置在前面 唯一约束提供检索效率,UNIQUE KE...原创 2018-04-14 22:02:46 · 514 阅读 · 0 评论 -
Java for Web学习笔记(一一八):【篇外】Soap client
使用Eclipse自动生成Soap Client的代码在项目按右键,选择New -> Other ->Web Services -> Web Service Client,进入向导。加入自有代码,例如加入Envelope Header在xxxxStub.java文件相应的方法中加入:public com.example.api.ApiStatus.EchoResponse ech...原创 2018-04-11 21:33:30 · 4507 阅读 · 1 评论 -
Java for Web学习笔记(一一七):Spring Data(5)分页例子(下)
jsp代码下面是代码的片段,导读如下: 显示页序号:comments.totalPages是总页数,链接格式为/ticket/view/${ticket.id}?paging.page=xxx&paging.size=xxxx,paging.page和paging.size或转换为controller方法中的Pageable参数,如果没有采用缺省的 显示该页内容,存放在comments.c...原创 2018-03-11 12:45:14 · 487 阅读 · 0 评论 -
Java for Web学习笔记(一一六):Spring Data(4)分页例子(上)
例子说明在例子中,我们将学习如何分页显示用户的评论。加入spring data引入jar包加入spring data在pom中引入<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId>...原创 2018-03-11 12:42:36 · 830 阅读 · 0 评论 -
Java for Web学习笔记(一一五):Spring Data(3)配置
使用XML来配置之前为了让代码跑起来,我们已经通过Java代码对Spring Data进行了配置。再此,我们将进一步学习,包括XML方式。XML配置涉及两个namespace: Spring Data Commons,http://www.springframework.org/schema/data/repository,下面案例中前缀采用data Spring Data JPA(对Common...原创 2018-03-11 12:28:51 · 938 阅读 · 0 评论 -
Java for Web学习笔记(一一四):Spring Data(2)仓库接口
查询方法CrudRepository中只定义了通过主键查询的方式,这显然不能满足需求。Spring提供了查询方法来解决这样问题。查询方法包括: find...By get...By read...By将返回单个结果T,或者多个结果Iterable<T>, List<T>, Collection<T>,Page<T>。下面是例子:public inte...原创 2018-03-11 12:15:56 · 604 阅读 · 0 评论 -
Java for Web学习笔记(一一三):Spring Data(1)何为Spring Data
CRUD并不足够在之前学习中,使用了通用仓库接口GenericRepository,并通过GenericBaseRepository,GenericJpaRepository来具体实现,实现上对于CRUD而言,这类的实现大同小异,此外,我们还需要根据UNIQUE KEY或者KEY去进行查询,而不仅仅使用primary key,还有根据多个条件去进行查询或者检索,对返回的结果进行分页等等。Gener...原创 2018-03-11 12:09:34 · 423 阅读 · 0 评论 -
Java for Web学习笔记(一一二):再谈Entity映射(5)原生SQL和isolation
缘由我们在动态表格中使用了原生SQL,而在之前,我们讨论了非原生(Entity可以和表格明确对应),在两个事务同时写操作某个数据时,在isolation = Isolation.REPEATABLE_READ时,出现脏读情况是会报告org.springframework.dao.DataIntegrityViolationException的异常。但是原生的情况会有不同。小例子在事务中依次处理: ...原创 2018-03-02 12:08:43 · 892 阅读 · 0 评论 -
Java for Web学习笔记(一一一):再谈Entity映射(4)动态表格创建
如果这个不确定表格也需要我们的war来创建,如何实现。create table的原生SQL,entityManager是无法执行的,因为这不是可以回滚的事务。这种情况,我们需要: 捕获表格不存在的异常 从原始的Connection中实现表格创建。获取Connection能否从EntityManage中获取Connection依赖于JPA的具体实现,Eclipse的是支持,但是Hibernate不支...原创 2018-02-24 08:59:17 · 984 阅读 · 0 评论 -
Java for Web学习笔记(一一零):再谈Entity映射(3)动态表格
在某些场景中,需要使用动态表格,例如表格名字为abc_f(x),其中f(x)为变化后缀,可能是基于时间,也可能是基于用户名,基于ip地址或者别的什么计算出来的。小例子准备表为Event_<年>,data里面存放一个json的复杂结构List<String>,而这种复杂结构将对代码产生影响,后面详细讨论。CREATE TABLE `Event_2018` ( `id` b...原创 2018-02-24 08:49:46 · 775 阅读 · 0 评论 -
Java for Web学习笔记(一零九):再谈Entity映射(2)Entity的继承
我们先讨论一种简单的情况,多个已知的table具有相同的schema,能否映射到同一个Entity中。然后在下一学习讨论一种复杂的情况,我们在运行中可能会动态建立表格,这些表格具有相同的schema,如果使用JPA?假设test_a,test_b和test_c表格具有相同的表格结构,即schema相同,我们不能将其映射到同一个entity中,因为每个entity类都和一个table具体映射。如果我...原创 2018-02-24 08:39:27 · 995 阅读 · 0 评论 -
Java for Web学习笔记(一零八):再谈Entity映射(1)数据转换
timestamp或datetime的匹配存放毫秒在数据库中缺省的精度为秒,如果需要存放毫秒甚至更好,可以如下:CREATE TABLE Ticket ( TicketId BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, UserId BIGINT UNSIGNED NOT NULL, Subject VARCHAR(255) ...原创 2018-01-29 20:09:58 · 790 阅读 · 0 评论 -
Java for Web学习笔记(一零七):Spring框架中使用JPA(7)密码和BCrypt
密码安全存放密码安全有两个方面:用户密码传递的安全性,可以使用https来保护,也有将密码进行哈希(例如MD5)后进行传递的(复杂一点的,密码是参与哈希,还包含一些动态参数,例如时间戳等进行salt),或者两者结合起来数据库密码存储的安全性,一旦被拖库,或者别的被黑,仍能安全保护好用户的密码。目前,一般可采用BCrypt加密方式,我们绝不能将密码的明文,或者经过弱哈希(如MD5和S原创 2018-01-29 20:05:09 · 1606 阅读 · 0 评论 -
Java for Web学习笔记(一零六):Spring框架中使用JPA(6)Isolation和C3P0(下)
使用hibernate-c3p0的isolation设置我们前面学习的方式,都是先设置datasource,然后在JPA实现中关联该数据源。hibernate提供了hibernate-c3p0,在提供entityManagerFactoryBean的时候进行数据源的设置,实际上采用xml文件配置[1],很多都是这种方式,只不过我们采用代码方式实现。pom.xml的设置,将将hibernat原创 2018-01-28 17:14:22 · 1461 阅读 · 1 评论 -
Java for Web学习笔记(一零五):Spring框架中使用JPA(5)Isolation和C3P0(上)
何为事务的isolationisolation对于数据的一致性很重要。网上有很多介绍,推荐阅读:MYSQL官网 14.5.2.1 Transaction Isolation LevelsHibernate Tutorial 20.7.2 Transaction Isolation Levels一般而言,如果使用READ_UNCOMMITTED,这适合于只读的表格,大家读取同原创 2018-01-28 17:06:34 · 721 阅读 · 1 评论 -
Java for Web学习笔记(一零四):Spring框架中使用JPA(4)Service中使用事务
Spring和JTA的@Transactional标记总体而言,Spring的@Transactional比JTA的@Transactional要强大和更灵活。@javax.transaction.Transactional,可以配置参数:dontRollbackOn:不触发回滚的异常黑名单roolbackOn:异常白名单将覆盖缺省的rollback规则value:什么时候和如何创原创 2017-12-30 16:45:21 · 1948 阅读 · 0 评论 -
Java for Web学习笔记(一零三):Spring框架中使用JPA(3)JPA仓库
小例子我们使用之前JPA小例子的数据库,有三个表Authors,Books和Publishers。先对表Author进行数据读写,读写无非就是增删改查,也就是CRUD。之前,我们已经如何进行Entity和数据库表格的对应,在此略过。创建仓库接口public interface AuthorRepository { IterableAuthor> getAll(); Author原创 2017-12-30 16:41:32 · 1083 阅读 · 0 评论