总结
一个project一个窗口目录中没有显示文件后缀,图标含义:类的图标是C,方法是M,接口是Iout文件就是我们编译后,生成的文件要使用相同的maven的settings.xml创建的项目才可以互相添加依赖,相互引用只有创建的Empty Project(空工程), 才可以添加多个modulepost请求AServlet,然后再AServlet中转发BServlet会失效;换成get请求AServlet,然后转发BServlet会成功; 只能用重定向sendRedirect()实现了将对象转换为JSON数据, 称为:序列化Servlet API中的类(HttpServletRequest,HttpServletResponse,Filter等)pojo下面的实体类不要忘记set和get方法,否则查询条数正确,对象内容都为空mysql驱动 5.x版本DriverClassName:com.mysql.jdbc.Driver 8.x版本DriverClassName:com.mysql.cj.jdbc.DriverJunit单元测试要求函数的方法必须是public,不能为privatepom.xml中使用spring-test包时, spring5 及以上版本要求 junit 的版本必须是 4.12 及以上实体类(例如User)中通常会添加一个toString()方法, 目的是打印实体类对象时输出的是toString()返回的字符串而不是对象地址
快捷键
windows快捷键
Windows显卡控制面板开启了热键, Ctrl+Alt+上下左右, 调整屏幕布局方向快速打开状态栏中的应用 win+1、win+2、win+3...新增桌面 win+Ctrl+D删除当前桌面 win+Ctrl+F2切换桌面 win+Ctrl+left、win+Ctrl+right只开启--开始右侧的搜索框 win+q屏截图或有手写笔的手写 win+wExcel添加删除线 Mac: cmd+shift+x |Windows: Ctrl+5
IDEA快捷键
mac本idea改了快捷键:
运行:alt+m
所有类搜索 shift+shift全局文件搜索 Ctrl+shift+F可能和搜狗输入法冲突,要禁用输入法的快捷键!全局替换变量 shift+F6快速补充变量名 ctrl+alt+v智能提示增加变量名或提取方法 alt+回车当前类的所有方法 alt+7 或 alt+F12
new ArrayList<>(); //按快捷键ctrl+alt+v,得到下一行
ArrayList<String> strings = new ArrayList<String>();
全局搜索 双击shift
全局搜索中包括下面的内容:
- 转到文件 Ctrl+shift+N
- idea全局操作搜索 Ctrl+shift+A
-
打开系统的Settings ctrl+alt+s -
打开系统的Project Structure ctrl+alt+shift+s -
Java入口函数 psvm+回车 -
for循环 iter+回车 -
输出语句 sout+回车 -
格式化代码 Ctrl+Alt+shift+L 本人自定义为alt+ctr+L -
上下移动代码 Alt+Shift+上或下 -
切换已打开窗口 alt+left,alt+right -
切换已经打开的project工程 向左:Ctrl+Alt+[ 向右:Ctrl+Alt+] -
跳转到指定行的代码 ctrl+G在弹框中直接输入行数就可以 -
已打开的文件用窗口显示 Ctrl+tab后 长按Ctrl -
终止当前启动的Tomact ctrl+F2 -
执行上一次执行的Tomcat模式 ctrl+F5 -
最近的文件Ctrl+E -
切换所有工具栏的显隐性,方便只看代码 鼠标左键双击已经打开的窗口tab -
导航栏 Alt+Home -
project目录的显示隐藏 ctrl+shift+F12 -
复制一行 ctrl+d -
删除一行 ctrl+x -
new文件快捷键(在左侧目录中) alert+insert -
junit单元测试 ctrl+shift+t -
提取变量/返回值 Ctrl+alt+v -
生成选中类的继承结构图 Ctrl+Alt+u -
选中的代码添加try-catch、if-else等 Ctrl+Alt+T -
插入构造方法等 Alt+Insert -
大小写切换 Ctrl+shift+u -
展开/隐藏当前方法 Ctrl+等号/减号 -
展开/隐藏所有方法 Ctrl+shift+等号/减号
如果有冲突,可以打开快捷键搜索Ctrl+等号, 只保留code-folding-Expand对应的快捷键
-
idea中自定义快捷键输出文本 如图自定义快捷键 -
底部控制台run的显隐性 alt+4 -
底部控制台debug的显隐性 alt+5 -
展示当前文件所有的方法、样式、标签等名称 Alt+7 -
当前文件替换字符串(可指定范围再按快捷键) Ctrl+R -
全部文件替换字符串(可指定范围再按快捷键) Ctrl+Shift+R -
展开/折叠文件夹 自定义快捷键如下图:
在线预览文档的测试链接(拼接文件中的文件名即可)
获取当前类所在的路径
//获取当前类所在的路径,后面拼接路径时不需要加/
System.out.println(System.getProperty("user.dir"));
Junit单元测试 & Maven测试
在要单元测试的类中,使用快捷键: ctrl+shift+t
创建第一个Java项目
编译&执行第一个Java文件
设置编译版本的两种方式
<!-- 方式一: 通过maven java编译器属性,改变编译版本为1.8 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 方式二: maven java编译器插件改变编译版本为1.8 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
新版idea创建Java web项目
指定文件夹类型
在resources文件下创建类似java文件下的package目录文件
在java文件下输入:com.rcd.mapper在resources文件下输入:com/rcd/mapper在mybatis-config下引入的mapper.xml路径
创建xml文件
想在resources下创建多级目录文件,
需要使用com/rcd/mapper
这里的目录结构是为了和java文件保持一致,
打包的时候,
resources和java文件下的文件会在一个包里,
好像是mybatis要求打包后必须在一个包里
想要创建xml文件, 但是没有这个选项
可以选择File,
弹框输入文件名+后缀即可
例如: BrandMapper.xml
添加Tomact服务
推荐使用Tomcat8,因为Tomcat10在使用servlet接口时访问404,在Tomcat8访问正常。
指定Tomcat服务访问的根路径
修改Tomcat默认启动的浏览器
使用插件版的Tomact也很好用,速度比本地的Tomcat运行快
鼠标在项目名称右键,选中Run Maven - tomcat7:run该插件目前最高支持Tomcat7
//在pom.xml中添加插件
<build>
<plugins>
<!--Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port><!--访问端口号 -->
<!--项目访问路径
未配置访问路径: http://localhost:80/tomcat-demo2/a.html
配置/后访问路径: http://localhost:80/a.html
如果配置成 /hello,访问路径会变成什么?
答案: http://localhost:80/hello/a.html
-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
修改web代码后,刷新浏览器即可查看修改后内容的配置
显示&隐藏可排除的文件.idea和out文件
修改系统的默认配置settings
修改maven的默认配置
maven安装与配置参考
创建maven工程
maven项目之间互相调用方法
maven-web工程
maven项目中 引用el表达式(依赖jsp-api)、jstl表达式(依赖el表达式)
jstl表达式 1.2版本包括了standard库,需要去掉,不然会冲突
el表达式文章
显示导航栏中选项的快捷键
代码智能提醒,不区分大小写字母
创建Java类时, 顶部添加默认的注释
/**
* ClassName:${NAME}
* Package:${PACKAGE_NAME}
* ProjectName:${PROJECT_NAME}
* Description:
* @Date:${DATE} ${TIME}
* @Author:${USER}
*/
插件
idea编辑器汉化插件
idea项目中添加详细日志&高亮
//pom.xml
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
//logback.xml (自己新建xml)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.rcd" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
mybatis-config.xml配置
<?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">
<configuration>
<!--起别名-->
<typeAliases>
<package name="com.rcd.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
//下面2句等价
//<property name="url" value="jdbc:mysql://localhost:3036/test"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="abc123**"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--扫描mapper-->
<package name="com.rcd.mapper"/>
</mappers>
</configuration>
JDBC的基本使用
public class JDBCDemo_PrepareStatement {
public static void main(String[] args) throws Exception {
// 1,注册驱动(MySQL5之后的驱动jar包,该句可以省略,因为jar包中,默认注册了该驱动)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2,获取连接:如果连接的是本机mysql并且端口是默认的3306 可以简化书写
// String url = "jdbc:mysql:///test";
// 开启PreparedStatement的预编译,必须添加参数useServerPrepStmts=true
String url = "jdbc:mysql://127.0.0.1:3306/test?useServerPrepStmts=true";
// String url = "jdbc:mysql://127.0.0.1:3306/test";
String username = "root";
String password = "abc123**";
Connection conn = DriverManager.getConnection(url, username, password);
// 3,定义SQL
String sql = "select * from emp where id = ? or id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 注意:这里的index是从1开始的
pstmt.setInt(1,1);
pstmt.setInt(2,2);
ResultSet result = pstmt.executeQuery();
if (result.next()){
System.out.println("查询成功");
}else {
System.out.println("查询失败");
}
// 7,释放资源
result.close();
pstmt.close();
conn.close();
}
}
解决idea项目和控制台输出中文乱码
在pom.xml文件中添加
<properties>
<!-- 防止idea报错:Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. bu -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
需要把下面图中的选项都改为UTF-8
下面这一步可以不加
修改下面一步
关闭idea,重新打开,启动项目查看乱码是否解决
Maven
-
修改maven本地仓库jar包的存储路径(我的本地路径:C:\Users\Mrhan\.m2) -
maven的生命周期
maven坐标
依赖管理
servlet
idea-new中没有servlet选项
//需要在pom.xml中引入依赖才可以创建servlet
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
urlPattern配置,不推荐使用/和/*
一个场景多个方法,写一个servlet的实现原理
数据库
连接数据库,不智能提醒信息
注解
在dao层中将数据库字段brand_name变为brandName
错误集合
MySQL服务没有启动,会报下面的错误
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
### The error may exist in com/rcd/mapper/UserMapper.java (best guess)
### The error may involve com.rcd.mapper.UserMapper.selectByUsernamePwd
### The error occurred while executing a query
### Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
idea中注解不高亮
数据库服务都配置没问题前提下, 重启idea, 看是不是idea编译时没有正常加载项目;
不行,再尝试下面的方法:
Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
1,mysql没有启动
2,数据库配置错误
3,mysql驱动版本太低,现在是8.X.X
会话跟踪技术
Cookie
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
持久存储的解决方式: 设置Cookie存活时间, 参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
Session
session是基于cookie实现的
Cookie和Session的区别:
Cookie是存储在浏览器端,而Session是存储 在服务器端浏览器关闭情况下, Cookie可以设置存活时间, session不可以Cookie通常存储用户登录前的账号密码以及状态之类的数据Session存储登录后获取到的用户信息
状态码大类
| 状态码分类 | 说明 |
|---|---|
| 1xx | 响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它 |
| 2xx | 成功——表示请求已经被成功接收,处理已完成 |
| 3xx | 重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。 |
| 4xx | 客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 |
| 5xx | 服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等 |
状态码大全:cloud.tencent.com/developer/c…
常见的响应状态码
| 状态码 | 英文描述 | 解释 |
|---|---|---|
| 200 | OK | 客户端请求成功,即处理成功,这是我们最想看到的状态码 |
| 302 | Found | 指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面 |
| 304 | Not Modified | 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
| 400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
| 403 | Forbidden | 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
| 404 | Not Found | 请求资源不存在,一般是URL输入有误,或者网站资源被删除了 |
| 428 | Precondition Required | 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 |
| 429 | Too Many Requests | 太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用 |
| 431 | Request Header Fields Too Large | 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 |
| 405 | Method Not Allowed | 请求方式有误,比如应该用GET请求方式的资源,用了POST |
| 500 | Internal Server Error | 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 |
| 503 | Service Unavailable | 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 |
| 511 | Network Authentication Required | 客户端需要进行身份验证才能获得网络访问权限 |
Javaweb三大组件:Servlet、Filter过滤器、Listener监听器
json对象与json字符串互相转换
<script>
var user = {
name:'mrhan',
age: 30,
obj: "IT行业"
}
let jsonstr = JSON.stringify(user);
console.log(jsonstr);
let jsonobj = JSON.parse(jsonstr);
console.log(jsonobj);
/**
* 网页控制台输出内容:
* {"name":"mrhan","age":30,"obj":"IT行业"}
* jsonBase.html:20 {name: 'mrhan', age: 30, obj: 'IT行业'}
* */
</script>
java对象与json字符串互相转换
User user = new User();
user.setId(100);
user.setUsername("zhangsan");
user.setPassword("abc123**");
System.out.println("java对象:\n" + user);
String jsonString = JSON.toJSONString(user);
System.out.println("json字符串:\n" + jsonString);
JSONObject jsonObject = JSON.parseObject(jsonString);
System.out.println("转换后的java对象1:\n" + jsonObject);
//获取对象指定key的value
System.out.println(jsonObject.getString("username"));
User user2 = JSON.parseObject(jsonString, User.class);
System.out.println("转换后的java-pojo对象2:\n" + user2);
网络请求Ajax、Axios
Ajax基本使用
<script>
var xmlhttp;
if (window.XMLHttpRequest){
//IE6以后的浏览器
xmlhttp = new XMLHttpRequest();
}else {
//code for IE6,IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//网络请求框架访问的URL都是全路径, jsp访问的是相对路径
xmlhttp.open("get","http://localhost:8080/pro/ajaxServlet");
xmlhttp.send(); //发送请求
//监听请求的响应结果
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
alert(xmlhttp.responseText);
}
}
</script>
Axios基本使用注意事项:
方式1: html引用项目中引入的axios.js框架步骤:
注意: html中不能直接使用maven中下载的axios.jar包, 打印axios也是未定义,不要纠结为啥在html中智能提示了axios...
使用方法:
1,解压axios-0.25.0.jar
2,找到axios-0.25.0.jar\META-INF\resources\webjars\axios\0.25.0\dist\axios.js
3,拷贝到项目中
4,在html的<script src="这里填写xxx.html相对axios-0.25.0.js的路径">
方式2: (推荐)直接引用外网地址即可,下面有两个平台的地址可选其一
→ Using jsDelivr CDN:
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">
不能在这里直接用axios,需要新建script标签才可以使用axios
</script>
→ Using unpkg CDN:
<script src="https://unpkg.com/axios/dist/axios.min.js">
不能在这里直接用axios,需要新建script标签才可以使用axios
</script>
xxx.html中的使用方式:
<!--axios引入方式1:本地文件-->
<script src="../js/axios-0.25.0.js"></script>
<!--axios引入方式2:外网地址-->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!--<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>-->
<script>
/**
* get标准写法:
* get请求没有data属性,就算传递参数也无效,
* 后端servlet是URL的?后开始截取然后通过getParameter("name")获取参数
* */
axios({
method: "get",
url: "http://localhost:8080/pro/ajaxServlet?name=wangwu",
}).then(function (response) {
console.log(111);
console.log(response)
})
//post标准写法:
axios({
method:"post",
url:"http://localhost:8080/pro/ajaxServlet",
data:{
name:"zhangsan"
}
}).then(function (response) {
console.log(333);
console.log(response)
})
/** 请求方法的别名(即:官方提供的简写方式)
* 默认第一个是URL, 参数拼接到URL后面
* 第二个传递参数无效*/
// axios.get('http://localhost:8080/pro/ajaxServlet?name=zhanliu')
// .then(function (response) {
// console.log(222)
// console.log(response);
// })
// .catch(function (error) {
// console.log(error);
// });
/** 请求方法的别名(即:官方提供的简写方式)
* 默认第一个是URL,
* 第二个是参数, 可以是字符串也可以是对象,后台也会接收字符串或json对象(需要转java对象)*/
// axios.post(
// "http://localhost:8080/pro/ajaxServlet",
// "name=zhangsan"
// ).then(function (response) {
// console.log(444);
// console.log(response)
// })
</script>
get&post请求参数含有中文时,服务端接收到的参数乱码服务端返回前端的参数含有中文时,需要设置编码
//设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");
-
this指什么?谁调用, this就是谁 -
在axios的回调--函数中this是指axios对象 -
在axios的回调--箭头函数中this默认是指Vue对象
selectAll(){
console.log(this.brand);
/**
* 这里的this是Vue对象,所以_this一直是Vue对象,
* 在不同的作用域内this可能会指向其他对象,但_this一直是Vue对象
* 在axios的回调函数中this是指axios对象
* */
let _this = this;
axios({
method:"post",
url:"http://localhost:8080/pro/addJsonServlet",
data:this.brand
}).then(function (resp) {
console.log(resp);
}).catch(function (error) {
console.log("插入失败")
})
}
常见用法
访问servlet接口,返回浏览器一张图片或文档
该方式IE浏览器无法加载文档,可加载图片.
第三方jar包
常见名词的原理
CDN
CDN是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。
解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。
正则表达式~
- 只允许字母数字和-
- 必须字母或数字开头
- 必须数字结尾
- 长度必须是5-16位
//首字母占1位,
//{4,15}占15位,在此基础上,限制必须数字结尾
^[a-zA-Z0-9][a-zA-Z0-9-]{4,14}[0-9]$
【redis】win10下redis集群
待解决问题
org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD
使用参考1后,与servlet项目中用到的比较老的jstl、el表达式冲突,导致无法解析,
所以暂时没有解决
-
tomacat下的work、log为空,why? -
break、continue、return的使用方法 -
WEB-INF目录下的jsp不能在地址栏直接访问
解决方式: 通过新建servlet类转发到html或者jsp
解决方式: 通过web.xml配置servlet转发到html或者jsp