IDEA入门-JavaWeb

490 阅读15分钟

总结

  • 一个project一个窗口
  • 目录中没有显示文件后缀,图标含义:类的图标是C,方法是M,接口是I
  • out文件就是我们编译后,生成的文件
  • 要使用相同的maven的settings.xml创建的项目才可以互相添加依赖,相互引用
  • 只有创建的Empty Project(空工程), 才可以添加多个module
  • post请求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.Driver
  • Junit单元测试要求函数的方法必须是public,不能为private
  • pom.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+w
  • Excel添加删除线 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中自定义快捷键输出文本 如图自定义快捷键 image.png

  • 底部控制台run的显隐性 alt+4

  • 底部控制台debug的显隐性 alt+5

  • 展示当前文件所有的方法、样式、标签等名称 Alt+7 ef15d2c2325cf697651ad0207451ed0.png

  • 当前文件替换字符串(可指定范围再按快捷键) Ctrl+R

  • 全部文件替换字符串(可指定范围再按快捷键) Ctrl+Shift+R image.png

  • 展开/折叠文件夹 自定义快捷键如下图: image.png

在线预览文档的测试链接(拼接文件中的文件名即可)

cdn.jsdelivr.net/gh/hanjunqi…

获取当前类所在的路径

//获取当前类所在的路径,后面拼接路径时不需要加/
System.out.println(System.getProperty("user.dir"));

Junit单元测试 & Maven测试

在要单元测试的类中,使用快捷键: ctrl+shift+t

image.png

image.png

image.png

创建第一个Java项目

image.png

image.png

image.png

编译&执行第一个Java文件

image.png

设置编译版本的两种方式

<!-- 方式一: 通过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>

image.png

新版idea创建Java web项目

image.png

image.png

image.png

指定文件夹类型

image.png

在resources文件下创建类似java文件下的package目录文件

  • 在java文件下输入:com.rcd.mapper
  • 在resources文件下输入:com/rcd/mapper image.png
  • 在mybatis-config下引入的mapper.xml路径

image.png

image.png

创建xml文件

想在resources下创建多级目录文件,
需要使用com/rcd/mapper

这里的目录结构是为了和java文件保持一致,
打包的时候, 
resources和java文件下的文件会在一个包里,
好像是mybatis要求打包后必须在一个包里

想要创建xml文件, 但是没有这个选项
可以选择File, 
弹框输入文件名+后缀即可
例如: BrandMapper.xml

image.png

添加Tomact服务

  • 推荐使用Tomcat8,因为Tomcat10在使用servlet接口时访问404,在Tomcat8访问正常。 image.png

指定Tomcat服务访问的根路径

image.png

修改Tomcat默认启动的浏览器

image.png

使用插件版的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>

image.png

修改web代码后,刷新浏览器即可查看修改后内容的配置

image.png

image.png

显示&隐藏可排除的文件.idea和out文件

image.png

修改系统的默认配置settings

image.png

  • 修改maven的默认配置

image.png

maven安装与配置参考

创建maven工程

image.png

image.png

image.png

image.png

image.png

image.png

maven项目之间互相调用方法

image.png image.png

maven-web工程

image.png

image.png

maven项目中 引用el表达式(依赖jsp-api)、jstl表达式(依赖el表达式)

jstl表达式 1.2版本包括了standard库,需要去掉,不然会冲突 el表达式文章 image.png

显示导航栏中选项的快捷键

鼠标放上去就会显示

代码智能提醒,不区分大小写字母

image.png

创建Java类时, 顶部添加默认的注释

/**
* ClassName:${NAME}
* Package:${PACKAGE_NAME}
* ProjectName:${PROJECT_NAME}
* Description:
* @Date:${DATE} ${TIME}
* @Author:${USER}
*/

image.png

插件

  • idea编辑器汉化插件

image.png

  • 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>

image.png

  • 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();
    }
}

image.png

解决idea项目和控制台输出中文乱码

参考1 参考2

  • 在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

image.png

image.png

下面这一步可以不加 image.png 修改下面一步

image.png

image.png 关闭idea,重新打开,启动项目查看乱码是否解决

Maven

  • 修改maven本地仓库jar包的存储路径(我的本地路径:C:\Users\Mrhan\.m2) image.png

  • maven的生命周期

image.png

image.png

  • maven坐标

image.png

  • 依赖管理

image.png

image.png

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配置,不推荐使用/和/* image.png

image.png

  • 一个场景多个方法,写一个servlet的实现原理 203fcd843538c8c09989cf4fa08f27a.png

数据库

  • 连接数据库,不智能提醒信息

image.png

注解

  • 在dao层中将数据库字段brand_name变为brandName image.png image.png image.png

错误集合

  • 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编译时没有正常加载项目;
不行,再尝试下面的方法:

image.png

image.png

image.png

  • 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…

常见的响应状态码

状态码英文描述解释
200OK客户端请求成功,即处理成功,这是我们最想看到的状态码
302Found指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
304Not Modified告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
400Bad Request客户端请求有语法错误,不能被服务器所理解
403Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
404Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了
428Precondition Required服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
429Too Many Requests太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用
431 Request Header Fields Too Large请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
405Method Not Allowed请求方式有误,比如应该用GET请求方式的资源,用了POST
500Internal Server Error服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
503Service Unavailable服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好
511Network Authentication Required客户端需要进行身份验证才能获得网络访问权限

Javaweb三大组件:Servlet、Filter过滤器、Listener监听器

image.png

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);

image.png

网络请求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>

image.png

  • get&post请求参数含有中文时,服务端接收到的参数乱码 image.png
  • 服务端返回前端的参数含有中文时,需要设置编码
//设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");
  • axios, ajax和fetch的比较

  • 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("插入失败")
    })
}

image.png

常见用法

访问servlet接口,返回浏览器一张图片或文档

该方式IE浏览器无法加载文档,可加载图片.

image.png

第三方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表达式冲突,导致无法解析,
所以暂时没有解决

参考1 参考2

image.png