[个人笔记]零基础java,直接学习javaEE--第一天

--------------------以下是Java的笔记,应该会持续更新-------------------
小细节:
Javac 是jdk提供的工具 用于把.java编译为.class
null不能被打印
java也用+连接字符串
java project 不能直接新建文件夹要在vscode中新建项目(真奇怪
java的string和char : string:”” char:’’
框架编程时有时必须在类后写throws或者在类中捕获异常才能编译成功,这是因为有一些方法会抛出一些对程序没多大影响的奇怪异常比如SSL证书的异常(Fri Jul 19 15:35:36 CST 2024 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.)
Test

从helloworld开始
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
java 变量 由类变量(静态变量)成员变量(非静态变量)和局部变量
static为声明静态变量(类变量)
static 是 Java 中的一个关键字,用于声明类的成员变量、方法、代码块和嵌套类。让我们详细探讨一下 static 的含义和用法:

  1. 静态成员变量(类变量):
    o 被 static 修饰的成员变量属于类本身,而不是类的实例。它在内存中只有一份,被所有实例共享。
    o 生命周期与类相同,在整个应用程序执行期间都有效。
    o 静态成员变量在类初次加载时初始化,只有一份副本。
    o 示例:public static int count = 0;
    关于static更加详细的例子👇
    /Hello.java/
    package test;

public class Hello {
public static void main(String[] args) {
Helloworld.hello(args);
Helloworld ha=new Helloworld();
ha.haha(args);
}
}
/Helloworld.java/
package test;

public class Helloworld {
static void hello(String[] args) {
System.out.println("Hello World");
}
void haha(String[] args) {
System.out.println("HAHA World");
}
}

如果Helloworld.java的hello不用static则不能在Hello.java中直接调用,而是需要先实例化再调用

java注释: 风格与php相同

java变量: 风格与c相同先声明后赋值或同时声明赋值

妈了个逼的不知道为什么一package就报错
哈哈哈,我用IDEA解决了这个问题,谢谢IDEA!!
继续开始学习

java用户输入(类似py的input):
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 从键盘接收数据

    // next方式接收字符串
    System.out.println("next方式接收:");
    // 判断是否还有输入
    if (scan.hasNext()) {
        String str1 = scan.next();
        System.out.println("输入的数据为:" + str1);
    }
    scan.close();
}

}

Java注解@ 注解在java中属于一种比较高级而且麻烦的技术,非框架编写者基本不会用到这种技术。但是了解注解是个什么东西很重要,因为注解在框架的快捷配置中起了决定性的作用,也让no xml党们拥有了一个脱离xml配置的机会。了解注解可以让我们不止知其然还知其所以然,在使用框架的时候不至于迷迷糊糊的就@了个圈在上面。

Java类继承 (Java 继承 | 菜鸟教程 (runoob.com))
单类继承extends 语法 class 父类 { } class 子类 extends 父类 { }
多类继承implements 语法class 子类 implements 父类1,父类2{}
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。

Class关键字 👇
Class 类是 Java 中的一个特殊类,用于表示其他类的元数据。它包含了有关该类的信息,例如类名、包名、父类、实现的接口、所有方法、字段等1。
以下是 Class 类的一些常用方法:
getFields()
返回一个包含 Field 对象的数组,存放该类或接口的所有可访问公共属性(包括继承的公共属性)。
getDeclaredFields()
返回一个包含 Field 对象的数组,存放该类或接口的所有属性(不包括继承的属性)。
getField(String name)
返回一个指定公共属性名的 Field 对象。
getMethods()
返回一个包含 Method 对象的数组,存放该类或接口的所有可访问公共方法(包括继承的公共方法)。
getDeclaredMethods()
返回一个包含 Method 对象的数组,存放该类或接口的所有方法(不包括继承的方法)。
此外,还有其他方法用于获取类的完整信息、构造方法、父类、接口等。如果你想要获取某个类的 Class 实例,有三种常用方法:
直接通过一个类的静态变量 class 获取:Class cls = String.class;
如果有一个实例变量,可以通过该实例变量提供的 getClass() 方法获取:String s = "Hello"; Class cls = s.getClass();
如果知道一个类的完整类名,可以通过静态方法 Class.forName() 获取:Class cls = Class.forName("java.lang.String");

javaEE-----
废话少说放码过来: 这是一个获取name参数的类,当它被get访问时会println doget---SUC 然后println name参数的值

public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
String name=req.getParameter("name");
//PrintWriter out = resp.getWriter();
//out.println("name:"+name);
System.out.println("doGet------------SUC");
System.out.println(name);

}

}
//这是一个获取name参数的类,当它被get访问时会println doget---SUC 然后println name参数的值
//dopost同理👇
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
String name=req.getParameter("name");
if (name != null) {
System.out.println(name);
}

System.out.println("doPost------------SUC");

}

忘了说了javaee的web服务器项目文件夹webappweb-infweb.xml 存储着路由信息,格式如下👇



index

com.example.rejavaee.IndexServlet


index

/index


可以在web.xml定义路由信息,也可以在类中定义,使用@WebServlet即可 放码👇
@WebServlet("/new")
public class NewServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println(req.getParameter("new"));
}
}
小疑惑环节,继承的HttpServlet从哪来? 是来自import javax.servlet.xxx HttpServlet就在xxx的位置. Javax.servlet 是由maven获取的,.Maven 的外部库不会以文件形式保存在项目中,而是由 IDEA 自动管理并从本地 Maven 仓库加载。123 (👈无关紧要的知识)

除了doGet doPost @Override 还有一些其他的方法.
比如init方法初始化一些资源

@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 初始化数据库连接池、读取配置文件等
// ...
}

再比如处理客户端请求的核心方法
protected void service(HttpServletRequest req, HttpServletResponse resp)
//也可以用ServletRequest/Reponse(去掉前边的http)声明👆这样就可以处理非http协议

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (req.getMethod().equals("GET")) {
// 处理 GET 请求
// ...
} else if (req.getMethod().equals("POST")) {
// 处理 POST 请求
// ...
}
}

再比如服务器关闭(消亡)时执行的操作,destory
@Override
public void destroy() {
System.out.println("---------------------IndexServlet destroy");
}
差不多就是这样,上图总结的很好了.继续放码 ,这是一个接收用户传入并输出的方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
String name=req.getParameter("name");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("name:"+name);

System.out.println(name);
System.out.println("doGet------------SUC");
out.flush();
out.close();

}
out.flush() 可以确保在输出完整响应内容后立即发送数据,而 out.close() 则是在不再需要输出流时进行资源清理。

JavaEE数据库操作:
JavaEE-JDBC基础 - 简书 (jianshu.com)
JavaEE连接mysql 并查询数据 放码:
package com.example.rejavaee;

import java.sql.*;
import java.util.Scanner;

public class MyselectServlet {
public static void main(String[] args) throws ClassNotFoundException, SQLException {

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the username:");
    String s=sc.nextLine();
    System.out.println(s);


    Class.forName("com.mysql.jdbc.Driver");
    String url="jdbc:mysql://localhost:3306/security";
    Connection connection = DriverManager.getConnection(url,"root","114514");
    System.out.println(connection);
    //连接数据库👆
    //查询数据👇不安全写法
    String sql="select username from users where username="+"'"+s+"'";
    Statement statement=connection.createStatement();
    ResultSet rs = statement.executeQuery(sql);
    System.out.println(rs);
    while(rs.next()){
        String uname=rs.getString("username");
        System.out.println(uname);
    }
}

}//以上代码可以注入 ,用户输入admin' union select database()'即可注入
Java 预编译
若进行预编译,则上边的代码不能直接注入
预编译的写法:
String safesql="select * from security where username=?";
PreparedStatement preparedStatement=connection.prepareStatement(safesql);
preparedStatement.setString(1,s);
ResultSet resultSet=preparedStatement.executeQuery();
System.out.println(resultSet);

posted @ 2024-07-19 21:30  sesmof  阅读(2)  评论(0编辑  收藏  举报