JavaWeb 基础

Web工程目录结构

WEB ROOT:根目录
  -WEB-INF:该目录下的文件不能被外部直接访问,是整个WEB中最安全的目录,名字固定
    -classes:编译后生成的*.class文件(编译前的java文件在src中)
    -lib:第三方jar包
    -web.xml:WEB配置信息,如映射文件
  -css:所有的css文件
  -js:所有的js文件
  -jsp:所有的jsp文件
  -index.htm、index.jsp:首页

XML

可扩展标记语言,所有标签都是自定义的,主要用于存储数据、配置文件和数据传输,在工程项目当中常用

格式规范

1.必须在第一行规定版本和编码:,版本号固定1.0,编码默认为iso-8859-1,还有standalone代表文档是否独立(yes/no),一般可以不用设置。注意开头的?两边不要有空格
2.文档中有且只能有一个根元素
3.所有标签元素必须正确嵌套和闭合
4.标签元素名称不能数字开头,区分大小写
5.因为<>会被解析成标签的符号,所以在内容里用</>来代替,或者用使内容原样显示
6.属性必须要单引号或者双引号括起来
7.注释语句:<!-- -->

XML约束

在一些项目当中有时需要定义xml规则,即规定一些该xml文件中可使用的标签和使用方法等。主要分为dtd约束和schema约束

1.DTD约束

又分为内部dtd和外部dtd
(1)内部dtd:在xml文件内部定义dtd
(2)外部dtd:在外部文件中定义dtd,举例:

  //导入本地dtd文件,xxx是根标签元素名
  //导入网络dtd文件

但是dtd约束一般不太严谨,所以常用schema约束

2.schema约束

通过导入xsd文件完成约束,不但能控制标签名称、属性等,还能控制属性类型、值的范围等,导入步骤:
(1)编写根标签
(2)在根标签引入实例名称空间:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
(3)在根标签引入名称空间:xsi:schemaLocation="链接 文件名"
(4)引入默认的名称空间
举例:


XML解析

当xml作为配置文件,则被用来读取数据;若作为传输文件,则被用来写和读数据,常用的有Dom4jXPath

Tomcat

目录结构
bin:可执行文件
conf:配置文件
  -server.xml:主要的配置文件
lib:tomcat运行所需jar包
logs:运行产生的日志
temp:运行产生的临时文件
webapps:用户的应用目录
work:tomcat运行时的工作目录
tomcat登录账号设置

在conf里的tomcat-users.xml文件中配置:



自动加载

默认Tomcat是不会自动加载数据的,但可以通过在server.xml里配置reloadable参数为true实现,举例:


但自动加载功能因为要一直监视类,容易影响服务器性能,所以一般仅在开发时使用

端口占用导致无法启动

假如8080端口已经被占用而无法启动Tomcat的时候,可以在命令行输入:netstat -ano,找到端口号为8080的进程ID,然后将该进程关闭即可

JDBC

JDBC(Java Database Connectivity)是sun公司提供的一套用来操作数据库的标准规范,需要导入相关jar包

四个核心对象

1.DriverManager

用于注册驱动,通过registerDriver方法注册

2.Connection

用于数据库的连接,当建立连接后可以创建sql语句对象,常用的有:
(1)createStatement():创建存放sql语句的Statement对象,里面放入一个完整的sql语句
(2)PreparedStatement():创建存放sql语句的PreparedStatement对象,和上面不同的是该方法生成的对象可以进行预编译,即可以在sql语句需要加入数据的地方用?替代,然后通过setString()来添加数据,对数据进行判断,从而防止sql注入的危险,因此一般也用该方法比较多。举例:

String sql = "select * from peoples where id=? or id=?";
PreparedStatement stmt = conn.prepareStatement(sql);  //预编译sql语句对象
stmt.setString(1, "1");  //设置第一个?的值
stmt.setString(2, "2");
        
ResultSet rs = stmt.executeQuery(); //执行查询语句
3.Statement

操作数据库的sql语句对象,其下操作语句方法:
(1)executeQuery():用于操作查询语句,会返回查询的结果集
(2)executeUpdate():用于增删改等DML语句,或者不返回任何内容的sql语句,结果返回受影响的行数
(3)execute():用于执行各种sql语句,返回boolean,表示是否有结果集返回

4.ResultSet

表示结果集,会提供一个游标,默认位置在第一个结果之前,其有以下方法:
(1)next():游标往后移动一位,若返回false则表示已经到最后一位数据;游标往前移一位则用previous()
(2)absolute():将游标移动到固定位置
(3)afterLast():将游标移动到末尾;将游标移动到开头则用beforeFirst()
(4)getObject(int/字段):根据第几列返回那一列的对象,或者根据字段返回那个字段的对象
(5)getString(int/字段):和上面方法同理,返回的是字符串,还有返回各种数据类型的方法

连接举例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception {
        // DriverManager.registerDriver(new com.mysql.jdbc.Driver());   //注册驱动,但因为这样会多注册一次,并且依赖jar包,不建议使用
        Class.forName("com.mysql.jdbc.Driver"); //通过反射机制更好的解耦和
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库", "用户名", "密码");  //建立连接
        Statement stmt = conn.createStatement();  //创建sql语句对象
        ResultSet rs = stmt.executeQuery("select * from peoples");  //执行查询语句
        List list = new ArrayList();
        while (rs.next()) {  //当存在下一个结果时
            Stu s = new Stu();
            s.setId(rs.getInt("id"));   //获取id字段内容并设置id值
            s.setName(rs.getString("username"));
            list.add(s);    //添加到列表
        }
        for (Stu stu : list)
            System.out.println(stu);
        rs.close(); //最后记得关闭资源
        stmt.close();
        conn.close();
    }
}

class Stu {
    private int id;
    private String name;

    public void setId(int id) {this.id = id;}
    public void setName(String name) {this.name = name;}
    public String toString() {
        return "id:" + this.id + ",name:" + this.name;
    }
}
事务处理

在创建sql语句对象前通过setAutoCommit(false)来开启事务处理,当事务顺利完成时通过commit()提交事务,若需要回滚,则通过rollback()实现,举例:

try {
    conn.setAutoCommit(false); // 开启事务
    PreparedStatement stmt = conn.prepareStatement("select * from peoples where id=?");
    stmt.setString(1, "1");

    ResultSet rs = stmt.executeQuery();
    conn.commit();  //事务成功完成时提交
} catch (Exception e) {
    try {
        conn.rollback();  //当出错时回滚
    } catch (SQLException e1) {
        e1.printStackTrace();
    } finally {
        conn.close();
    }
}
数据库连接池

每当一个客户端进行数据操作时,将需要建立一个数据库连接,这样十分浪费资源。因此可以构建一个连接池来存储一定的连接供给

DataSource

javax.sql下定义的连接池接口,主要需要实现里面的两个getConnection()重载方法

DBUtils

是Apache提供的数据库操作工具,里面封装了对JDBC的操作,从而简化代码开发,需要自己导入jar包。对于表的读操作,其可以把结果转换成List、Array、Set等集合;对于表的写操作只需写sql语句

三个核心对象
1.QueryRunner类

主要有以下方法:
(1)query():用于执行select语句
(2)update():用于执行insert/update/delete语句
(3)batch():批处理,即执行多个语句

2.ResultSetHandler接口

用于定义select操作后对结果集的封装

3.DBUtils类

定义了关闭资源与事务处理的方法

Junit测试

原来要测试一个方法是否有问题一般是写进main方法中,然后测试,而在org.junit下提供了Test类来实现单元测试,此时只需要加个@Test标签,即可不用加进main方法也能进行测试,但被测试的方法要求在public类中,且不能有参数和返回值,同时也不要有main方法,举例:

import org.junit.Test;

public class Test {
    int num = 100;
    @Test
    public void jt1(){
        System.out.println(this.num);
    }
    @Test
    public void jt2(){
        System.out.println("dasda");
    }
}

结果:
100
dasda

可以看出两个都会执行

断言

org.junit下提供了Assert的断言类,里面有assertEquals(expected, method)方法,当调用的方法返回结果和期望值不同时则会报错,举例:

import org.junit.Assert;
import org.junit.Test;

public class Test {
    int num = 100;
    public int getNum(){
        return this.num;
    }
    
    @Test
    public void jt1(){
        System.out.println(this.num);
        Assert.assertEquals(1, num/100);    //正确
        Assert.assertEquals(1, getNum());   //报错
    }

该方法有第三个参数,代表结果的误差允许范围

你可能感兴趣的:(JavaWeb 基础)