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作为配置文件,则被用来读取数据;若作为传输文件,则被用来写和读数据,常用的有Dom4j
和XPath
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()); //报错
}
该方法有第三个参数,代表结果的误差允许范围