JavaEE学习

一、认识IDEA

1、IDEA介绍

  • IDEA(JetBrains公司产品),全称Intelli IDEA,是Java 语言的集成开发环境,IDEA在业界被公认为是最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计等方面的功能可以说
    是超常的。

2、IDEA的主要优势(相较于Eclipse而言)

①强大的整合能力。比如Git、Maven、Spring等
②提示功能的快速、便捷
③提示功能的范围广
④好用的快捷键和代码模板
⑤精准搜索

3、IDEA快捷键

快捷键介绍
Ctrl + C复制光标所在行或复制选择内容
Ctrl + V粘贴
Ctrl + Z撤销 (必备)
Ctrl + Y删除光标所在行 或 删除选中的行 (必备)
Ctrl + X剪切光标所在行或剪切选择内容
Ctrl + /注释光标所在行代码,会根据当前不同文件类型使用不同的注释符号(必备)
Shift + F9等效于点击工具栏的 Debug 按钮
Shift + F10等效于点击工具栏的 Run 按钮

4、IDEA模板(Template)

模板介绍
mainpublic static void main(String [] args){ }
psvmpublic static void main(String [] args){ }
Ctrl + Z撤销 (必备)
Ctrl + Y删除光标所在行 或 删除选中的行 (必备)
Ctrl + X剪切光标所在行 或 剪切选择内容
Ctrl + /注释光标所在行代码,会根据当前不同文件类型使用不同的注释符号 (必备)
Shift + F9等效于点击工具栏的 Debug 按钮
Shift + F10等效于点击工具栏的 Run 按钮

二、Maven

1、Maven概念

  • Maven是Apache提供的一款自动化构建工具,用于自动化构建和依赖管理。
    开发团队基本不用花多少时间就能自动完成工程的基础构建配置,因为 Maven使用了一个标准的目录结构和一个默认的构建生命周期。在如下环节中,Maven使得开发者工作变得更简单。
    构建环节:清理、编译、测试、报告、打包、部署

三、Servlet

1、servlet的生命周期

在这里插入图片描述

servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段:
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁

服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf),该servlet对象去处理所有客户端请求,service(ServletRequest req,ServletResponse res)方法中执行,最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。其中加载阶段无法观察,但是初始化、服务、销毁阶段是可以观察到的。

2、Servlet映射

(1)注解

@WebServlet(name="hello",urlPatterns="/hello")

(2)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>jxnu.xcz.Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

3、get和post区别

POST和GET都是向服务器提交数据,并且都会从服务器获取数据。

区别:
1、传送方式:get通过地址栏传输,post通过报文传输。
2、传送长度:get参数有长度限制(受限于url长度),而post无限制
3、GET和POST还有一个重大区别,简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包

长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
    建议:

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

案例:一般情况下,登录的时候都是用的POST传输,涉及到密码传输,而页面查询的时候,如文章id查询文章,用get 地址栏的链接为:article.php?id=11,用post查询地址栏链接为:article.php, 不会将传输的数据展现出来。

4、response常用方法

- void setContentType (String name)

设置作为响应生成的内容的类型和字符编码

  • (1) setContentType(“text/html;charset=utf-8”)

设置页面内容是html,编码格式是utf-8

  • (2)setContentType(“application/pdf”),setContentType(“application/msword”)

Servlets 可以使用MIME类型来向浏览器传送非HTML文件,比如Adobe PDF和Micorsoft Word。

- void sendRedirect (String name)

案例1∶重定向
需求︰设计一个登录页面、一个登录成功页面以及登录失败页面,当用户名和密码都是admin时,重定向到登录成功页面,否则重定向登录失败页面。

  • 发送一个响应给浏览器,指示其应请求另一个URL(重定向)
package jxnu.xcz;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name="hello",urlPatterns="/hello")
public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置作为响应生成的内容的类型和字符编码
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        String name=req.getParameter("name");
        out.print("Welcome欢迎   "+name);
        //重定向
        resp.sendRedirect("/return.html");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doGet(req,resp);
    }
}

5、Servlet跳转

(1)resp.sendRedirect (重定向)

(2)resp.setHeader

1、一秒刷新页面一次 response.setHeader(“refresh”,“1”);
2、二秒跳到其他页面 response.setHeader(“refresh”,“2;URL=otherPagename”);
3、没有缓存:
response.setHeader(“Pragma”, “No-cache”);
response.setHeader(“Cache-Control”, “no-cache”);
4、设置过期的时间期限
response.setDateHeader(“Expires”, System.currentTimeMillis()+自己设置的时间期限);
5、访问别的页面:response.setStatus(302); response.setHeader(“location”,“url”);

(3)rep.getRequestDispatcher

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String loginName=req.getParameter("loginName");
        String loginPWD=req.getParameter("loginPWD");
        if("abc".equals(loginName)&&"111".equals(loginPWD)){
            req.getRequestDispatcher("/rs.jsp").forward(req,resp);
        }
        else{
            resp.setHeader("refresh","3;url=11.html");
            resp.sendRedirect("Hello");
        }
    }

6、重定向和请求转发的区别

转发是服务器行为,重定向是客户端行为

  • 请求转发:对应的单词是(forward)
    1.一次请求,意味着可以使用request域对象来共享数据啦
    2.转发只能访问当前服务器的资源
    3.地址栏不变

  • 重定向:对应的单词是(redirect)
    1.两次请求,意味着不能使用request域对象来共享数据啦
    2.重定向可以访问其他站点(服务器)的资源
    3.地址栏发生变化

假设你去办理某个执照,
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

7、javaWeb路径问题

在JavaWeb中需要写的路径大概分为四大类:

1)客户端路径

超链接、表单、重定向

2)服务端路径

转发、包含

3)获取资源路径

servletContext获取资源、ClassLoader获取资源、Class获取资源

4)路径

  • 在本文中使用下图构建Web项目的目录:在这里插入图片描述

一、客户端路径

客户端路径是指运行在浏览器上的路径
比如:表单、超链接、js(location.href)、Ajax(url)、CSS和JS的引入以及重定向等。路径分为绝对路径和相对路径,相对路径又分为相对主机的路径和相对于当前请求的路径。
1.1、超链接

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>页面A</title>  
</head>  
<body>  
    <!--   
        超链接有三种书写路径的方式  
            1,绝对地址    
            2,以"/"开头的相对地址  
            3,不以"/"开头的相对地址   
    -->  
    <!-- 1.绝对地址   -->  
        <!-- 完整的URL -->  
    <a href="http://localhost:8080/javaee/jsp/b.jsp">这是绝对地址超链接</a><br/>  
      
    <!-- 2."/"开头的相对地址    -->  
        <!-- /代表了整个web项目,即:http://localhost:8080/ -->  
    <a href="/javaee/jsp/b.jsp">这是以"/"开头的相对地址超链接</a><br/>  
      
    <!-- 3.不以"/"开头的相对地址   -->  
        <!--   
            不以/开头,则相对于当前资源的路径  
            当前资源的路径为:http://localhost:8080/javaee/jsp/  
            而b.jsp也在此路径下  
            所以直接书写b.jsp  
         -->  
    <a href="b.jsp">这是不以"/"开头的相对地址超链接</a><br/>  
</body>  
</html>

1.2、表单

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
</head>  
<body>  
    <!-- 表单提交到jsp中 -->  
    <!--   
        表当提交路径有三种书写方式   
            1,绝对地址    
            2,以"/"开头的相对地址  
            3,不以"/"开头的相对地址   
    -->  
    <form action="http://localhost:8080/javaee/jsp/b.jsp" methoe="get">  
        username:<input type="text" name="username" value="">  
        <input type="submit" value="提交---绝对地址    ">  
    </form>  
    <!--/开头的相对地址     
        此时的/代表整个web项目,即:http://localhost:8080/  
    -->  
    <form action="/javaee/jsp/b.jsp" methoe="get">  
        username:<input type="text" name="username" value="">  
        <input type="submit" value="提交---以/开头的相对地址">  
    </form>  
      
    <form action="b.jsp" methoe="get">  
        username:<input type="text" name="username" value="">  
        <input type="submit" value="提交---不以/开头的相对地址 ">  
    </form>  
      
    <!-- 表单提交到Servlet -->  
    <!--   
        表单提交到Servlet有三种书写方式  
        1,绝对路径  
        2,以"/"开头的相对地址  
        3,不以"/"开头的相对地址   
    -->  
    <!-- 1.绝对地址   -->  
        <!-- 完整的URL -->  
    <form action="http://localhost:8080/javaee/PathServlet" methoe="get">  
        username:<input type="text" name="username" value="">  
        <input type="submit" value="表单提交到Servlet---绝对地址">  
    </form>  
      
    <!-- 2./开头的相对地址  -->  
        <!-- 此时的/代表整个web项目,即:http://localhost:8080/  -->  
    <form action="/javaee/PathServlet" methoe="get">  
        username:<input type="text" name="username" value="">  
        <input type="submit" value="表单提交到Servlet---以/开头的相对地址">  
    </form>  
    <!-- 3.不以/开头的相对地址    -->  
        <!--   
            不以/开头的相对路径是相对于当前资源的路径  
            此时form.jsp的地址为:http://localhost:8080/javaee/jsp/form.jsp  
            所以当前资源路径为:http://localhost:8080/javaee/jsp  
            而要提交的Servlet的路径为Http://localhost:8080/javaee/PathServlet  
            所以路径为当前路径的上一级路径下  
            即路径为:../PathServlet  
            注:.代表当前路径  
               ..代表当前路径的上一级路径  
        -->  
    <form action="../PathServlet" methoe="get">  
        username:<input type="text" name="username" value="">  
        <input type="submit" value="表单提交到Servlet---不以/开头的相对地址">  
    </form>  
</body>  
</html>

1.3、重定向

import java.io.IOException;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  

public class RedirectServlet extends HttpServlet {  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        response.sendRedirect("http://localhost:8080/javaee/jsp/b.jsp");  
        /* 
         * 2.以"/"开头的相对路径 
         *      此时,/代表整个web工程的路径,即http://localhost:8080/ 
         */  
//      response.sendRedirect("/javaee/jsp/b.jsp");  
        /* 
         * 3.不以"/"开头的相对路径 
         *      此时是相对于当前资源的相对路径 
         *      当前资源路径为:http://localhost:8080/javaee/RedirectServlet 
         *      即表示:RedirectServlet在路径http://localhost:8080/javaee之下 
         *      而b.jsp在http://localhost:8080/javaee/jsp/b.jsp 
         *      所以最终地址写为:jsp/b.jsp 
         */  
//      response.sendRedirect("jsp/b.jsp");  
          
    }  
  
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        doGet(request, response);  
    }  
  
}

二、服务端路径

服务端路径是指在服务器上面运行的请求,比如请求转发(常用)、请求包含等。服务端的路径有两种:相对于当前应用的路径和相对于当前请求的路径。
  2.1、请求转发

import java.io.IOException;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
/* 
 *      1.以"/"开头的相对路径 
 *      2.不以"/"开头的相对路径 
 */  
public class DispatcherServlet extends HttpServlet {  
  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        /* 
         * 1.以"/"开头的相对路径 
         *      此时,/代表当前web项目,即:http://localhost:8080/javaee 
         */  
//      request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);  
        /* 
         * 2.不以"/"开头的相对路径 
         *      相对于当前资源的相对路径 
         *  此时,当前资源的路径为:http://localhost:8080/javaee/DispatcherServlet 
         *  所以要转发去的资源的路径以:http://localhost:8080/javaee开头 
         */  
        request.getRequestDispatcher("jsp/b.jsp").forward(request, response);  
    }  
  
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        doGet(request, response);  
    }  
  
}

总结:
在请求转发中,以"/“开头的相对路径和不以”/“开头的相对路径 都是以http://localhost:8080/javaee/开头。
其他的,以”/“开头的相对路径以:http://localhost:8080/开头
不以”/"开头的相对路径以:http://localhost:8080/javaee开头

8、事务

1、事务的隔离级别:数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
在这里插入图片描述

9、JavaBean命名规则

  • 1 、类名要首字母大写,后面的单词首字母大写

  • 2 、方法名的第一个单词小写,后面的单词首字母大写

  • 3 、变量名的第一个单词小写,后面的单词首字母大写

四、Tomcat

1、Tomcat配置

在这里插入图片描述

五、数据库

1、jdbc.properties

开启批处理

: 
默认使用PreparedStatement是不能执行预编译的,这需要在url中给出useServerPrepStmts=true参数(MySQL Server 4.1之前的版本是不支持预编译的,而Connector/J5.0.5以后的版本,默认是没有开启预编译功能的)。
例如:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true
这样才能保证mysql驱动会先把SQL语句发送给服务器进行预编译,然后在执行executeQuery()时只是把参数发送给服务器。
当使用不同的PreparedStatement对象来执行相同的SQL语句时,还是会出现编译两次的现象,这是因为驱动没有缓存编译后的函数key,导致二次编译。如果希望缓存编译后函数的key,那么就要设置cachePrepStmts参数为trueMySQL的批处理也需要通过参数来打开:rewriteBatchedStatements=true
例如:jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

所以,三个都加上:useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true

2、创建表

create table persons
(
#设置主键,自增
id int not null auto_increment primary key,
address varchar(255),
city varchar(255)
)

Junit单元测试

  1. 测试分类
  • 黑盒测试:不需要写代码;给一个输入值,看是否输出期望值

  • 白盒测试:需要写代码;关注程序具体的运行流程

单元测试就是白盒测试的一种

  1. Junit使用

定义测试类(建议:test包/xxxTest)
包名:xx.xx.xx.test
定义测试方法(建议:void testxxx() ),加注解@Test表示可以独立运行
注解@Test需要导入Junit依赖
写测试方法(抵用需要测试的方法),最后不用return,用断言结果
断言:Assert.assertEquals (期望值, 结果值);
绿色:success
红色:fail
在这里插入图片描述

  1. 初始化方法和释放资源方法
    初始化方法(建议:init):加注解@Before,用于资源申请,所有测试方法在执行前都会先执行该方法
    释放资源方法(建议close):加注解@After,所有测试方法执行完后都会执行该方法
@Before
public void init(){
    System.out.println("初始化");
}
@After
public void close(){
    System.out.println("释放资源");
}

静态代码块获取src目录下文件路径

//maven项目的resources目录下的images目录里的11.jpg文件
 MyClass.class.getClassLoader().getResourceAsStream("images/11.jpg")
  • 省略getClassLoader()的写路径要多加个/
System.out.println(UserLogin_JPanel.class.getClassLoader().getResource("images/11.jpg").getPath());
System.out.println(UserLogin_JPanel.class.getResource("/images/11.jpg").getPath());
输出结果一样:
/E:/IDEA/myproject/MavenProject/target/classes/images/11.jpg
/E:/IDEA/myproject/MavenProject/target/classes/images/11.jpg
package cn.my.util;
import java.net.URL;
public class GetPath {
    private static String path;
    /**
     * 静态代码块,自动执行,只执行一次
     * 获取src目录下某个文件的路径
     */
    static {
        //类加载器
        ClassLoader classLoader=JDBCUtil.class.getClassLoader();
        //获得src目录下的jdbc.properties文件目录,返回是URL类型
        URL resource=classLoader.getResource("jdbc.properties");
        //得到文件路径,String类型
        path=resource.getPath();
        }
    public static void main(String[] args) {
        System.out.println(path);
     }
}

maven项目resources资源加载出错(无法加载除了resources文件夹以外的.xml和.properties文件)

maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题
解决方案:

<build>
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>
</build>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值