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

XML约束

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

1.DTD约束

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

<!DOCTYPE xxx SYSTEM "xxx.dtd">  //导入本地dtd文件,xxx是根标签元素名
<!DOCTYPE xxx PUBLIC “名称空间” "xxx.dtd">  //导入网络dtd文件

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

2.schema约束

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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
XML解析

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

Tomcat

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

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

<role rolename="manager-gui"/>
<user username="用户名" password="密码" roles="manager-gui"/>
自动加载

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

<Context path="/路由" docBase="文件路径" 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<Stu> list = new ArrayList<Stu>();
        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());   //报错
    }

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容