Javaweb总结一
一、SQL语言:DDL,DML,DQL,DCL
- DDL:操作数据库
- DDL:操作表
- DQL:查询
- 基础查询
- 条件查询
- 模糊查询
- 排序查询
- 聚合函数
- 分组查询
- 分页查询
二、约束
- 非空约束: 关键字是 NOT NULL:保证列中所有的数据不能有null值。
- 唯一约束:关键字是 UNIQUE:保证列中所有数据各不相同。
- 主键约束: 关键字是 PRIMARY KEY:主键是一行数据的唯一标识,要求非空且唯一。一般我们都会给没张表添加一个主键列用来唯一标识数据。
- 默认约束: 关键字是 DEFAULT:保存数据时,未指定值则采用默认值。
- 外键约束: 关键字是 FOREIGN KEY:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。
三、数据库设计
3.1 数据库设计的步骤
需求分析(数据是什么? 数据具有哪些属性? 数据与属性的特点是什么)
逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
维护设计(1.对新的需求进行建表;2.表优化)
3.2表的关系分为
1.一对一
2.多对一/一对多
3.多对多
四、多表查询
多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。我们通过具体的sql给他们演示,先准备环境
- 1.笛卡尔积:取 A,B 集合所有组合情况
- 2.内连接查询 :相当于查询AB交集数据
-- 隐式内连接
SELECT 字段列表 FROM 表1,表2… WHERE 条件;-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
- 3.外连接查询:
-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
- 1.左外连接查询 :相当于查询A表所有数据和交集部门数据
- 2.右外连接查询 : 相当于查询B表所有数据和交集部分数据
- 4.子查询:查询中嵌套查询,称嵌套查询为子查询。
五、事务
- 开启事务
START TRANSACTION;
或者
BEGIN;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
六、JDBC:JDBC 就是使用Java语言操作关系型数据库的一套API
/*** JDBC快速入门*/
public class JDBCDemo {public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName("com.mysql.jdbc.Driver");//2. 获取连接String url = "jdbc:mysql://127.0.0.1:3306/db1";String username = "root";String password = "1234";Connection conn = DriverManager.getConnection(url, username, password);//3. 定义sqlString sql = "update account set money = 2000 where id = 1";//4. 获取执行sql的对象 StatementStatement stmt = conn.createStatement();//5. 执行sqlint count = stmt.executeUpdate(sql);//受影响的行数//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();}
}
事务管理
* 开启事务 : BEGIN; 或者 START TRANSACTION;
* 提交事务 : COMMIT;
* 回滚事务 : ROLLBACK;
try {// ============开启事务==========conn.setAutoCommit(false);//5. 执行sqlint count1 = stmt.executeUpdate(sql1);//受影响的行数//6. 处理结果System.out.println(count1);int i = 3/0;//5. 执行sqlint count2 = stmt.executeUpdate(sql2);//受影响的行数//6. 处理结果System.out.println(count2);// ============提交事务==========//程序运行到此处,说明没有出现任何问题,则需求提交事务conn.commit();} catch (Exception e) {// ============回滚事务==========//程序在出现异常时会执行到这个地方,此时就需要回滚事务conn.rollback();e.printStackTrace();}
七、Maven:专门用于管理和构建 Java 项目的工具
Maven 坐标主要组成
groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
version:定义当前项目版本号
步骤
1.在项目的 pom.xml 中编写 标签
2. 在 标签中 使用 引入坐标
3. 定义坐标的 groupId,artifactId,version
4.
通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境。注意还有一个scope标签, servlet-api ,在使用它时,必须将 scope 设置为该值,不然运行时就会报错
八、HTTP(HyperText Transfer Protocol)超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
GET 请求和 POST 请求区别:
1.GET 请求请求参数在请求行中,没有请求体。
POST 请求请求参数在请求体中
2.GET 请求请求参数大小有限制,POST 没有
九、Tomcat
1.创建Maven Web项目(不使用骨架版)
具体的步骤包含:
1.创建Maven项目
2.选择不使用Web项目骨架
3.输入Maven项目坐标创建项目
4.在pom.xml设置打包方式为war
5.补齐Maven Web项目缺失webapp的目录结构
6.补齐Maven Web项目缺失WEB-INF/web.xml的目录结构
2.是在pom.xml里面添加Tomcat插件
<build><plugins><!--Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins>
</build>
十、 Servlet
Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。
使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。
Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
4.2 快速入门
需求分析: 编写一个Servlet类,并使用IDEA中Tomcat插件进行部署,最终通过浏览器访问所编写的Servlet程序。
- 创建Web项目
web-demo
,导入Servlet依赖坐标
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!--此处为什么需要添加该标签?provided指的是在编译和测试过程中有效,最后生成的war包时不会加入因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错--><scope>provided</scope>
</dependency>
- 创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
package com.itheima.web;import javax.servlet.*;
import java.io.IOException;public class ServletDemo1 implements Servlet {public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("servlet hello world~");}public void init(ServletConfig servletConfig) throws ServletException {}public ServletConfig getServletConfig() {return null;}public String getServletInfo() {return null;}public void destroy() {}
}
- 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet("/demo1")
-
- 访问:启动Tomcat,浏览器中输入URL地址访问该Servlet
http://localhost:8080/web-demo/demo1
httpServlet
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//TODO GET 请求方式处理逻辑System.out.println("get...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//TODO Post 请求方式处理逻辑System.out.println("post...");}
}
十一、Request&Response
Request是请求对象,Response是响应对象
HTTP请求数据中包含了请求行、请求头和请求体,针对这三部分内容,Request对象都提供了对应的API方法来获取对应的值:
请求行
getMethod()获取请求方式
getContextPath()获取项目访问路径
getRequestURL()获取请求URL
getRequestURI()获取请求URI
getQueryString()获取GET请求方式的请求参数
请求头
getHeader(String name)根据请求头名称获取其对应的值
请求体
注意: 浏览器发送的POST请求才有请求体
如果是纯文本数据:getReader()
如果是字节数据如文件数据:getInputStream()
2.4 请求参数中文乱码问题
2.4.1 POST请求解决方案
分析出现中文乱码的原因:
POST的请求参数是通过request的getReader()来获取流中的数据
TOMCAT在获取流的时候采用的编码是ISO-8859-1
ISO-8859-1编码是不支持中文的,所以会出现乱码
解决方案:
页面设置的编码格式为UTF-8
把TOMCAT在获取流数据之前的编码设置为UTF-8
通过request.setCharacterEncoding(“UTF-8”)设置编码,UTF-8也可以写成小写
2.4.2 GET请求解决方案
GET请求获取请求参数的方式是request.getQueryString()
POST请求获取请求参数的方式是request.getReader()
request.setCharacterEncoding(“utf-8”)是设置request处理流的编码
getQueryString方法并没有通过流的方式获取数据
十二、会话
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
Cookie
- 发送Cookie
- 创建Cookie对象,并设置数据
Cookie cookie = new Cookie("key","value");
- 发送Cookie到客户端:使用response对象
response.addCookie(cookie);
2 获取Cookie
- 获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
- 遍历数组,获取每一个Cookie对象:for
使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
对于Cookie的实现原理是基于HTTP协议的,其中设计到HTTP协议中的两个请求头信息:
响应头:set-cookie
请求头: cookie
Session的基本使用
1.概念
Session:服务端会话跟踪技术:将数据保存到服务端。
1.获取 Session 对象
HttpSession session = request.getSession();
2.Session 对象功能:
void setAttribute(String name, Object o):存储数据到 session 域中
Object getAttribute(String name):根据 key,获取值
void removeAttribute(String name):根据 key,删除该键值对
Session 销毁:
默认情况下,无操作,30 分钟自动销毁
<session-config><session-timeout>30</session-timeout>
</session-config>
十三、Filter&Listener
1.开发步骤
进行 Filter 开发分成以下三步实现
定义类,实现 Filter接口,并重写其所有方法
配置Filter拦截资源的路径:在类上定义 @WebFilter
注解。而注解的 value 属性值 /* 表示拦截所有的资源
在doFilter方法中输出一句话,并放行:
chain.doFilter(request,response)//就是放行,让其执行本该执行的代码
pom.xml
配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>filter-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>80</port></configuration></plugin></plugins></build>
</project>
@WebFilter("/*")
public class FilterDemo implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("FilterDemo...");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter
注解进行配置。如:@WebFilter("拦截路径")
拦截路径有如下四种配置方式:
- 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
- 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
- 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
- 拦截所有:/*:访问所有资源,都会被拦截
Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
这里面只有 ServletContextListener 这个监听器后期我们会接触到,ServletContextListener 是用来监听 ServletContext 对象的创建和销毁。
1.代码演示
我们只演示一下 ServletContextListener
监听器
定义一个类,实现ServletContextListener 接口
重写所有的抽象方法
使用 @WebListener
进行配置
@WebListener
public class ContextLoaderListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {//加载资源System.out.println("ContextLoaderListener...");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {//释放资源}
}