学习目标:
寒假期间学习javaweb和oracle并尝试自己连接好数据库
学习内容:
1、 掌握JavaWeb基本语法2、 学习Oracle基本知识
3、 数据库的连接
4、 前后端的连接
5、 软考
学习产出:
2022年1月5日Javaweb学习
动态web资源开发的技术统称为javaweb
每个能够访问的网站都存放于某台机器上 通过URL(统一资源定位符)进行访问
web应用程序要有Tomcat:服务器 来供外界访问 一个web应用由多个部分组成
- html css js
- jsp servlet
- java程序
- jar包
- 配置文件
发布网站
- 将自己写好的网站放到服务器(Tomcat)指定的web应用文件夹(webapps)下
技术
- ASP(微软 最早 在html中嵌入了vb的脚本 但是代码太多太乱了 维护成本高
- JSP/servlet:
B/S:浏览器/服务器
C/S:客户端/服务器
主要基于Java语言 可用的组件比较多 而且可以承受三高问题带来的影响(高并发 高可用 高性能) - php 开发速度快 功能强大 代码简单 跨平台 现在大多数网站都用php开发 但是无法承载大访问量
Web服务器
- IIS(windows自带
- Tomcat(已下载)
用来接收请求 返回相应
如何发布web网站
在webapp文件夹下新建一个文件夹用来存放自己的网站,但里面需要由初始文件(WEB-INF),建议复制rt文件夹之后删除多余文件,之后把自己网站中的html css等文件拖入即可,访问时输入这个网址即可http://localhost:8080/文件夹名/主页名
但目前好像还只是本地访问 还需要再深入了解
(在同一局域网下的其他设备访问网页需要将localhost改为电脑的ip 但没有外网映射仅限局域网访问)
下载安装Maven
https://maven.apache.org/download.cgi
下载解压bin结尾的压缩包 并给配置maven环境变量
M2_HOME:maven目录下的bin目录
MAVEN_HOME:maven目录
path中配置%MAVEN_HOME%\bin
cmd中输入mvn -version来测试maven是否安装成功
本地仓库
MySQL
查看所有数据库的名称:
*show databases;
查询某个数据库的字符集:
*show create database 数据库名称;
新建数据库
create database 数据库名称; (不可重复创建)
create database is not exists db1;(如果不存在就创建)
create database db3 character set gbk;(指定字符集gbk的数据库创建)
create database if not exists db4 character set gbk;(如果不存在 创建gbk字符集的db4数据库)
修改数据库
修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
alter database db4 character set utf8;(将db4的字符集改为utf8)
删除数据库
drop database 数据库名称;
drop database db4;
drop database if exists db3;(如果db3存在 就删除)
使用数据库
查询当前正在使用的数据库
select database();
使用某数据库
use数据库名;
use db1;
表的操作
创建
create table 表名(列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3,
列名4 数据类型4);
查询
查询某个数据库中的所有表的名称;
*show tables;
查询表结构
*desc 表名;
*desc student;
修改
删除
JDBC
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* JDBC快速入门
*/
public class jdbc {
public static void main(String[] args) throws Exception {
//1. 导入驱动jar包
//2.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
Connection conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
//4.定义sql语句
// String sql = "update account set balance = 2000 where id = 1";
String sql = "update emp set ename = 2000";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();
}
}
错误原因:jar包导入不对、数据库中没有代码中的表
以下是 利用JDBCTemplate对jdbc的简化
记得修改配置文件 导入相对于的jar包 和sql驱动
//是Spring框架对jdbc的简单封装 简化jdbc的开发
//这一节是jdbctemplate 要导入 jar包 好几个
//创建jdbctemplate对象 依赖于数据源datasource
//jdbctemplate的方法
//1.update 用来执行增删改语句
//2.queryFormap();查询结果将结果封装为map集合
//3.queryforlist();查询结果将结果封装为list集合
//4.query 查询结果 将结果封装为javabean对象
//5.queryforobject:查询结果 将结果封装为对象
package Springjdbc;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import utils.JDBCUtils;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
//练习用JDBCTemplate来执行DML语句
//1.修改数据
//2.增加记录
//3.删除刚才添加的记录
//4.查询所有的记录 将其封装为map集合
//5.查询id=1的记录 将其封装为map集合
//6.查询所有的记录 将其封装为list集合
//7.查询所有记录 将其封装为dept对象的List集合
//8.查询总的记录数Count*
//可以用junit单元测试 可以让方法独立执行
//不用 依赖主方法 可以每个都独立运行
public class SpringJdbcDemo2 {
private JdbcTemplate temp=new JdbcTemplate(JDBCUtils.getDataSource());
private String sql;
private int count;
@Test
public void test1()
{
//1.
sql="update dept set dname='软件工程'where id=2";
count=temp.update(sql);
System.out.println(count);
}
@Test
public void test2()
{
//sql="insert into dept(id,dname,loc) values(3,'物联网','五号楼')";//这是普通写法
sql="insert into dept(id,dname,loc) values(?,?,?)";
count=temp.update(sql,4,"计算机","五号楼");//这是preparedstatement的写法
System.out.println(count);
}
@Test
public void test3()
{
sql="delete from dept where id = ?";
count=temp.update(sql,2);
System.out.println(count);
}
@Test
public void test4()
{
sql="select * from dept where id=?";
Map<String, Object> map= temp.queryForMap(sql, 3);
System.out.println(map);//输出map集合 但map集合只能装一条记录
}
@Test
public void test5()
{
sql="select * from dept";
List<Map<String, Object>> list = temp.queryForList(sql);//list集合里面装的是一个一个map 将每条记录封装为map集合 再把map封装为list
//使用iter快捷键直接生成迭代器循环
/*
for (Map<String, Object> stringObjectMap : list) {
system.out.println(stringObjectMap);
}
*/
System.out.println(list);
}
@Test
public void test6()
{
sql="select * from dept";
//这里是匿名内部类
List<dept> list = temp.query(sql, new RowMapper<dept>() {//这是自己实现接口 也可以用提供的实现类
@Override
public dept mapRow(ResultSet rs, int i) throws SQLException {
dept Dept=new dept();
int id=rs.getInt("id");
String name=rs.getString("Dname");
String loc=rs.getString("loc");
Dept.setId(id);
Dept.setDname(name);
Dept.setLoc(loc);
return Dept;
}
});
System.out.println(list);
}
@Test
public void test6_2()//这是用提供的实现类
{
sql="select * from dept";
List<dept> list = temp.query(sql, new BeanPropertyRowMapper<dept>(dept.class));
for (dept dept : list) {
System.out.println(dept);//换行
}
System.out.println(list);//不换行
}
@Test
public void test7()
{
sql="select count(id)from dept";
Long total= temp.queryForObject(sql,Long.class);//用来执行聚合函数
System.out.println(total);
}
}
这是JDBCUtils的写法
package utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Druid连接池的工具类
*/
public class JDBCUtils {
//1.定义成员变量 DataSource
private static DataSource ds ;
static{
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
public static void close(Statement stmt,Connection conn){
/* if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}*/
close(null,stmt,conn);
}
public static void close(ResultSet rs , Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 获取连接池方法
*/
public static DataSource getDataSource(){
return ds;
}
}
下面开始javaweb的正式学习
创建javaweb工程需要创建JaveEE工程
在run-Edit Confident中可以配置Tomcat的一些参数
ServletDemo1
package com.example.servletdemo1;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//@WebServlet(urlPatterns = "/demo")
@WebServlet("/demo")//直接写也行 这是注解连接类和访问路径 不用调xml
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hahahahahah");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
ServletDemo2
package com.example.servletdemo1;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo2")
public class ServletDemo2 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("demo2已经运行了兄弟们!!!我宣布个事!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
GenericServlet
package com.example.servletdemo1;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/GenericServlet")
public class GenericServlet extends javax.servlet.GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("这是GenericServlt 把除service方法之外的方法都空实现了");
System.out.println("其它的 方法复写就行");
}
}
HttpServlet
package com.example.servletdemo1;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//0.判断请求方式String method=req.getmethod();
// if("GET."equals(method)){doGet();}
// else if("POST".equals(method)){doPost();}
//doget和dopost都被封装好了 判断语句也都封装好了 你直接复写doget和dopost就行了
//http有七种请求方式head,post,put,delete,options,trace
//GET:1.请求参数再请求行中 再url后拼着 2.请求的url长度有限制(不安全)
//POST:1.请求参数再请求体中 请求网址没有改变 参数被封装了 2.请i取得 url长度没有限制 (上传文件只能post)
@WebServlet("/HttpServlet")
public class HttpServlet extends javax.servlet.http.HttpServlet {
@Override//通过浏览器直接请求是get方式
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget哈哈哈哈哈 !");
}
@Override//post要通过表单来实现
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost!!哈哈哈哈哈!");
}
}
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="HttpServlet" method="post">
<input name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
请求行
GET/login.html HTTP/1.1
请求头
请求头名称:请求头值
都是一些信息
常见的请求头
User-Agent:浏览器告诉服务器 使用的浏览器版本信息 可以在服务器端获取该头信息 来解决浏览器的兼容性问题 通过不同的浏览器信息 来提供 不同的服务