留个存档,哒哒哒哒

好久之前写的东西了,怀念,留个存档,有幸被大佬看到的话看个乐呵就好:

Mybatis使用的N种方法.txt

mybatis在ssm框架下配置的两种方式:
一种是直接在标签下的environments标签配置,方便快速:

// 别名




// 事务控制
// 自带默认连接池






// sql代码所在的xml文件,映射到spring容器中
<mappers>
     <mapper resource="com/wb/mybatis/models/Student.xml" /> // 配置单个xml
     <mapper name="com.xyx.dao"/> // 同时配置多个xml
</mappers>

如果要使用Dao层接口要获取查询结果的话:

// Dao层接口所在包
// 标识为一个Dao层接口,可选项,这里是使用一个自定义的注解
<property name=“sqlSessionFactoryBeanName” value=“sqlSessionFactory” / >
// 提供sqlSession工厂 ,默认beanName为sqlSessionFactory,如果在创建sqlSesssionFactory的
// 时候id为sqlSessionFactoty,可省略该属性

一种是手动配置:
首先创建数据源:
// 这里使用DBCP连接池
< property name=“url” value=“这里填数据库连接url”/>
< property name=“username” value=“数据库用户名”/>
< property name=“password” value=“数据库密码”/>
。。。。。

创建sqlSessionFactory :

< property name=“configLocation” value=“classpath:mybatis-config.xml”/>
// 读取配置文件,可选项
< property name=“mapperLocations” value=“classpath:com/fh//dao/.xml”/>
// 配置xml文件的映射路径,可选项

// 配置数据源,ref为数据源bean的id

配置Dao层接口映射;如果直接获取sqlSessionFactory的实例,创建sqlSession,可直接调用xml映射的实例,便不需要
经过Dao层接口,比如在测试场景下会出现这种情况
具体代码:参考第一种方法

总结:其实两种方法内核是一种的,都是先创建数据源,再创建sqlSessionFactory,spring容器通过sqlSessionFactory
实例获取sqlSesison进而连接数据库;第一种方法是mybatis框架自动帮你配置,第二种是手动配置

关于爬虫一点点简单感想.txt

首先是有关爬虫的概念和使用目的;

就我个人理解而言,爬虫就是用机器模拟人工完成浏览器请求的一系列操作,因为机器几乎不会出错的特性加上不知疲倦,
效率要高上几千上万倍
人能干的爬虫一样能干,现在爬虫不能干的是技术暂时达不到,以后一定能干
使用目的就很简单了,为了节省精力,并获取更多数据

java原生的模拟请求发送就是java.net.url包类的一系列类,其中URL类是核心类,最简单的模拟请求发送的操作
就是new URL().openConnection(),获取连接,然后获取流:
new URL().openConnection().getInputStream()
从字节流获取到服务器的响应;

但是这种方法现在基本不用,一是没办法设置请求头,参数只能靠URL传送,所以现在更习惯引入第三方的包来创建
request请求;
现在java第三方包一般有两种方法创建并发送请求:
一是httpClient:
httpClient,它可以看做模拟客户端,有个好处就是,它可以模拟用户登录之后的状态,在发送完登录请求之后,它可以自动保留下cookie,而
不需要手动设置,CloseableHttpClient实现了httpClient,是我们经常使用的核心类:
一般直接使用工具类创建即可:CloseableHttpClient httpClient = httpClients.createDefault();

创建完模拟客户端之后,便是创建请求
HttpPost,HttpGet,HttpUriRequest 前两者是继承了HttpRequestBase的实现类,分别创建post请求和
get请求;而后者是接口,通过RequestBuilder工厂类调用方法的不同来创建get或者post请求;
HttpPost和HttpGet的用法类似,这里仅介绍HttpPost的用法:
HttpPost的构造方法有两种,可以直接new,或者传入URI(资源标识符类,和URL不一样),或者更直接传入
String类型的url路径
HttpPost post = new HttpPost();
= new HttpPost(new URI(“https://www.baidu.com”));
= new HttpPost(“https://www.baidu.com”);

有了请求路径之后就该设置请求头了,请求头和请求体是一个请求中的关键部分,关于请求的大部分信息都在
请求头中,比如content-type,user-agent,content-position,cookie之类,而请求携带的数据则根据
请求的种类不同,post请求在请求体中,get请求直接就跟随在url路径上;
设置请求头的方法为:
post.addHeader("***","***");

关于携带的数据,通过HttpPost类的方法:
post.setEntity(UrlEncodedFormEntity entity)存入,数据存在于entity中,模拟form表单发送;举个例子:
List list = new ArrayList(); // 用于存放参数key-value的集合
list.add(new BasicNameValuePair(“携带参数的key”,“携带参数的value”));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,“utf-8”)//这里第二个参数的请求的编码集,
一般都是utf-8,或者gbk;如果不是,可以去目标页面上查看

setEntity还可以接受StringEntity类型的实体,这时候携带的参数一般是以json的方式携带的,两种实体的不同点在于
UrlEncodeFormEntity的默认请求类型是表单,数据时转化为name=vlaue&name=value格式发送的,而StringEntity
默认的请求格式为application/json,后端如果不加@RequestBody取不到值,并且最好在maven中加上jackjson包以
使用自定义的StringHttpMessageConverter消息转化器:
StringEntity entity = new StringEntity(“key1=value1&key2=value2”,“utf-8”)
注意,这种方式一般使用在httpget中,post请求发送表单时可能会丢弃这种参数;

设置完请求头和请求实体后,通过httpClient.execute(post)执行,获取CloseableHttpResponse响应,其中
浏览器返回的页面代码存储在getEntity()方法取出的实体中,通过EntityUtils.toString转化为String字符串,如果
有引入JSoup包,可以通过Jsoup.parse(String html) 将字符串转化为document,这样可以便于检索想要的标签;

接口HttpUriRequest的使用方法类似:
HttpUriRequest req = RequestBuilder()
.setUri("") //设置请求路径
.setHeader("","") // 设置请求头
.setHeader("","") // 同上
.setEntity(UrlEncodedFormEntity)/setEntity(StringEntity) //设置实体,类似于HttpPost
.addParamters("","") // 添加参数,post表单请求不可用
.build(); // 创建实例

接下来执行的方法和httpPost类似,就不累述了;

关于爬虫的一些提示:
对于没有反爬机制的页面,一般设置个url就可以直接爬了,麻烦一点的需要模拟客户端类型
就是setHeader(“user-Agent”,"…"),对于没有验证的登录页面,可以直接添加参数即可,httpClient可以
保留cookie,或者可以setHeader(“cookie”,"…"),cookie可以手动登录后浏览器F12查看network,点开请求详情即可;

关于第二种第三放包:
Jsoup,优点是可以直接获取document,不过不想用,不累述;

关于注入新的servlet,listener,filter的两种方式.txt

springBoot注册servlet,filter,listenter:

一般情况下用户不需要手动注册这三种,尤其是dispatchServlet,springboot框架已经帮忙自动装配,但是如果你想
修改一下初始配置,那么就必须要手动了,为此,springBoot提供了三个注册类来帮助用户:

ServletRegistrationBean,FilterRegistraionBean,ServletListenerRegistrationBean;
如同字面意思,servlet注册,过滤器注册,servlet监听器注册;

如果想要修改默认自动装配DispatchServlet的话,可以使用如下方式:
@Bean
public ServletRegistrationBean getBean(DispatchServlet dispatchServlet) {
ServletRegistrationBean registrationBean = new ServletRegistraionBean(dispatchServlet);
registrationBean.addUrlMappings("/*.do") // 拦截url后缀为do的request请求
return registrationBean;
}

修改监听器:
@Bean
public ServletListenerRegistrationBean getlistenerBean(ContextLoaderListener contextLoaderListener) {
ServletListenerRegistrationBean listenerBean = new ServletListenerRegistrationBean(contextLoaderListener);

return listenerBean;
}

上述两种方式都是通过spring容器自动要实例化的dispatchServlet和contextLoaderListener装配到两个方法的参数之
中,然后用户对其进行一定的修改,最后回写到serlvet和监听器中,其中获取和回写完全由spring容器控制,用户只需要
关心业务逻辑部分;

如果用户想要新创建servlet或者过滤器的话,大部分逻辑是相同,不过由于是新创建的servlet或者过滤器,因此方法是
没有参数的,以servlet为例:
@Bean
public ServletRegistrationBean getServletBean() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
// 注册新的servlet
servletRegistrationBean.setServlet(new ViewstatServlet());
// 新的servlet拦截路径
servletRegistrationBean.addUrlMappings("/sys*");
// 初始化参数,少量参数可以直接使用addInitParamter("","")方法存入
// 大量参数可以先创建一个HashMap<String,String>,将参数存入hashMap中,然后
//直接setInitParamters(HashMap)进Serlvet
servletRegistrationBean.addInitParamter(“username”,“admin”);
servletRegistrationBean.addInitParamter(“password”,“admin”):
HashMap<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put(“timeout”,“60”);
paramsMap.put(“maxActiveLink”,“100”);
paramsMap.put(“minActiveLink”,“10”);
servletRegistrationBean.setInitParamters(paramsMap);
return servletRegistrationBean;
}

注册新的过滤器:
public class myFilter implements Filter {

public void doFilter(ServletRequest arg0,ServletReponse arg1,FilterChain arg2) {
	。。。。。。。。。。。。
	arg2.doFilter(arg0,arg1);  // 传递到下一个过滤器,如果有的话
}

}

@Bean
public FilterRegistrationBean getBean() {
FilterRegistrationBean bean = new FilterRegistraionBean();
// 设置过滤器
bean.setFilter(new myFilter());
// 设置过滤器名称
bean.setName(“nameFilter”);
// 设置过滤路径
bean.addUrlPatterns("/*");
// 设置优先级,越小优先级越高
bean.setOrder(1);
retun bean;
}

除此之外,springboot也提供了注解的方式来简化操作以上部分,但是内核是一样的
@WebServlet(name="",urlPatterns="")
直接注解到Servlet的class上即可

@WebListener
同上

@WebFilter(filterName="",urlPatterns="")
同上,过滤器在这方面有个小问题,它无法设置过滤器的优先级,所以如果对过滤器的执行顺序有要求的话建议
使用注册bean

最后在启动类加上@ServletCompentScan 进行扫描

一点点随笔.txt

通过a标签的 target=‘_blank’打开新页面时,在微软的edge浏览器上window.opener获取不到父页面的
对象,但是在Chrome浏览器正常操作,
通过window.open(url)打开则两者均能获取,那么最好使用window.open()

$(“标签名[属性名=‘给定值’]”) 选择所有属性名为给定值的特定标签集合
( " 标 签 名 [ 属 性 名 ("标签名[属性名 ("[=‘给定值’]") 选择所有属性名以给定值结尾的特定标签集合
$(“标签名[属性名^=‘给定值’]”) 选择所有属性名以给定值开头的特定标签集合

页面定位常用的四种类型:static,relative,fixed,absolute,sticky
static:默认属性,他按正常的工作流位置放置,同时也不会受到left,right,top,bottom属性的影响;
relative:顾名思义,相对,就是相对于正常工作流位置进行定位,会受到left,right,top,bottom属性的影响;
fixed:相对于整个窗口定位,可以覆盖其他元素,相当于脱离了工作流,和float类似,就算滚动左右上下滑动条,
它相对于窗口的位置也不会改变(但仍然会受到frame的影响)
absolute:它类似于fix,不过它相对的不是窗口,而是离它最近的被定位的祖先元素,如果祖先元素没有position属性,
那么它也相对于窗口定位,但是滚动条可以影响到它
sticky:粘性定位,跟名字一样,它会在relative和fixed状态下切换,当初始化时,它的状态为relative,一旦滚动滚动条
让元素离开窗口时,如果在对应的方向设置top,left,bottom,right属性,那么它将转化为fixed状态,不会被窗口遮住,
类似于黏在边缘,不过这个属性需要浏览器的支持,IE/edge15以上才能支持

js获取event对象
arguments,代表当前触发事件的所有参数
arguments.callee代表当前的函数体
arguments.callee.caller自然就代表触发当前函数的事件了
比如点击事件,arguments.callee就代表点击事件的处理逻辑函数,而arguments.callee.caller代表onclick事件
则,event=arguments.callee.caller.arguments[0];
tip:不过在ie中可以直接用event获取,火狐则不行

ajax的contenType属性是为了设置请求头类型,dataType是预期返回值的类型

关于form标签表单提交,要控制点击后是否提交表单有两种方法,一种是在form标签上加上onsubmit事件,当你点击
类型为submit的按钮提交表单时,如果需要提交,返回true,如果不想提交,返回false;
或者在类型为submit的按钮上加上οnclick=“return 事件名()”,效果跟第一种方法一样,注意的是,如果这两种方法
同时使用,且方法相同,那么最终这个方法只会调用一次,如果方法名不同,则两个方法都会调用;如果你是手动使用
form.submit()代码提交表单,那么以上两种方法都是无效的,表单一定会提交过去

防止重复提交的4种方法:
1)在js中拦截:当表单提交后,阻止表单再次提交,比如在页面上设置一个hidden属性的input,当input值等于
预期值时,允许提交,然后将input值修改;当重复提交时,由于input值与预期值不相符,因此无法提交
2)对数据库的表字段加上唯一性约束:alter table 表名 add unique key 约束名(字段1,字段2,字段3…)
由于唯一性约束的原因,无法重复插入,自然重复提交的请求便会出现异常
3)使用requestID:每次返回页面时,创建一个唯一的requestID值(时间),同时在Session中也存入这个值;当这个值
跟随表单到达后端时,创建一个拦截器验证;具体逻辑可放在拦截器中;至于判断当前是打开页面还是表单提交,可以通过
自定义注解来进行

页面数据下载为Excel:
使用poi包的HSSFWorkbook获取到Excel文件的实例,具体逻辑不计,关键是在返回时,要设定返回类型,设定返回头
的Content-disposition字段,这个字段标识该响应是返回文件,具体是下载还是直接在页面显示出来要看这个字段的
值,当值为“inline;filename=xxxxx.txt”表示在页面上显示这个文件,文件名为filename;当字段值为
“attachment;filename=xxxxx.txt”,标识浏览器下载这个文件,文件名为xxxx.txt
contentType字段的值为“text/explain”,标识文件是txt文件,为"application/vnd.ms-excel" 标识为excel文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值