为什么我们要用Lucene?
Lucene 仅仅是在网站内部进行文本的搜索,我们也可以sql来进行站内的搜索。
sql搜索和Lucene对比:
关于通过PDF.JS显示本地PDF文件和跨域获取文件
1.去官网下载pdf.js。
其中的view.html不要改,直接放在jsp里。
view.js是渲染pdf,下面的方法需要注意的是路径要对。之前文件流已获得,但是渲染不出来就是因为这里路径不对。
1 | function configure(PDFJS) { |
2.修改viewer.js
var DEFAULT_URL = ‘compressed.tracemonkey-pldi-09.pdf‘ 里面是PDF的路径删除该变量定义;
3.ajax调用
写在view.js开头
1 | var path = $(“base”).attr(“href”); |
方法一:
1.本地文件流后台处理,只用了web项目,没有任何框架
1 | public void pdfStreamHandeler(HttpServletRequest request, HttpServletResponse response) { |
方法二:跨域(从云服务器下载)设计知识点(https://www.alibabacloud.com/help/zh/doc-detail/32016.htm?spm=a3c0i.o32014zh.b99.108.e7882928dW9FL)
1 | @RequestMapping(value = “/pdf”, method = RequestMethod.GET) |
其中HttpURLConnHelper是一个方法类,使用了别人的工具类
QUARTZ——SPRING和QUARTZ集成详解(三)
步骤一:使用Maven进行Jar包的管理,使用的jar包如下:
1 | <!– quartz 的jar –> |
步骤二:任务job
1 | public class HelloWorldJob implements Job{ |
步骤三:
启动程序
1 | public class HWTest { |
步骤四:配置文件spring_quartz.xml
(1):配置文件
1 | <?xml version=”1.0″ encoding=”UTF-8″?> |
文件流分步读文件
文件流分步读取(可以结合印象笔记来看)
1.将文件全部读出来,记录一个最大值
1 | String file_name = “C:\\Users\\Administrator\\Desktop\\365函数转换\\365函数转换\\HC_170727HK030507_20171025231202.ECD”; |
2.这里就是一直对读出的文件进行操作(不要多余最大值)
1 | for (int i=0; i < readLength;i++) { |
- 最后写进入流里,只要不关闭,就一直写
1 | { |
文件流的使用(上传图片例子)
1.文件流的使用
1.1读取文件,转化成流
获取当前路径,创建file,把file写进流里,建立byte数组,直接写进流里
1 | file file =new File(String path); |
获取文件的长度
直接写进byte数组
1 | byte[] ecgByte = new byte[datLength]; |
上传图片
看工具包upserver
QUARZ—-简单入门DEMO(二)
1 | <!– quartz –> |
步骤二:
1 | public class RAMQuartz { |
说明:
1 | <!– 指定job的名称 –> |
SOURTREE和GITLAB結合
1:註冊個sourtree
2:登錄gitLab
3:生成密匙
https://www.cnblogs.com/xiuxingzhe/p/9303278.html
4:工具-選項
設置用戶名 電子郵箱
設置ssh客戶端配置:
ssh密匙:.ppk
ssh客戶端
5:這裡說的是gitLab設置了密匙,如果沒有就不要設置了
特別說明一下:
大家在使用mac时候,很多时候发现,svn上不能使用window用惯的ppk文件,需要转换。以下介绍windows转换过程:
条件:1、要有puttygen.exe 2、要有一个ppk文件
方法,
1、双击击puttygen.exe ->conversions ->import Key
2、conversions ->exportOpenSSH
這裡導入的ppk,就是第四點說的
說明緩存雪崩
我們一般說的是線程等待。
例子:(以b為主)
1:a等待b,b等待c,c又等待d.
2:b是執行自己的應用,但是報錯了,導致下面的程序沒法走,所以又在等待。
主要發佈在:
1:查詢數據庫
2:redis集群崩潰
3:查詢mysql和訪問redis最大值,最後就佔用線程,最後沒法預留。
解決:
1:雙機部署,分開兩個機房
2:進行數據庫同步數據
具體發生了:
對 緩存 使用了熔斷(就像初中說的自動斷電保險絲,比如當電壓太高了,進行自動斷電,保護因為電流燒掉),降級處理。
熔斷(springcloud里的)
當出現線程錯誤,然後就開始在等待,有個規定的時間,如果超過90秒沒有像服務器註冊,那麼註冊中心就認為這個服務不可用。
然後就開啟熔斷,然後也把和這個相關的程序進行降級,減少他的訪問次數。如果當他正常,就關閉熔斷。
對原服務進行限流,資源隔離。
處理后:
Redis數據備份和回復
快速緩存預熱
REDIS–另一种写法REDISTEMPLATE
参考链接:https://www.cnblogs.com/jifeng/p/4676863.html
放进去一个key_values,但是实际中作用不大
下面是一个set例子:这个模板和jedis是一样的。如果有不明白的,可以看菜鸟教程的命令
测试类放入工具包
接口:
1 | public interface RedisService { |
实现类:
1 | @Service(value = “redisService”) |
测试类:
1 | ApplicationContext app = new ClassPathXmlApplicationContext(“ApplicationContext.xml”); |
xml配置文件:
1 | <?xml version=“1.0” encoding=“UTF-8”?> |
HIBERNATE5–常用方法面试题
1.get和load()区别是什么?
get和load的最大区别是,如果在缓存中没有找到相应的对象,get将会直接访问数据库并返回一个完全初始化好的对象,而这个过程有可能会涉及到多个数据库调用;而load方法在缓存中没有发现对象的情况下,只会返回一个代理对象,只有在对象getId()之外的其它方法被调用时才会真正去访问数据库,这样就能在某些情况下大幅度提高性能。
2.Hibernate中save、persist和saveOrUpdate这三个方法的不同之处?
save()只能INSERT记录,但是saveOrUpdate()可以进行 记录的INSERT和UPDATE。还有,save()的返回值是一个Serializable对象,而persist()方法返回值为void。你还可以访问 save、persist以及saveOrUpdate,找到它们所有的不同之处。
3.Hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗?
SessionFactory就是一个用于创建Hibernate的Session对象的工厂。SessionFactory通常是在应用启动时创建好的,应用程序中的代码用它来获得Session对象。作为一个单个的数据存储,它也是 线程安全的,所以多个线程可同时使用同一个SessionFactory。Java JEE应用一般只有一个SessionFactory,服务于客户请求的各线程都通过这个工厂来获得Hibernate的Session实例,这也是为什么SessionFactory接口的实现必须是线程安全的原因。还有,SessionFactory的内部状态包含着同对象关系影射有关的所有元数据,它是 不可变的,一旦创建好后就不能对其进行修改了。
4.Hibernate中的Session指的是什么? 可否将单个的Session在多个线程间进行共享?
Session代表着Hibernate所做的一小部分工作,它负责维护者同数据库的链接而且 不是线程安全的,也就是说,Hibernate中的Session不能在多个线程间进行共享。虽然Session会以主动滞后的方式获得数据库连接,但是Session最好还是在用完之后立即将其关闭。
2018年的学习目标
2018年已经是出校门学习java的差不多一年左右了,自己在公司熟悉业务流程和写代码已经有些日子了,为了更多的 money,要努力学习。
大神的脚步走的很快,我们是只能算个码农,为此不努力不行。只能跟着大神边学习,边工作。
2018学习目标如下:
1.学习spring,hibernate,mybaits,springmvc的原理。
2.学习微信支付,支付宝支付等,要是可以,尽量动手做。
3.设计模式的学习,java10特性的学习。
4.springcloud,springboot能够知道如何使用,配置
5.学习高并发,分步式的知识。(以淘淘商城为例,掌握原理和运用)
争取在2018年工资翻一翻,跟着大神走,不会错。。。。。。。。。。。。。。。。。。。。。。。。。。。
详解 RESTTEMPLATE 操作
RestTemplate定義了36個Rest資源交互的方法,其中的大多數都對應于http的方法。
delete() 在特定的URL上对资源执行HTTP DELETE操作
exchange()
在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中
映射得到的
execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象
getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象
getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象
postForEntity()
POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得
到的
postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象
headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头
optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
postForLocation() POST 数据到一个URL,返回新创建资源的URL
put() PUT 资源到特定的URL
getForEntity說明:
基本的形式
1 | /** |
改變的:
1 | @RequesyMapping(“getForEntity”) |
有參數的:
1 | @RequestMapping(“getForEntity/{id}”) |
參數多的情況:
1 | @RequestMapping(“getForEntity/{id}/{type}”) |
getForObject 和 getForEntity 用法几乎相同,指示返回值返回的是 响应体,省去了我们 再去 getBody() .getForObject都是service是什麼類型,就是獲取的是什麼類型。
測試getForObject
1 | public List<UserEntity> getAll(){ |
将对象存在REDIS序列化
redis不支持直接将java对象存储到数据库中,所以需要将java对象进行序列化得到字节数组,然后将字节数组存在redis中,需要数据时候就从redis中取出字节数组,再经过反序列化将自己数组转化成对象使用。
下面的反序列化和序列化工具类
1 | public class SerializeUtils { |
下面简单测试:
1 | //获取链接 |
HIBERNATE配置详细介绍
1 | <!–********************************************配置hibernate********************************************–> |
HIBERNATE4—CURD工具类
下面是个简单的例子
1 | package com.wqc.util; |
REDISUTILS说明
1 | /** |
JAVA连接REDIS缓存数据库
3.2.1 导入JAR包
commons-pool2-2.3.jar
jedis-2.7.0.jar
3.2.2 单实例连接
代码:
1 | package com.itheima.redis; |
3.2.3 连接池连接
代码:
1 | package com.itheima.redis; |
3.2.4 编写JedisUtil工具类
代码:
1 | package com.itheima.redis.service; |
目前为止,我们用过的工具类很多了
04 Redis实战之查询所有省份(重点)
代码:
1 | <%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%> |
1 | package com.itheima.redis.web; |
HIBERNATE3–SESSION接口的比较
两种session对象方式的区别
1.getcurrentSession
1.1 获取的对象 无论执行多少次方法,只要是在同一个线程中,获取的是同一个session对象
1.2 对象的关闭 自动关闭session,无需手动关闭
1.3 环境的注册 需要注册session的运行环境
1.4 查询对事物的支持 需要在事务下支持
2.openSession
2.1 获取的对象 每执行一次方法,获取的是新一个session对象
2.2 对象的关闭 手动关闭session对象
2.3 环境的注册 不需要注册session的运行环境
2.4 查询对事物的支持 不需要在事务下支持
PARAMETERIZEDTYPE获取JAVA泛型参数类型
ParameterizedType获取java泛型参数类型
前言
这两天在看以前写的ssh项目时,遇到一个问题就是封装的BaseDaoImpl抽象类,构造方法里面是这样写的
1 | Class<T> clazz; |
当时看到还真不知道里面到底是什么意思,记得以前写时是参考网上写的 ,于是我只有再去网上找答案了,一番搜索终于知道了。
1 | ParameterizedType |
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type,然后将其转换ParameterizedType。
getActualTypeArguments()
返回表示此类型实际类型参数的 Type 对象的数组。[0]就是这个数组中第一个了。简而言之就是获得超类的泛型参数的实际类型。
看意思可能不是很懂,我们直接看例子
1 | package com.chen.demo; |
我们再看打印结果
1 | getClass() == class com.chen.demo.ClassDemo |
从上面结果我们可以总结如下,通过ParameterizedType获取泛型参数Class类型,然后我们就可以通过Class干一系列事情了。。。。。
比如数据库基本CRUD的工具类,直接看工具代码如下:
1 | public abstract class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> { |
工具类用到了Spring的orm模块,其次我们最重用的就是可以通过ParameterizedType封装通用的CRUD工具类,在实际的项目中,我们让不同的业务模块继承至该工具类,然后就可以直接使用其CRUD方法了。
THYMELEAF
hymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎,类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。
与其它模板引擎相比,Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。
Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
一:在html页面中引入thymeleaf命名空间,即,此时在html模板文件中动态的属性使用th:命名空间修饰 。
在其它标签使用 th:语法的前提
这样才可以在其他标签里面使用th:这样的语法.这是下面语法的前提.
二:变量表达式(获取变量值)
获取变量
分析:
1.可以看出获取变量值用$符号,对于javaBean的话使用变量名.属性名方式获取,这点和EL表达式一样2.它通过标签中的th:text属性来填充该标签的一段内容,意思是$表达式只能写在th标签内部,不然不会生效,上面例子就是使用th:text标签的值替换p标签里面的值,至于p里面的原有的值只是为了给前端开发时做展示用的.这样的话很好的做到了前后端分离.意味着p标签中的内容会被表达式#{name}的值所替代,无论模板中它的内容是什么,之所以在模板中“多此一举“地填充它的内容,完全是为了它能够作为原型在浏览器中直接显示出来。
3.访问spring-mvc中model的属性,语法格式为“${}”,如${user.id}可以获取model里的user对象的id属性
4.牛叉的循环<li th:each=”book : ${books}” >
三:URL表达式(引入URL)
1.引用静态资源文件(CSS使用th:href,js使用使用th:src)
比如CSS和JS文件,语法格式为“@{}”,如@{/scripts/jquery-3.1.1.js}会引入/static目录下的/scripts/jquery-3.1.1.js文件
引入URL
2.href链接URL(使用th:href)
引用href的URL
分析:
1)最终解析的href为:
/seconddemo/
/seconddemo/usethymeleaf?name=Dear 相对路径,带一个参数
/seconddemo/usethymeleaf?name=Dear&alis=Dear 相对路径,带多个参数
/seconddemo/usethymeleaf?name=Dear&alis=Dear 相对路径,带多个参数
/seconddemo/usethymeleaf/Dear 相对路径,替换URL一个变量
/seconddemo/usethymeleaf/Dear/Dear 相对路径,替换URL多个变量
2)URL最后的(name=${name})表示将括号内的内容作为URL参数处理,该语法避免使用字符串拼接,大大提高了可读性
3)@{/usethymeleaf}是Context相关的相对路径,在渲染时会自动添加上当前Web应用的Context名字,假设context名字为seconddemo,那么结果应该是/seconddemo/usethymeleaf,即URL中以”/“开头的路径(比如/usethymeleaf将会加上服务器地址和域名和应用cotextpath,形成完整的URL。
4)th:href属性修饰符:它将计算并替换使用href链接URL 值,并放入的href属性中。
5)th:href中可以直接使用静态地址
四:选择或星号表达式
表达式很像变量表达式,不过它们用一个预先选择的对象来代替上下文变量容器(map)来执行*{customer.name}
被指定的object由th:object属性定义:<div th:object=”${book}”>
……<span th:text=”*{title}”>…</span>
……</div>
分析:
1)如果不考虑上下文的情况下,两者没有区别;星号语法评估在选定对象上表达,而不是整个上下文,什么是选定对象?就是父标签的值。上面的{title}表达式可以理解为${book.title}。(父对象)
2)当然,美元符号和星号语法可以混合使用
小插曲:三和四的变量表达式、URL表达式所对应的属性都可以使用统一的方式:th.attr=“属性名=属性值”的方式来设置,参考第“七.设置属性值”部分
五:文字国际化表达式
文字国际化表达式允许我们从一个外部文件获取区域文字信息(.properties),用Key索引Value,还可以提供一组参数(可选).
#{main.title}
#{message.entrycreated(${entryId})}
可以在模板文件中找到这样的表达式代码:
1 | <table> |
六:表达式支持的语法
1.字面(Literals)
2.文本操作(Text operations)
3.算术运算(Arithmetic operations)
4.布尔操作(Boolean operations)
5.比较和等价(Comparisons and equality)
6.条件运算符(Conditional operators)
示例一:
1 | <h2 th:text=”${expression} ? ‘Hello’ : ‘Something else'”>/h2> |
示例二:
1 | <!– IF CUSTOMER IS ANONYMOUS –> |
7.循环
渲染列表数据是一种非常常见的场景,例如现在有n条记录需要渲染成一个表格或li列表标签
该数据集合必须是可以遍历的,使用th:each标签
分析:
循环,在html的标签中,加入th:each=“value:${list}”形式的属性,如可以迭代prods的数据
又如带状态变量的循环:
循环加状态变量
状态变量
默认生成一个名为“变量名Stat”的状态变量
利用状态变量判断:
状态变量判断
七.设置属性值
- th:attr 任何属性值,语法格式:th:attr=”属性名=属性值,[属性名=属性值]”
属性值如果是使用表达式的话:通常有URL表达式@{}和变量表达式${}
但此标签语法不太优雅
示例:
1 | th:attr=”action=@{/subscribe}”//当然也可以直接使用th:action |
设置多个属性在同一时间 有两个特殊的属性可以这样设置: th:alt-title 和 th:lang-xmllang
th:src=”@{/images/gtvglogo.png}” th:alt-title=”#{logo}”
2.前置和后置添加属性值 th:attrappend 和 th:attrprepend
主要对class和style两个属性
class=”btn” th:attrappend=”class=${‘ ‘ + cssStyle}”
转换后:class=”btn warning”
3.还有两个特定的添加属性 th:classappend 和 th:styleappend
与上面的attrappend功能一样
class=”row” th:classappend=”${prodStat.odd}? ‘odd’”
转换后:奇数行class=”row odd”,偶数行class=”row”
八:内嵌变量Utilities
为了模板更加易用,Thymeleaf还提供了一系列Utility对象(内置于Context中),可以通过#直接访问。
dates : java.util.Date的功能方法类
calendars : 类似#dates,面向java.util.Calendar
numbers : 格式化数字的功能方法类
strings : 字符串对象的功能类,contains,startWiths,prepending/appending等等
objects: 对objects的功能类操作
bools: 对布尔值求值的功能方法
arrays:对数组的功能类方法
lists: 对lists功能类方法
sets
maps
……
代码示例:
1 | ${#dates.format(dateVar, ‘dd/MMM/yyyy HH:mm’)} |
八:thymeleaf布局