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)
模板 | 介绍 |
---|---|
main | public static void main(String [] args){ } |
psvm | public 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来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
- GET与POST都有自己的语义,不能随便混用。
- 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
- 并不是所有浏览器都会在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/J在5.0.5以后的版本,默认是没有开启预编译功能的)。
例如:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true
这样才能保证mysql驱动会先把SQL语句发送给服务器进行预编译,然后在执行executeQuery()时只是把参数发送给服务器。
当使用不同的PreparedStatement对象来执行相同的SQL语句时,还是会出现编译两次的现象,这是因为驱动没有缓存编译后的函数key,导致二次编译。如果希望缓存编译后函数的key,那么就要设置cachePrepStmts参数为true。
MySQL的批处理也需要通过参数来打开: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单元测试
- 测试分类
-
黑盒测试:不需要写代码;给一个输入值,看是否输出期望值
-
白盒测试:需要写代码;关注程序具体的运行流程
单元测试就是白盒测试的一种
- Junit使用
定义测试类(建议:test包/xxxTest)
包名:xx.xx.xx.test
定义测试方法(建议:void testxxx() ),加注解@Test表示可以独立运行
注解@Test需要导入Junit依赖
写测试方法(抵用需要测试的方法),最后不用return,用断言结果
断言:Assert.assertEquals (期望值, 结果值);
绿色:success
红色:fail
- 初始化方法和释放资源方法
初始化方法(建议: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>