springmvc
@Cacheable(cacheNames="缓存名") 缓存方法的返回结果,如果缓存中有,不执行方法
public 返回值 控制器方法(int id){
}
@CacheEvict(cacheNames="缓存名", allEntries=true) 让某个缓存的内容失效
public 返回值 增删改(){
}
@CachePut(cacheNames="缓存名") 替换更新缓存内容
public 返回值 增删改(int id){
}
ehcache, redis
ajax
几种技术的结合a(asynchronous 异步的xhr), j(javascript), x(xml) json
var xhr = new XMLHttpRequest();
特点 1. xhr不会导致页面跳转(整体刷新)局部刷新
2. xhr 可以发送异步请求
同步,异步请求
xhr.open("请求方式", "请求url", true(异步)|false(同步));
xhr.send();
异步请求下接收响应
xhr.onload = function(){
var obj = JSON.parse(xhr.responseText); // 一般结果是json字符串,需要转为js对象
}
发送post请求
xhr.open("post", "请求url", true);
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded"); // 指表单格式 名=值&名=值
xhr.setRequestHeader("content-type", "multipart/form-data"); // 指多部分表单格式(常用于上传文件)
xhr.setRequestHeader("content-type", "application/json"); // 指是json字符串 {属性名:属性值}
xhr.send("内容");
JSON.stringfy(js对象) ==> json 字符串
@RequestMapping // @RequestBody用来接收请求体是json字符串的情况
public void 控制器方法(@RequestBody User user) {
}
========================================================================================
1. 无刷新上传文件
var xhr = …
var formData = new FormData(document.getElementById(“表单id”))
xhr.send(formData); // 发送时请求体格式 multipart/form-data 所以服务器需要配置文件上传解析器,即:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
图片文件的预览
var fileInput = document.getElementById("文件上传框id");
fileInput.files; // 获取所有选中的文件
var file = fileInput.files[0];
var fileReader = new FileReader();
fileReader.onload = function(){
fileReader.result; // 得到读取结果, 把它赋值给img的src
};
fileReader.read(file);
2. 采用第三方库发送ajax请求
2.1 jquery中使用ajax
$.ajax({
url:"请求url地址",
type:"get|post|put|delete",
data:"请求参数",
dataType:"服务器返回的响应格式,一般不用设置", 取值// json,html,text,xml..
success: function(结果){}, // 响应成功后调用的函数
error: function(){}, // 请求和响应过程中出错了调用的函数
});
$.get("请求url地址", "请求参数").done(function(结果){}).fail(function(xhr){});
// done 是成功时的回调函数, fail是失败时的回调函数
$.post("请求url地址", "请求参数").done(function(结果){});
2.2 ajax中的注意事项
ajax默认不支持跨域调用 (不同的域名,不同ip之间 默认不可以使用ajax来发送请求接收响应)
192.168.10.240
controller
192.168.10.100 另一台机器
$.ajax
xhr
要支持跨域
方法1:jsonp 方式 需要服务器端的配合
方法2:cors 方式
3. springboot
对spring,springmvc的再次封装, 目的简化配置文件, 降低spring框架的入门门槛
application.properties
springboot 集成了tomcat
3.1 创建springboot项目
方法1: 在线创建springboot项目
注意:springboot 推荐打jar包,而不是war
src
|- main
|- java
|- resources
|- static 静态资源 css, js, 图片…
|- templates 模板文件 等价于jsp页面
|- application.properties 配置文件
入口类 必须加@SpringbootApplication注解
入口类中包含 主方法:
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
方法2:手动建一个maven项目,修改pom.xml文件即可
注意:
- 入口类的包级别要比其他的controller ,service , mapper高
- 但入口类包不能没有,否则会出现java.io.FileNotFoundException: class path resource [org/springframework/social/config/annotation/SocialConfigurerAdapter.class] cannot be opened because it does not exist
3.2 常见问题
- 配置端口号
在application.properties 添加
servlet.port=新端口号
也可以在启动时 Run Configuration 中配置 Override parameters来改动端口号
- 配置日志
logging.level.包名=级别
自己输出日志
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
logger对象中有error, warn, info, debug 用他们来记录不同重要程度的信息
- 加速启动工具
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
然后再idea编辑器中用 build module 让改动生效
内部是使用了一些类加载机制加速项目的重新启动
- thymeleaf视图
首先加入依赖:
<!-- 视图(模板)技术 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 让thymeleaf 在解析html时能采用不严格的语法 -->
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
然后在application.properties中配置
# 配置thymeleaf
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
# 解析html时,不要用严格模式
spring.thymeleaf.mode=LEGACYHTML5
最后编写thymeleaf视图页面,都是以*.html结尾的文件,默认放在resources/templates目录下
在页面上使用th命名空间,在配合th:属性输出动态内容,例如输出标签文本可以使用:
<p th:text="${模型变量}"></p>
- 打包和运行
在idea 中找到 maven 菜单 life cycle ==> package
可以点击maven菜单的skip tests
忽略单元测试,否则有一个测试失败,会导致打包不成功
运行jar的命令:
java -jar springboot-0.0.1-SNAPSHOT.jar --server.port=7070
--后的参数会覆盖掉 application.properties中的同名参数
好处:不用目标机器安装tomcat环境,因为springboot已经内嵌的tomcat服务器
jquery对ajax
$.ajax({
url:"请求地址",
data:请求参数,js对象,
dataType: 响应类型 text,html,json,jsonp只有jsonp需要特殊指定
success: function(结果){}, 响应成功回调
error: function(xhr){}, 请求和响应出错时回调
type: "get|post"
});
$.get("请求地址", 请求参数).done(function(结果){}).fail(function(xhr){});
$.post();
xhr请求不能跨域(另一种叫做cors)
jsonp script
发送请求是<script src="请求地址"></script>
callback=函数名
服务器生成script : 函数名(结果)
springboot
- https://start.spring.io/ 到此地址按照向导生成项目
- 也可以手动创建maven项目,在pom文件中加入springboot的依赖
程序入口
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@Mapper, @Service, @Controller
入口类要放在其他类的外层
在application.properties文件中可以配置
- 配置连接数据库的信息
- 修改web程序端口
- 配置某个日志的输出
- 配置thymeleaf
===============================================================================================
1. 自定义连接池
commons dbcp 是apache的项目
c3p0
druid
可以使用 @Bean 注解定义spring容器对象,它的功能类似于<bean>
标签
@Bean // @Bean注解的作用是把方法返回的结果,纳入spring容器的管理, 把方法名当做bean的id, 默认这个bean对象也是单例的
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/eshop?serverTimezone=GMT%2B8&useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true&useCursorFetch=true&defaultFetchSize=100&allowPublicKeyRetrieval=true");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setMaxActive(8);
dataSource.setMinIdle(1);
return dataSource;
}
2. 自定义配置信息
- 提供一些自定义的配置信息,写入application.properties文件
westos.druid.driver-class-name=com.mysql.cj.jdbc.Driver
westos.druid.url=jdbc:mysql://localhost:3306/eshop?serverTimezone=GMT%2B8&useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true&useCursorFetch=true&defaultFetchSize=100&allowPublicKeyRetrieval=true
westos.druid.username=root
westos.druid.password=root
westos.druid.maxActive=8
westos.druid.minIdle=1
- 读取这些信息需要提供一个 以Properties 结尾的类
@Component // 让spring容器扫描到它并管理
@ConfigurationProperties(prefix = "westos.druid") // 用来读取*.properties配置文件中的信息
public class DruidDataSourceProperties {
private String driverClassName;
private String url;
private String username;
private String password;
private int maxActive;
private int minIdle;
...
- 使用这个配置类,可以采用 @Autowried依赖注入
- 让编写*.properties 时有提示功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3. lombok
可以用它生成实体的get,set方法等
@Data // 帮我们生成 getter, setter, equals, hashCode toString…
@NoArgsConstructor // 生成无参构造的
@AllArgsConstructor // 生成有参构造的
还可以使用 @Slf4j 生成日志对象
4. 测试
可以在单元测试类中使用spring的依赖注入特性,注入要测试的类
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestSpringBoot {
@Autowired
private UserMapper userMapper;
@Test
public void test1() {
User user = userMapper.findUserById(1);
// System.out.println(user);
Assert.assertTrue( user != null);
Assert.assertEquals(1,user.getId());
Assert.assertEquals("zhangsan",user.getName());
}
}
5. Oracle
5.1 后台的服务
OracleService服务名 OracleServiceXE 数据库主服务
Oracle服务名TNSListener OracleXETNSListener 监听服务 1521
5.2 连接oracle服务
- 用命令行(黑窗口)
权限最高的用户 Sys
管理员用户 System
sqlplus 用户名/密码 - 用网页管理
http://127.0.0.1:8080/apex/f?p=4950 - 用第三方的工具
plsql developer
修改oracle(web)服务的端口号
exec dbms_xdb.sethttpport(8083);
查看oracle(web)服务的端口号
select dbms_xdb.gethttpport() from dual;
5.3 oracle存储结构
表空间 - 逻辑单位
SYSTEM 表空间,用来存储系统表
TEMP 表空间,临时表空间
USERS 表空间,应用程序使用空间
表空间下在存储具体的表
5.4 创建和管理用户
create user 用户名 identified by 密码;
create user scott identified by tiger;
刚创建的用户没有权限,需要授权
grant 权限 to 用户名;
grant connect, resource to scott;
5.5 测试用户 hr
解锁hr用户
alter user hr account unlock;
alter user hr identified by hr;
5.6 查看有哪些表
select table_name from user_tables; 查询系统视图
5.7 查看表结构
desc 表名
5.8 建表
create table 表名(
列名 数据类型 约束,
…
);
数字类型: Number(有效数字最大位数, 小数点后位数)
Number(10) 长度最大为10的整数
Number(10,2) 整数部分最大8位,小数2位
可变字符类型
VARCHAR2(最大长度) 注意最大长度按字节处理, 一个汉字一般占3个字节(底层是utf-8)
NVARCHAR2(最大长度) 这回最大长度按字符为单位处理
日期
DATE 可以保存年月日,时分秒
TIMESTAMP 保留的日期信息更多
获取当前时间:sysdate, systimestamp
一般用 number(1) 代表布尔值,0代表false, 非0代表true
注意:oracle数据库中没有自增列
5.9 序列 sequence
create sequence 序列名;
从序列中获取值
select 序列名.nextval from dual;
插入时数据时使用序列
insert into 表(id, …) values (序列名.nextval, …);
5.10 dual 表
只有一行一列, 使用场景:当某个计算或某个函数只想调用一次的时候,必须配合dual表
select 1+1 from countries; // 返回多行2 ,太浪费
select 1+1 from dual; // 只会返回一个2
5.11 rownum 行号
作用,可以给查询结果做个一编号,
可以被看做特殊的列(伪列)
例子: 与 order by 使用时需要注意, 是先编号,再排序,所以结果与我们期望的不同
(select region_name from regions order by region_name) a
select rownum, a.region_name from (select region_name from regions order by region_name)a;
例子: 可以用做比较条件, 只能是< , <=
但不能是=, >, >=
Argentina
Australia
Belgium
Brazil
Canada
Switzerland
China
Germany
Denmark
Egypt
select rownum, country_name from countries where rownum<10;
rownum 的应用: 分页
select c.* from countries c where rownum<=5;
(select c.*, rownum rn from countries c where rownum <=10) b
select * from (select c.*, rownum rn from countries c where rownum <=10) b where b.rn > 5;
完整的写法:三层嵌套子查询配合rownum实现分页
select * from
(select a.*, rownum rn from
(select * from 表 c order by 排序列) a
where rownum <= 页号*每页记录数) b
where b.rn > (页号-1)*每页记录数
select * from
(select a.*, rownum rn from
(select * from countries c order by country_name) a
where rownum <= 15) b
where b.rn > 10;