标签 java 下的文章

实例化

客户端发送请求后首先判断是否存在Servlet实例,如果没有存在创建Servlet实例(Servlet的构造方法)。
构造方法

public ServletDemo(){
    
}

初始化

如果存在Servlet实例,则开始其初始化阶段,执行器初始化方法(init()方法)。
init 方法的定义如下:

public void init() throws ServletException {
  // 初始化代码...
}

服务

第三阶段是响应客户端请求阶段,调用service()方法,根据提交方式选择执行doGet()方法或者doPost()方法。
下面是该方法的特征:

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{

}
  • doGet() 方法

GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
    // Servlet 代码
}
  • doPost() 方法

POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    // Servlet 代码
}

销毁

最后是销毁阶段,程序结束或者是服务器停止,调用其销毁方法(destroy()方法)。
destroy 方法定义如下所示:

  public void destroy() {
    // 终止化代码...
  }

servlet

servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。

执行过程

  1. 客户端发送请求(以Get方式或者Post方式发送请求)http://localhost:8080/day08servlet/demo
  2. 在web.xml中找到

      <servlet-name>servletDemo</servlet-name>
      <url-pattern>/demo</url-pattern>

注:第一条中的请求路径对应的就是url-pattern中的请求路径。找到要执行的servletDemo,对应第三条中的servlet-name。
3.同样是在web.xml中,寻找

<!-- 创建一个servelet实例 -->
  <servlet>
      <servlet-name>servletDemo</servlet-name>
      <servlet-class>com.sunxiaoning.servlet.ServletDemo</servlet-class>
      <load-on-startup>2</load-on-startup>
  </servlet>

注:第二条中的servlet-name对应第三条中的servlet-name,并且我们可以根据servlet-class找到对应的类。load-on-startup表示在当前服务启动时自动创建,数字越小优先级越高,不建议使用0。
4.根据servlet-class我们找到请求对应的类信息,根据请求方式确定调用doGet()方法或者doPost()方法

概念

JDBC(java database connectivity )SUN公司提供的一套操作数据库的标准规范。是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

  • JDBC与数据库驱动的关系:接口与实现的关系。
  • JDBC规范(掌握四个核心对象):

    DriverManager:用于注册驱动
    Connection: 表示与数据库创建的连接
    Statement: 操作数据库sql语句的对象
    ResultSet: 结果集或一张虚拟表

  • 实现JDBC操作

    1、注册驱动
    2、创建连接
    3、得到执行sql语句的Statement对象
    4、执行sql语句,并返回结果
    5、处理结果
    6、关闭资源

常用的类和接口

java.sql.Drivermanager类

作用:创建连接

1.注册驱动

DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用
原因
导致驱动被注册2次,并且强烈依赖数据库的驱动jar
解决办法:Class.forName("com.mysql.jdbc.Driver");

2.与数据库建立连接
方式一:(常用)

static Connection getConnection(String url, String user, String password) 

试图建立到给定数据库 URL 的连接。
示例:
getConnection("jdbc:mysql://localhost:3306/user", "root", "root");
注意:
URL:SUN公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/user
协议 子协议 IP :端口号 数据库
mysql: jdbc:mysql://localhost:3306/user 或者 jdbc:mysql:///user(默认本机连接)
oracle: jdbc:oracle:thin:@localhost:1521:sid

方式二:

Properties info = new Properties();//要参考数据库文档
info.setProperty("user", "root");
info.setProperty("password","root");
getConnection(String url, Properties info);
getConnection(String url);

方式三:

DriverManager.getConnection("jdbc:mysql://localhost:3306/user?user=root&password=root");

java.sql.Connection接口

作用:建立一个连接
注意:接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
方法:Statement createStatement(); //创建操作sql语句的对象

java.sql.Statement接口

作用:操作sql语句,并返回相应结果的对象
注意:接口的实现在数据库驱动中。用于执行静态 SQL 语句并返回它所生成结果的对象。
方法:
1.ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
2.int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
3.boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;

注意:为防止SQL注入一般使用preparedStatement方法
preparedStatement:预编译对象, 是Statement对象的子类。
特点:

  • 性能要高;
  • 会把sql语句先编译;
  • sql语句中的参数会发生变化,过滤掉用户输入的关键字。

java.sql.ResultSet接口

作用:处理结果集
方法及作用

1.封装结果集的

  • 提供一个游标,默认游标指向结果集第一行之前。
  • 调用一次next(),游标向下移动一行。
  • 提供一些get方法。

封装数据的方法
Object getObject(int columnIndex); 根据序号取值,索引从1开始
Object getObject(String ColomnName); 根据列名取值。

2.将结果集中的数据封装到javaBean中

java的数据类型与数据库中的类型的关系

byte          tityint
short         smallint
int           int
long          bigint
float         float
double        double
String        char varchar 
Date         date

常用方法

  • boolean next()将光标从当前位置向下移动一行
  • int getInt(int colIndex)以int形式获取ResultSet结果集当前行指定列号值
  • int getInt(String colLabel)以int形式获取ResultSet结果集当前行指定列名值
  • float getFloat(int colIndex)以float形式获取ResultSet结果集当前行指定列号值
  • float getFloat(String colLabel)以float形式获取ResultSet结果集当前行指定列名值
  • String getString(int colIndex)以String 形式获取ResultSet结果集当前行指定列号值
  • String getString(String colLabel)以String形式获取ResultSet结果集当前行指定列名值
  • Date getDate(int columnIndex);以int形式获取Date结果集当前行指定列名值
  • Date getDate(String columnName); 以Date形式获取Date结果集当前行指定列名值
  • void close()关闭ResultSet 对象

可移动游标的方法

  • boolean next() 将光标从当前位置向前移一行。
  • boolean previous() 将光标移动到此 ResultSet 对象的上一行。
  • boolean absolute(int row) 参数是当前行的索引,从1开始,根据行的索引定位移动的指定索引行。
  • void afterLast() 将光标移动到末尾,正好位于最后一行之后。
  • void beforeFirst() 将光标移动到开头,正好位于第一行之前。

关闭资源

对象名.close();

注意:从小向大关闭。

不需要main方法,直接对其他方法进行测试,只要选中测试方法,直接运行,就可以显示要测试的方法的对与错,需要在测试方法前面写上@Test,然后导包。就可以运行了。需要注意的是:测试方法要求:不能有返回值,不能有参数。下面是小编写的一个小案例:

package com.sunxiaoning.demo;
import org.junit.Assert;
import org.junit.Test;
public class TestCalc {

    @Test
    public void test1() {
        Calc c = new Calc();
        Assert.assertEquals(9,c.add(3, 6));//第一个参数是期望值,第二个参数,实际值
    }
    @Test
    public void test2() {
        Calc c = new Calc();
        Assert.assertEquals(3,c.div(10, 3),0.4);//第一个参数是期望值,第二个参数,实际值,第三个参数浮动值
    }

}
class Calc {
    public int add(int a,int b) {
        return a+b;
    }
    public double div(double a,double b) {
        return a/b;
    }
}

final关键字用于修饰类、变量和方法,它有“这是无法改变的”或者“最终”的含义,因此被final修饰的为不能被继承,被final修饰的方法不能被子类重写,final修饰的变量(局部变量和成员变量)是常量,只能赋值一次。

1.final关键字修饰的类

java中的类被final关键字修饰后,该类将不能被继承,也不能够派生子类。为了避免被继承,被子类复写功能。

2.final关键字修饰方法

当一个类的方法被final关键字修饰后,这个类的子类将不能重写改方法。

3.final关键字修饰变量

java中被final修饰的变量(既可以修饰成员变量,有可以修饰局部变量)为常量,它只能被赋值一次,也就是说final修饰的变量一旦被赋值,其值不能改变。

注意:当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词间通过_连接。
注:内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。

配置目的

class文件(字节码文件)是java的运行文件,实现在任意目录下都可以执行某一目录下的class文件。

配置方法

1.永久性的环境变量,可在系统变量里添加环境变量

    变量名:CLASSPATH

    变量值:java类文件的目录

2.临时环境变量配置

set classpath=c:\

set classpath=c:\;

注意:可配置多路径set classpath=.;c:\;D:("."代表当前路径)

JVM查找类文件的顺序

如果没有配置classpath环境变量, JVM只在当前目录下查找要运行的类文件。

如果配置了classpath环境, JVM会先在classpath环境变量值的目录中查找要运行的类文件。

值的结尾处如果加上分号,那么JVM在classpath目录下没有找到要指定的类文件,会在当前目录下在查找一次。

值的结尾出如果没有分号,那么JVM在classpath目录下没有找到要指定的类文件,不会在当前目录下查找,即使当前目录下有,也不会运行。

建议:配置classpath环境变量时,值的结尾处不要加分号,如果需要访问当前目录可以用 “.”表示。

classpath与path的区别

path是系统用来指定可执行文件的完整路径,path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径;

classpath是指定你在程序中所使用的类(.class)文件所在的位置。

准备工作


1.云主机(系统为ubuntu server 14.04)

2.域名(可以没有,有的话需要备案)

3.ssh软件(Xshell 5)

安装jdk


Tale是用java语言编写的博客系统,因此必须先安装JDK8.

$ sudo add-apt-repository ppa:webupd8team/java

$ sudo apt-get update

$ sudo apt-get install oracle-java8-installer

安装结束后,我们验证是否成功

$ java -version

显示jdk版本等信息,就是安装成功了。

安装 oracle-java8-set-default 包

$ sudo apt-get install oracle-java8-set-default

配置环境变量

$ export JAVA_HOME=/usr/lib/jvm/java-8-oracle
$ export JRE_HOME=/usr/lib/jvm/java-8-oracle/jre

下载并安装Tale


下载源码

$ wget http://7xls9k.dl1.z0.glb.clouddn.com/tale.zip
$ unzip tale.zip

通过java命令运行tale.jar文件

$ cd tale
$ java -jar tale-1.2.15jar(通过ls命令查看是什么就填写什么)

安装配置 Nginx


安装

sudo apt-get install Nginx

打开配置文件

sudo vi /etc/nginx/sites-available/default

修改配置文件

加入proxy_pass http://127.0.0.1:9000;其他的注释掉

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

    #root /usr/share/nginx/html;
    #index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            # try_files $uri $uri/ =404;
            proxy_pass http://127.0.0.1:9000;
            # Uncomment to enable naxsi on this location
            # include /etc/nginx/naxsi.rules
    }

}

重启Nginx

sudo service nginx restart

最后在执行

nohup java -jar (tale启动程序路径) > (输出信息文件) 2>&1

最后输入域名访问就可以安装了

java中,当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这一问题,在java中专门提供了一个super关键字用于访问父类的成员(成员变量、成员方法和构造方法)。

使用super关键字调用父类的成员变量和成员方法

方法:

super.成员变量
super.成员方法([参数1,参数2……])

注意:

  1. super不是引用类型,super中储存的不是内存地址。
  2. super代表的是当前子类对象中父类型特征。
  3. 子类和父类都有某个数据时,如果需要在子类中访问父类中的数据,需要使用super。
  4. super可以用在成员方法中,也可以用在构造方法中。
  5. super和this相同,都不能用在静态方法中。

使用super关键字调用父类的构造方法

方法:

super([参数1,参数2……])

注意:

  1. 通过super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
  2. 在子类的构造方法中一定会调用父类的某个构造方法,这时可以在子类的构造方法中通过super指定调用父类的哪个构造方法,如果没有指定,在实例化子类对象时,会自动调用父类无参的构造方法。
  3. 通过子类的构造方法去调用父类的构造方法,作用是给当前子类对象中的父类型特征赋值。
  4. super([参数1,参数2……])与this([参数1,参数2……])不能共存。

在java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。

内部类的访问规则

  1. 内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this
  2. 外部类要访问内部类,必须建立内部类对象。

访问格式

  • 成员内部类

1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。
格式:

    外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

2.当内部类在成员位置上,就可以被成员修饰符所修饰。
比如,

  • private:将内部类在外部类中进行封装。
  • 静态内部类

当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。
注意:当内部类中定义了静态成员,该内部类必须是静态的。当外部类中的静态方法访问内部类时,内部类也必须是静态的。
格式:

外部类名.内部类名 变量名 = new 外部类名.内部类名();

当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物的内容。

  • 方法内部类

内部类定义在局部时,
1.不可以被成员修饰符修饰
2.可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。

匿名内部类

1.匿名内部类其实就是内部类的简写格式。
2.定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
3.匿名内部类的格式: new 父类或者接口(){定义子类的内容}
4.其实匿名内部类就是一个匿名子类对象。可以理解为带内容的对象。
5.匿名内部类中定义的方法最好不要超过3个。

java中,当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这一问题,在java中专门提供了一个super关键字用于访问父类的成员(成员变量、成员方法和构造方法)。

使用super关键字调用父类的成员变量和成员方法

方法:

super.成员变量
super.成员方法([参数1,参数2……])

注意:

  1. super不是引用类型,super中储存的不是内存地址。
  2. super代表的是当前子类对象中父类型特征。
  3. 子类和父类都有某个数据时,如果需要在子类中访问父类中的数据,需要使用super。
  4. super可以用在成员方法中,也可以用在构造方法中。
  5. super和this相同,都不能用在静态方法中。

使用super关键字调用父类的构造方法

方法:

super([参数1,参数2……])

注意:

  1. 通过super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
  2. 在子类的构造方法中一定会调用父类的某个构造方法,这时可以在子类的构造方法中通过super指定调用父类的哪个构造方法,如果没有指定,在实例化子类对象时,会自动调用父类无参的构造方法。
  3. 通过子类的构造方法去调用父类的构造方法,作用是给当前子类对象中的父类型特征赋值。
  4. super([参数1,参数2……])与this([参数1,参数2……])不能共存。