寒假学习

学习目标:

寒假期间学习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包
  • 配置文件

发布网站

  1. 将自己写好的网站放到服务器(Tomcat)指定的web应用文件夹(webapps)下

技术

  • ASP(微软 最早 在html中嵌入了vb的脚本 但是代码太多太乱了 维护成本高
  • JSP/servlet:
    B/S:浏览器/服务器
    C/S:客户端/服务器
    主要基于Java语言 可用的组件比较多 而且可以承受三高问题带来的影响(高并发 高可用 高性能)
  • php 开发速度快 功能强大 代码简单 跨平台 现在大多数网站都用php开发 但是无法承载大访问量

Web服务器

  1. IIS(windows自带
  2. 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:浏览器告诉服务器 使用的浏览器版本信息 可以在服务器端获取该头信息 来解决浏览器的兼容性问题 通过不同的浏览器信息 来提供 不同的服务

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值