java小白第六天之javaweb
写在前面
本文是边看黑马b站视频边写的一片笔记, 文中大多图片都来自黑马视频. 旨在巩固学习以及方便后续查阅和供广大朋友们学习, 感谢黑马视频分享
03 javaWeb
01 JDBC
java database connectivity
是java语言操作数据库的API, 一套标准接口
面向接口编程
代码示例
// 使用 jdbc api 连接数据库
public static void testJDBC01(){
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "root";
try (
// 2. 获取连接
Connection connection = DriverManager.getConnection(url, user, password);
// 4. 执行 sql
Statement statement = connection.createStatement();
)
{
// 1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 3. 定义 sql
String sql = "select * from account";
// 4. 执行 sql
ResultSet query = statement.executeQuery(sql);
// 5. 处理结果
System.out.println(query);
} catch (Exception e) {
e.printStackTrace();
}
}
01 jdbcAPI详解
01 DriverMapper
注册驱动
创建连接对象
02 Connection
获取执行 sql
对象
管理事务
代码示例
03 Statement
执行 sql 语句
04 ResultSet
05 PreparedStatement
06 数据库连接池
数据库连接池容器
使用步骤
代码示例
public static void main(String[] args) throws Exception{
// 1.导入 jar 包
// 2. 定义配置文件
// 3. 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("01jdbc/src/druid.properties"));
// 4. 获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 5. 获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
配置文件
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useServerPrepStmts=true
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
02 maven
提供了一套标准化的项目结构
提供了一套标准化的构建流程(编译 测试 打包 发布)
提供了一套依赖管理机制
01 maven 安装配置
配置maven环境变量
- 新建系统变量
MAVEN_HOME
表示 maven 安装的 bin 目录 - 将其添加到
Path
路径中%MAVEN_HOME%\bin
修改配置文件
<!-- 修改本地仓库位置 -->
<localRepository>H:\maven\apache-maven-3.8.4-bin\apache-maven-3.8.4\mven_repo</localRepository>
<!-- 修改本地仓库位置 -->
<!-- 添加 阿里云 远程仓库 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<!-- 添加 阿里云 远程仓库 -->
02 idea配置maven
maven 坐标详解
创建、导入 maven 项目
使用坐标导入 jar 包
依赖范围
03 HTTP
hyper text transfer protocol
HTTP请求数据格式
HTTP响应数据格式
状态码文档网址:https://cloud.tencent.com/developer/chapter/13553
04 Tomcat
Web 服务器是一个应用程序, 对 HTTP 协议的操作进行封装, 使得程序员不必直接对协议进行操作, 让 Web 开发更加便捷。 主要功能是 提供网上信息浏览服务
作用
- 封装 HTTP 协议操作, 简化开发
- 可以将 web 项目部署到服务器中去, 对外提供网上浏览任务
- Tomcat 是一个轻量级的 web 服务器, 支持 servlet、jsp少量 javaEE 规范
01 tomcat基本使用
官网下载, 直接解压即可, 解压目录就是安装目录
解压目录结构
bin ---- 可执行文件
config ---- 配置文件
lib ---- 依赖jar包
logs ---- 日志文件
temp ---- 临时文件
webapps ---- 存放web项目
work ---- 存放运行时数据 – jsp
02 IDEA创建 maven web 项目
idea maven web 项目架构图
03 IDEA 集成 tomcat
05 MyBatis
MyBatis 是一款优秀的持久层框架, 用于简化 JDBC 开发
一些注意事项
- pojo的属性名称需要和数据库表的字段名称一一对应, 若对应名称不一样,则不能自动封装
-
当两者无法一样时(前者大驼峰, 后者可能下划线)
- sql 语句中起别名 (不太方便)
- sql 片段 (也不方便)
resultMap
-
01 MyBatis 快速入门
目录架构
代码示例
01 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/world"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载mapper 映射文件-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
02 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
每一张表对应一个mapper映射文件
mapper映射文件:
+ 有一个根标签
<mapper namespace="mapper映射文件的标识">
// 书写sql语句
<select id="该sql语句的唯一标识,对应数据库操作的一个方法" resultType="sql语句返回结果类型">
select * from Blog where id = #{id}
</select>
</mapper>
-->
<mapper namespace="test">
<select id="selectAll" resultType="com.it.pojo.User">
select * from tb_user
</select>
</mapper>
03 User
package com.it.pojo;
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
public User(Integer id, String username, String password, String gender, String addr) {
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.addr = addr;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
04 加载 mybatis-config.xml 文件, 访问数据库
package com.it.controller;
import com.it.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.annotation.Resource;
import javax.jws.WebService;
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.InputStream;
import java.util.List;
@WebServlet("/demo01")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 加载 mapper 配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取 SqlSession 对象, 执行 Sql
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行 Sql
List<User> users = sqlSession.selectList("test.selectAll");
// 释放资源
sqlSession.close();
// 请求转发 响应数据到页面
req.setAttribute("users",users);
req.getRequestDispatcher("user.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
02 Mapper 代理
目录架构
代码示例
01 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/world"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载mapper 映射文件-->
<mapper resource="UserMapper1.xml"/>
<!-- 使用包扫描的方式加载对应包下的所有mapper映射文件 -->
<package name="com.it.mapper"/>
</mappers>
</configuration>
02 Usermapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.it.mapper.UserMapper">
<select id="selectAll" resultType="com.it.pojo.User">
select * from tb_user
</select>
</mapper>
03 pojo
package com.it.pojo;
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
public User(Integer id, String username, String password, String gender, String addr) {
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.addr = addr;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
04 mapper(interface)
package com.it.mapper;
import com.it.pojo.User;
import java.util.List;
// mapper 代理接口
public interface UserMapper {
// 根据 Sql 语句, 确定返回值的结果是一个还是集合
// 在mapper映射文件中, 写对应类的全类名就好
List<User> selectAll();
}
05 加载 mybatis-config.xml 访问数据库
package com.it.controller;
import com.it.mapper.UserMapper;
import com.it.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.annotation.Resource;
import javax.jws.WebService;
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.InputStream;
import java.util.List;
@WebServlet("/demo01")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 加载 mapper 配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取 SqlSession 对象, 执行 Sql
SqlSession sqlSession = sqlSessionFactory.openSession();
// 使用 mapper 代理执行 Sql
//List<User> users = sqlSession.selectList("test.selectAll");
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
// 释放资源
sqlSession.close();
// 请求转发 响应数据到页面
req.setAttribute("users",users);
req.getRequestDispatcher("user.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
03 MyBatis 核心配置文件
官网
标签顺序:
(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)
04 增删改查
01 查询所有
测试环节代码示例
02 查询详情
代码示例
<!--
参数占位符
#{}: 执行 sql 时, 会将#{}占位符替换为 ?, 将来自动设置参数值, 防止 sql 注入
传递参数使用
${}: 拼接sql, 存在sql注入问题
动态设置表名 列名使用
parameterType:
用于设置参数类型,可省略
sql 语句中特殊字符处理
特殊字符:sql语句的字符含义与xml文件的字符含义发生冲突时
处理方法
1. 转义字符(xml文件)
2. CDATA 区,此区域内书写的字符都是普通文本, 没有xml字符含义
-->
<select id="selectById" parameterType="int" resultType="com.it.pojo.User">
select * from tb_user where id = #{id};
</select>
03 条件查询
多参数传递
- 散装参数
- 对象参数
- map集合参数
分析图
04 动态条件查询
05 单条件动态查询
06 添加一条字段
插入一条id自增的字段, 返回字段id给对象user
07 修改
07 动态修改字段
08 删除
09 MyBatis 参数传递
09 注解开发
06 Servlet
- Servlet 是 java 提供的一门动态 web 资源开发技术
Servlet 学习内容
01 Sevlet快速入门
02 servlet 执行流程
03 Servlet 生命周期
04 Servlet 方法
05 Servlet 体系结构
06 servlet urlPattern 配置
07 XML 配置方式编写 Servlet
07 Request & Response
01 Request继承体系
02 request获取请求数据
代码示例
03 request 通用方式获取请求参数
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
04 请求转发
实现资源间的跳转访问, 共享请求数据资源
在转发的过程中可以修改 request
数据
// 请求转发
// 使用 forward 关键字, 携带 request response 数据, 跳转到资源(Servlet) demo02
request.getRequestDispatcher("/demo02").forward(request,response);
05 response
01 response 设置响应数据
02 response 重定向
特点
- 重定向地址栏发生变化,
- 可以重定向到任意位置的资源
- 两次请求, 不能再使用
request
共享数据
代码示例
// 重定向
resp.setStatus(302);
resp.setHeader("Location", "/java_web01/demo01");
// 重定向 简化方式
resp.sendRedirect("/java_web01/demo01");
03 路径问题
一般来说:
- 浏览器使用时, 需要加虚拟目录
- 服务端使用时, 不需要加虚拟目录
04 response 响应数据
代码示例
// response 获取的输出流默认的编码集是ISO-8859-1 无法解析中文
resp.setContentType("text/html;charset=utf-8");
// 使用输出流相应数据
//resp.setHeader("content-type","text/html"); // 设置response响应给浏览器的数据类型, 即告诉浏览器的解析方式
resp.getWriter().write("aaa");
resp.getWriter().write("<h1>欢迎您</h1>");
// 输出字节流
// 读取文件
FileInputStream fis = new FileInputStream("A:\\闯关地图.png");
// 获取 response 字节输出流
ServletOutputStream os = resp.getOutputStream();
//输出数据
int len = 0;
byte[] buffer = new byte[1024];
while((len = fis.read(buffer)) != -1){
os.write(buffer,0,len);
}
// 使用 commons-io
IOUtils.copy(fis,os);
// 关闭流
fis.close();
08 JSP
java server pages
java服务端页面
01 快速入门
JSP 本质上就是一个 Servlet
JSP 文件在被访问时, 由 JSP容器(Tomcat)将其转换位 java 文件 (Servlet), 由JSP容器将其编译成字节码文件, 提供服务
02 JSP 脚本
03 jsp 缺点
04 EL 表达式
用于简化 jsp 页面的 java 代码, 用于获取数据
使用JSTL标签结合EL获取Servlet中request域中的status的值
05 JSTL 标签
- JSP标准标签库(JSP Standarded Tag Library), 使用标签取代 JSP 页面上的 java 代码
c:foreach 代码示例
06 MVC模式与三层架构
MVC模式
三层架构
mvc 案例
sql 语句
USE world;
DROP TABLE IF EXISTS tb_brand;
CREATE TABLE tb_brand
(
id INT PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(20),
company_name VARCHAR(20),
ordered INT COMMIT("排序字段"),
description VARCHAR(100),
STATUS INT
)
INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)
VALUES('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),
('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人,每个家庭,每个组织,构建万物互联的智能世界',1),
('小米','小米科技有限公司',50,'are you ok',1)
具体功能
代码示例
brand_demo04
09 会话跟踪技术
01 Cookie
01 Cookie基本使用
客户端会话技术
Session
将数据存储在服务端,更加安全
案例
10 Fileter
JAVAWeb 三大组件 Servlet Filter Listener
01 Filter快速入门
02 Filter 执行流程
代码示例 filter示例
package com.it.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebFilter("/*")
public class DemoFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 放行前数据处理
// 放行前 request 有请求数据 response 没有响应数据
// 所以放行前只能处理request数据
System.out.println("filter...");
// 放行
filterChain.doFilter(servletRequest, servletResponse);
// 返回
// 返回后,资源响应数据 即 response 有了数据
// 此时, 可以处理 response 数据, 即 在返回处 处理 response 数据
}
public void destroy() {
}
}
03 Filter拦截路径配置
04 Filter 过滤器链
案例
过滤器拦截时,还需放行相关资源
代码示例-登录拦截
package com.it.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
// 放行有关登录的资源
// 创建数组 存储需要放行的资源
String[] urls = {"/css/","/images/",
"/login.jsp","/loginServlet",
"/register.jsp","/register"};
String url = req.getRequestURL().toString();
for (String u : urls) {
if (url.contains(u)){
// 需要放行
// 放行
System.out.println("111未登录");
filterChain.doFilter(req,servletResponse);
// 结束方法
// 即 需要放行的资源执行完毕, 返回此处时, 后续代码不需要执行
return;
}
}
// 不是和登录相关的资源
// 判断用户是否登录 在loginServlet中,将当前登录用户的信息存储到 session 中, 这里可以使用 session
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
if (user != null){
System.out.println("未登录");
// 已登录
// 放行
filterChain.doFilter(req,servletResponse);
}else {
// 未登录
System.out.println("未登录");
req.setAttribute("login_msg","您尚未登录,请登录!");
req.getRequestDispatcher("/login.jsp").forward(req,servletResponse);
}
}
public void destroy() {
}
}
11 Listener