课程录屏b站链接
课程资料百度网盘链接链接:
提取码:ynx4
文章目录
AOP concepts这一节好好读一读,背下来。读spring作者写的书。
补充
mybatis配置文件
- 核心配置文件
- mapper文件
核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 一个配置文件
配置环境(多个)
事务管理,JDBC,手工管理,spring整合了交给了spring
数据源,四项基本属性。
-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--
每次写完一个Mapper.xml记得引入。
-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
详细配置
http://www.mybatis.org/mybatis-3/zh/configuration.html
settings里面的内容是最多,但是几乎都是不用修改,默认就是最好。
性能控制,交给数据源。
没有生产级别的能力。
要抄袭
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
CRUD的那个配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
mybatis核心知识:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
maven依赖
- 你的配置本身写错了。
- 网络问题
- 查看少了哪个
- 真的少了,关闭项目
- 删除本地仓库里面的目录
- 重新打开项目
- reimport
- 查看少了哪个
- 去中央仓库里面找
lombok
1 添加依赖
2 添加idea lombok 插件
思路不清晰
- 画流程图 推荐使用 draw.io
- 写伪代码
1 我要获取参数
2 参数传递到牟
3 怎么样处理
4 处理该去哪
前面的从处理和语言没关系。
咩有选用什么技术。
mybatis结构不清晰(文件放置在哪)
-
约定俗成
-
maven
-
java代码都应该java文件夹
- 按照业务
- com.alibaba.pay
- model
- mapper
- service
- web/servlet
- com.alibaba.user
- model
- mapper
- …
- com.alibaba.pay
- 按照通用语义
- com.alibaba
- .moldel
- mapper
- UserMapper
- PayMapper
- com.alibaba
- 按照业务
-
所有非java文件在resource下
-
HTTP协议,找官网
找官网:
1 能用谷歌
2 不能用就用必应国际版:https://cn.bing.com/?ensearch=1&FORM=BEHPTB
HTTP协议:
作为开发人员简单了解,网络工程师,必须要精通。
http:协议,取决于协议制定者怎么写,怎么来。
https://tools.ietf.org/html/rfc2616
-
头
- 控制行为
-
body
- 承载信息
-
HTTP状态码
- 2系列
- 3系列
- 4系列
- 5系列
TCP/IP 三卷
配置webservlet,监听器,参数传递(HttpRequest这些对象),
配置webServlet
XML为主?
注解为主?
@WebServlet,只有urlPatterns是重要的。
get post 请求区别?
从HTTP规范来讲,二者仅有一个区别,就是语义。
从表象来讲。
所有的表象的区别都是浏览器本身的限制和get post本身没关系。
监听器属于web规范里面组件,属于servlet。
设计这个监听器目的在于什么?
监听某些东西。
装了个摄像头,只要触发了某个事情,那么这个组件立马工作。
基于事件驱动,类似于,js里面点击事件。
监听器的优先级是最高的,spring也是用监听器来完成上下文初始化。
key=v&k=v&k=v
javaee规范,ee5 ee6 ee7 ee8
servlet完整规范
https://jcp.org/aboutJava/communityprocess/final/jsr369/index.html
做邮件开发
https://jcp.org/en/jsr/detail?id=919
AOP
https://docs.spring.io/spring/docs/5.1.9.RELEASE/spring-framework-reference/core.html#aop
概念,背下来:5.1. AOP Concepts
早期的工作是关于反省机制和元对象协议的;1997年Gregor Kiczales发表了论文《面向侧面的程序设计》(Aspect Oriented Programming)。
https://www.eclipse.org/aspectj/
连接点和切点区别?
代理技术:
JDK代理
cglib
静态代理动态代理
spring XML(两个对象报错)
注册同类型的两个bean
给bean取名,区分一下。
否则spring上下文里面有多个bean满足,它无法确定用哪个。
web重点
HttpServletRequest
HttpServletResponse
servlet编写
有几种方式?
- 实现Servlet接口
- 继承GenericServlet
- 继承HTTPServlet
servlet生命周期
- init
- 如果一个servlet配置过load on start up 那么就会在我们的容器启动之后就完成初始化
- 如果没有配置过load on start up ,就是第一次访问这个servlet的时候完成初始化。
- 如果没有访问过,一辈子不执行
- 并且生命周期里只有一次
- service
- 访问一次执行一次。所以业务逻辑都在这个里面写(已经init)
- destroy
- 容器销毁,它就会执行。它一定会执行吗?
- 如果一个servlet从未初始化,那么它没有机会执行
- 如果一个servlet初始化过,它才可能执行。
- 一个servlet的service方法没有执行过,但是destroy却执行过。
基础案例
url写法
@WebServlet(urlPatterns = "/s1")
-
urlPatterns
-
一定要以/开头
-
第二个匹配规则,谁跟我更像,就和谁匹配。
-
/s1去匹配
/s1
和/* 优先匹配/s1
先精由于后精
/s/a/a
匹配
/s/*/a
/s/a/*
二者都满足,但是/s/a 更优先的匹配,因为它可以更早的限定uri,所以它更精确。
request
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
private static final String METHOD_OPTIONS = "OPTIONS";
private static final String METHOD_POST = "POST";
private static final String METHOD_PUT = "PUT";
private static final String METHOD_TRACE = "TRACE";
private static final String HEADER_IFMODSINCE = "If-Modified-Since";
private static final String HEADER_LASTMOD = "Last-Modified";
用于判断使用,是否更新,没有更新告诉浏览器,资源没更新,用缓存,别问我。提高性能的。
request对象里面基本上都是get XXX的方法。
OOP的封装,客户端发起一个请求。所以我们servlet规范要求,servlet实现的厂商必须按照要求,将所有的信息封装在请求对象里面
比如tomcat。
我们这个请求对象,哪里来的?
servlet容器帮我们创建的,当一个请求到达后,容器会自己去包装一个请求对象,然后再入参。
-
getParameter()
-
控制行为才需要使用
-
重要方法
-
getParameter
-
getAttribute
-
setAttribute
-
setCharacterEncoding
-
getCookies
-
getParameterValues 获取复选框值
-
setHeader 控制浏览器行为
-
getHeader 根据客户端信息做控制
响应对象重要方法
- getWriter
- getOutputStream
- 上面两个都是用于输出数据的。
- 二者不可同时使用。除非你使用了一个流然后再使用另一种流之前进行reset,重置才可以使用新的类型的输出流。
网页上之所以能看到信息,最终都是通过writer write出去的。
- setstatus 设置响应状态码
- setDateHeadeer
- sendError
- seneRedirect
- setContentType
过滤器 监听器
过滤器。
过滤数据。
过滤器可以轻松实现权限机制。
敏感字 过滤器里面检查请求,查看请求里面 的数据,把这些敏感字全部替换成**
替换工作。
过滤区分先后顺序。
如果有多个,千万千万搞定顺序。
(doFilter)
初始化不重要。
多个过滤器配置在web.xml
链式设计,责任链模式。
过滤器逻辑(如果大家都能够匹配该请求的前提下,谁声明在前面,谁优先执行)
监听器>过滤器>servlet
了解其历史。
转发重定向
转发,是服务端的一种定位技术,言下之意,就是客户端是不知情的,对于客户端来讲,它只发起了一次请求。
重定向属于客户端的技术,客户端重新发起了请求。不止一次请求。
官网
http://www.mybatis.org/mybatis-3/
http://www.mybatis.org/mybatis-3/zh/index.html