JDBC中的JAVAEE结构

一、JavaEE结构

客户端-服务器端


二、Dao模式(Data Access Object 数据访问对象)

  • 1.现将数据库和java连接的外接jar导入。将第一讲的类JDBC放入util包内,并且导入properties文件(student改为新的数据库user)。
  • 2.新建数据库为user,建立一个属性有id/name/password的表t_user

  • 3.建立四个包:dao(里面声明数据库访问规则) impl(具体实现早前定义的规则) test(直接使用实现) util
  • 4.dao包内建立一个UserDao的接口
1
2
3
4
5
6
7
8
9
package dao;

import java.sql.SQLException;

public interface UserDao {

void findAll() throws SQLException; //里面写具体要干的方法

}
  • 5.impl包内建立一个UserDaoImp类—>UserDao接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

package impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import dao.UserDao;
import util.JDBC;
public class UserDaoImp implements UserDao{ ///实现UserDao的接口 去完成具体实现代码

@Override
public void findAll() throws SQLException {
//1.获得连接对象
java.sql.Connection conn=JDBC.getConn();

//2.根据连接对象,得到statement
java.sql.Statement st=null;
try {
st = conn.createStatement();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

//3.执行sql语句,返回ResultSet
String sql="select * from t_user"; //写sql语句
ResultSet rs = st.executeQuery(sql);//返回给ResultSet对象 st连接对象去调用Query方法

//4.遍历
while(rs.next())
{
int id=rs.getInt("id");
String name=rs.getString("name");
String age=rs.getString("password");
System.out.println("id="+id+" name="+name+" age="+age);
}

}
}
  • 6.test包内建立testUserDaoImpl类去使用Junit单元测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test;
import java.sql.SQLException;
import org.junit.Test;
import dao.UserDao;
import impl.UserDaoImp;
public class testUserDaoImpl {

@Test //点击项目右键选择Junit单元测试的(4)---然后@Test即可
public void testFindAll() throws SQLException
{
UserDao dao=new UserDaoImp(); //面向接口编程
dao.findAll(); //对象调用方法
}

}

  • 7.util包内存放的就是原来写好的JDBC类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class JDBC{
//写在外面好更改
static String driverClass=null;
static String url=null;
static String name=null;;
static String password=null;

static{

//1.创建一个属性配置对象
Properties properties=new Properties();

InputStream is=JDBC.class.getClassLoader().getResourceAsStream("properties"); //类.class.getClassLoader().getResourceAsStream("文件名");
//2.导入输入流
try {
properties.load(is); //load方法加载
} catch (IOException e) {
e.printStackTrace();
}

//3.调用方法读取文档里面的url/name/password等
driverClass=properties.getProperty("driverClass");
url=properties.getProperty("url");
name=properties.getProperty("name");
password=properties.getProperty("password");
}

public static java.sql.Connection getConn(){
java.sql.Connection conn=null;
//1.注册驱动
//DriverManager.registerDriver(new Driver()); //需要一个参数 这个参数是java.sql.jdbc.Driver
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//2.建立连接(url协议+数据库,user账号,password密码)
try {
conn=DriverManager.getConnection(url,name,password);
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return conn;
}

public static void main(String[] args) throws SQLException{
java.sql.Connection conn = getConn();
//3.创建statement,跟数据库打交道,一定需要这个对象
java.sql.Statement st=conn.createStatement();

//4.执行查询
String sql="select * from s_stu";
ResultSet rs=st.executeQuery(sql);

//5.遍历每一条查询
while(rs.next()) //是否可以移动到下一行
{
int id=rs.getInt("id"); //获得id
String name=rs.getString("name"); //获得name
int age=rs.getInt("age"); //获得age
System.out.println("id="+id+" name="+name+" age="+age);
}

//6.释放
rs.close();
}

public static void release(java.sql.Connection conn, java.sql.Statement st, ResultSet rs) {
// TODO 自动生成的方法存根

}
}
  • 8.properties文件内内容:
1
2
3
4
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/user
name=root
password=njdxrjgc7777777.

代码实现框架:


三、增加登录界面

1. Dao包的UserDao类增加一个 login方法

1
void login(String username,String password) throws SQLException;

2. impl包的UserDaoImp增加一个实现方法(只是更改了sql语句)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

public void login(String username,String password) throws SQLException {
//1.获得连接对象
java.sql.Connection conn=JDBC.getConn();

//2.根据连接对象,得到statement
java.sql.Statement st=null;
try {
st = conn.createStatement();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

//3.执行sql语句,返回ResultSet
String sql="select * from t_user where name='"+ username +"' and password='"+ password +"'"; //写sql语句
ResultSet rs = st.executeQuery(sql);//返回给ResultSet对象 st连接对象去调用Query方法

//4.遍历
if(rs.next())
{
System.out.println("成功");
}
else
{
System.out.println("失败");
}

}

3. test包内的testUserDaoImpl类增加一个调用方法(dao.login(“xxx”,”yyy”))

1
dao.login("admin","10086");


四、statement安全问题

执行原理:是进行拼接sql语句的过程(先拼接,后执行)


五、PreparedStatement

更改目录代码(主要是2.3步更改)

  • 原来的statement是先创建statement对象,然后书写sql语句最后进行调用executeQuery()方法
  • 现在的preparedstatement是先写sql语句(判定条件都写?),然后调用方法去检验,之后使用setString()方法进行,最后调用executeQuery()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void login(String username,String password) throws SQLException {
//1.获得连接对象
java.sql.Connection conn=JDBC.getConn();

//2.预先对sql语句校验(?把它认为是字符串)
String sql="select * from t_user where name=? and password=?"; //写sql语句 "
java.sql.PreparedStatement ps=conn.prepareStatement(sql);
//?对应的索引从1开始
ps.setString(1, username);
ps.setString(2, password);

ResultSet rs = ps.executeQuery();//返回给ResultSet对象 st连接对象去调用Query方法

//4.遍历
if(rs.next())
{
System.out.println("成功");
}
else
{
System.out.println("失败");
}

}

  • 总结:

1. 先写sql语句(增删查改)

1
String sql="select * from t_user where name=? and password=?";  //写sql语句    "

2. 预先对sql语句校验(?把它认为是字符串)

1
2
3
java.sql.PreparedStatement  ps=conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);

3. 调用方法进行执行

1
ResultSet rs = ps.executeQuery();

六、利用preparedstatment—-增删查改

1. dao包里面的UserDao类里面写增删查改的方法

1
2
3
4
5
6
7
8
9
10
11
12
public interface UserDao {

void update(int id , String name); //更新(利用id去更新)

void delete(int id); //删除(利用id去删除)

void insert(String userName , String password); //插入(id可以通过sql语句自己写)

void findAll(); //查询展示所有的

void login(String username , String password); //登录
}

2. impl包里面的UserDaoImpl类里面写增删查改的具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
public class UserDaoImpl implements UserDao{

@Override
public void findAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1. 获取连接对象
conn = JDBCUtil.getConn();
//2. 创建statement对象
st = conn.createStatement();
String sql = "select * from t_user";
rs = st.executeQuery(sql);

while(rs.next()){
String userName = rs.getString("username");
String password = rs.getString("password");
System.out.println(userName+"="+password);
}

} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}

@Override
public void login(String username, String password) { //登录

Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1. 获取连接对象
conn = JDBCUtil.getConn();
//2. 创建statement对象
String sql = "select * from t_user where username=? and password=?";

//预先对sql语句执行语法的校验, ? 对应的内容,后面不管传递什么进来,都把它看成是字符串。 or select
PreparedStatement ps = conn.prepareStatement(sql);
//? 对应的索引从 1 开始。
ps.setString(1, username);
ps.setString(2, password);

rs = ps.executeQuery();
if(rs.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}

} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}




@Override
public void insert(String userName, String password) { //插入
Connection conn = null;
PreparedStatement ps = null;

try {
conn = JDBCUtil.getConn();
String sql = "insert into t_user values(null , ? , ?)";
ps = conn.prepareStatement(sql);

//给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
ps.setString(1, userName);
ps.setString(2, password);


int result = ps.executeUpdate();
if(result>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, ps);
}
}

@Override
public void delete(int id) { //删除
Connection conn = null;
PreparedStatement ps = null;

try {
conn = JDBCUtil.getConn();
String sql = "delete from t_user where id = ?";
ps = conn.prepareStatement(sql);

//给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
ps.setInt(1, id);


int result = ps.executeUpdate();
if(result>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, ps);
}
}

@Override
public void update(int id, String name) { //更新
Connection conn = null;
PreparedStatement ps = null;

try {
conn = JDBCUtil.getConn();
String sql = "update t_user set username=? where id =?";
ps = conn.prepareStatement(sql);

//给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
ps.setString(1, name);
ps.setInt(2, id);


int result = ps.executeUpdate();
if(result>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, ps);
}
}


}

3. test包里面的TestUserDaoImpl类里面写增删查改的直接调用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class TestUserDaoImpl {
@Test
public void testInsert(){ //测试插入

UserDao dao = new UserDaoImpl();

dao.insert("aobama", "911");
}

@Test
public void testUpdate(){ //测试更新

UserDao dao = new UserDaoImpl();

dao.update(2, "itheima");
}

@Test
public void testDelete(){ //测试删除

UserDao dao = new UserDaoImpl();

dao.delete(30);
}

@Test
public void testFindAll(){ //测试查询所有

//面向父类编程 接口编程
UserDao dao = new UserDaoImpl(); //体现多态的特征
dao.findAll();
}

@Test
public void testLogin(){
UserDao dao = new UserDaoImpl();
dao.login("admin", "100234khsdf88' or '1=1");
}

}

数据库的CRUD

数据库(sql)—-增删查改(CRUD)

  • 开始的数据库:

其中四个增删查改的操作

  • insert(插入)

       //插入全部
    insert into t_stu (id,name,age) 
    values ('4','wangqiang',28)    
       //插入一部分
    insert into t_stu (name,age) 
    values ('wangqiang',28)
  • delete(删除)

    delete 
    from s_stu
    where id=6    
  • query(查询)

    select  */列/行
    from t_stu(表)
    where  name='wangwu'
  • update(更新)

    update t_stu(表)
    set id=6
    where age=5;

一、查询

查询的sql语句:

1
String sql="select * from s_stu where name='lisi'";  //写sql语句

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package CRUDlianxi;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
public class MainTest {
public static void main(String[] args) throws SQLException {

//1.获得连接对象
java.sql.Connection conn=JDBC.getConn();

//2.根据连接对象,得到statement
java.sql.Statement st=conn.createStatement();

//3.执行sql语句,返回ResultSet
String sql="select * from s_stu where name='lisi'"; //写sql语句
ResultSet rs=st.executeQuery(sql); //返回给ResultSet对象 st连接对象去调用Query方法

//4.遍历
while(rs.next()) //判断是不是有下一个
{
int id=rs.getInt("id");
String name=rs.getString("name");
int age=rs.getInt("age");
System.out.println("id="+id+" name="+name+" age="+age);
}

}
}

查询结果如下:


二、修改

  主要是更改为st调用executeUpdate(sql)方法,结果返回给一个整数rs,判断rs得知结果修改正确与否

1
2
3
4
5
6
7
8
9
10
11
12
//3.执行sql语句,返回ResultSet
String sql="update s_stu set id=22 where age=18"; //写sql语句
int rs=st.executeUpdate(sql); //返回给ResultSet对象 st连接对象去调用Query方法

//4判断是不是修改正确
if(rs >0 ){
System.out.println("更新成功");
}
else
{
System.out.println("更新失败");
}

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package CRUDlianxi;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
public class MainTest {
public static void main(String[] args) throws SQLException {

//1.获得连接对象
java.sql.Connection conn=JDBC.getConn();

//2.根据连接对象,得到statement
java.sql.Statement st=conn.createStatement();

//3.执行sql语句,返回ResultSet
String sql="update s_stu set id=22 where age=18"; //写sql语句
int rs=st.executeUpdate(sql); //返回给ResultSet对象 st连接对象去调用Query方法

//4判断是不是修改正确
if(rs >0 ){
System.out.println("更新成功");
}
else
{
System.out.println("更新失败");
}

}
}

修改结果如下:

修改之后数据库的样子:


三、删除

  和修改操作相比只是sql语句不同,调用的方法都相同。

1
2
3
4
5
6
7
8
9
10
11
//3.执行sql语句,返回ResultSet
String sql="delete from s_stu where id=22"; //写sql语句
int result = st.executeUpdate(sql);//返回给ResultSet对象 st连接对象去调用Query方法

//4判断是不是删除正确
if(result >0 ){
System.out.println("删除成功");
}
else{
System.out.println("删除失败");
}

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package CRUDlianxi;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
public class MainTest {
public static void main(String[] args) throws SQLException {

//1.获得连接对象
java.sql.Connection conn=JDBC.getConn();

//2.根据连接对象,得到statement
java.sql.Statement st=conn.createStatement();

//3.执行sql语句,返回ResultSet
String sql="delete from s_stu where id=22"; //写sql语句
int result = st.executeUpdate(sql);//返回给ResultSet对象 st连接对象去调用Query方法

//4判断是不是删除正确
if(result >0 ){
System.out.println("删除成功");
}
else{
System.out.println("删除失败");
}

}
}

删除结果如下:

删除之后数据库的样子:


四、插入

  和修改操作相比只是sql语句不同,调用的方法都相同。

1
2
3
4
5
6
7
8
9
10
//3.执行sql语句,返回ResultSet
String sql="insert into s_stu (id,name,age) values (66,'wangqiang',28)"; //写sql语句
int result = st.executeUpdate(sql);//返回给ResultSet对象 st连接对象去调用Query方法

//4判断是不是删除正确
if(result >0 ){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package CRUDlianxi;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
public class MainTest {
public static void main(String[] args) throws SQLException {

//1.获得连接对象
java.sql.Connection conn=JDBC.getConn();

//2.根据连接对象,得到statement
java.sql.Statement st=conn.createStatement();

//3.执行sql语句,返回ResultSet
String sql="insert into s_stu (id,name,age) values (66,'wangqiang',28)"; //写sql语句
int result = st.executeUpdate(sql);//返回给ResultSet对象 st连接对象去调用Query方法

//4判断是不是删除正确
if(result >0 ){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}

}
}

插入结果如下:

插入之后数据库的样子:


代码步骤总结:

  1. 需要去拷贝JDBC文件内的JDBC类还有properties文件(有url/name/password等),之后导入mysql和java的jar连接包。

  1. 根据类.getConn()方法—>连接对象conn
    java.sql.Connection conn=JDBC.getConn();
  2. 根据对象调取createStatement()方法—>关键对象st
    java.sql.Statement st=conn.createStatement();
  3. 然后编写sql语句—>关键对象st调用相关方法(SQL)
    1
    2
    String sql="xxxx";  //写sql语句		
    int result = st.executeUpdate(sql);//返回给ResultSet对象 st连接对象去调用Query方法
  4. 按查询的话可以遍历输出答案,如果是其他三种就可以让返回int整数判断是不是成功修改。
if(result >0 )
{
    System.out.println("添加成功");
}
else
{    
    System.out.println("添加失败");
}

数据库

一、数据库分类

  1. mysql:开源免费(.7之前)的适用于中小型企业的免费数据库。最后sun公司被oracle收购。
  2. mariadb:有mysql创作人提出的相当于mysql开源版本的一个分支(命令基本一样)
  3. oracle:甲骨文公司的商业收费软件,适用于大型电商网站
  4. db2:IBM公司解决软件和硬件方案的服务器架构,适用于银行系统
  5. sql server:windows里面的政府网站asp.net,大学教学使用(图形化界面)
  6. sybase:被淘汰

二、关系型数据库和非关系型数据库区别

  • 非关系型数据库(NOSQL)
    key:value
  • 关系型数据库(E-R图)
  1. 实体:方框
  2. 属性:椭圆
  3. 关系:菱形


三、mysql的SQL语句(结构化查询语言)

DDL(数据定义语言):定义数据库、数据表它们的结构

1
create(创建) drop(删除) alter(修改)

DML(数据操纵语言):主要对数据

1
insert(插入) update(修改) delete(删除)

DCL(数据控制语言):定义访问权限

1
grant(授权)

DQL(数据查询语言)

1
select(查询) from子句 where子句

四、数据库的概述图

JDBC的工具类

一、释放资源

  主要是在所有的操作结束之后,需要释放资源(close()方法)

1
2
3
4
5
6
7
8
9
10
11
12
13

if (rs != null) //添加一个判断rs对象是不是空(防止一行都没有)
{
try
{
rs.close();
}
catch (SQLException sqlEx)
{
} // ignore

rs = null;
}

二、 驱动注册#

  原来的DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Driver 这个类里面有静态代码块,一上来就执行了,所以等同于我们注册了两次驱动。 其实没这个必要的。
//静态代码块 —> 类加载了,就执行。

最后形成以下代码即可。
Class.forName("com.mysql.jdbc.Driver");    
1
2
3
4
5
6
7
8
//1.注册驱动
//DriverManager.registerDriver(new Driver()); //需要一个参数 这个参数是java.sql.jdbc.Driver
try {
Class.forName("com.mysql.jdbc.Driver"); //直接使用forName方法
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

三、连接对象整合

  其实就是把1注册驱动和2建立连接拿出来专门做一个getconn()方法,方便将前两步整合在一起。第三步开始只需要调用方法得到结果就可以。

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package lianxi;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class JDBC{

//写在外面好更改
static String url="jdbc:mysql://localhost/student";
static String name="root";
static String password="njdxrjgc7777777.";

public static java.sql.Connection getConn(){ //新建一个方法整合
java.sql.Connection conn=null;

//1.注册驱动
//DriverManager.registerDriver(new Driver()); //需要一个参数 这个参数是java.sql.jdbc.Driver
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

//2.建立连接(url协议+数据库,user账号,password密码)
try {
conn=DriverManager.getConnection(url,name,password);
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return conn;
}

public static void main(String[] args) throws SQLException{
java.sql.Connection conn = getConn(); //创建conn去得到刚才那个方法的结果
//3.创建statement,跟数据库打交道,一定需要这个对象
java.sql.Statement st=conn.createStatement();

//4.执行查询
String sql="select * from s_stu";
ResultSet rs=st.executeQuery(sql);

//5.遍历每一条查询
while(rs.next()) //是否可以移动到下一行
{
int id=rs.getInt("id"); //获得id
String name=rs.getString("name"); //获得name
int age=rs.getInt("age"); //获得age
System.out.println("id="+id+" name="+name+" age="+age);
}

//6.释放
rs.close();
}
}

最终代码如下:


四、创建properties

  将url,name,password等放在配件内(代码如上的完整代码为例)

src下新建一个文件(properties)里面存放这几条内容

1
2
3
4
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student"
name=root
password=njdxrjgc7777777.

创建文件目录:


五、读取properties

  主要是要将driverClass/url/name/password改到文档里之后,将四个写成static的null然后写一个static{}去加载文档内容。

主要步骤:

  1. 创建一个Properties属性配置对象。
  2. 先创建一个InputStream对象,然后调动Properties对象的load()方法去加载输入流。
  3. 使用Properties对象的getProperties()方法获取 url/name等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//写在外面好更改
static String driverClass=null;
static String url=null;
static String name=null;;
static String password=null;

static{

//1.创建一个属性配置对象
Properties properties=new Properties();

InputStream is=JDBC.class.getClassLoader().getResourceAsStream("properties"); //类.class.getClassLoader().getResourceAsStream("文件名");
//2.导入输入流
try {
properties.load(is); //load方法加载
} catch (IOException e) {
e.printStackTrace();
}

//3.调用方法读取文档里面的url/name/password等
driverClass=properties.getProperty("driverClass");
url=properties.getProperty("url");
name=properties.getProperty("name");
password=properties.getProperty("password");
}

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package lianxi;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class JDBC{
//写在外面好更改
static String driverClass=null;
static String url=null;
static String name=null;;
static String password=null;

static{

//1.创建一个属性配置对象
Properties properties=new Properties();

InputStream is=JDBC.class.getClassLoader().getResourceAsStream("properties"); //类.class.getClassLoader().getResourceAsStream("文件名");
//2.导入输入流
try {
properties.load(is); //load方法加载
} catch (IOException e) {
e.printStackTrace();
}

//3.调用方法读取文档里面的url/name/password等
driverClass=properties.getProperty("driverClass");
url=properties.getProperty("url");
name=properties.getProperty("name");
password=properties.getProperty("password");
}

public static java.sql.Connection getConn(){
java.sql.Connection conn=null;
//1.注册驱动
//DriverManager.registerDriver(new Driver()); //需要一个参数 这个参数是java.sql.jdbc.Driver
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//2.建立连接(url协议+数据库,user账号,password密码)
try {
conn=DriverManager.getConnection(url,name,password);
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return conn;
}

public static void main(String[] args) throws SQLException{
java.sql.Connection conn = getConn();
//3.创建statement,跟数据库打交道,一定需要这个对象
java.sql.Statement st=conn.createStatement();

//4.执行查询
String sql="select * from s_stu";
ResultSet rs=st.executeQuery(sql);

//5.遍历每一条查询
while(rs.next()) //是否可以移动到下一行
{
int id=rs.getInt("id"); //获得id
String name=rs.getString("name"); //获得name
int age=rs.getInt("age"); //获得age
System.out.println("id="+id+" name="+name+" age="+age);
}

//6.释放
rs.close();
}
}

读取结果:


JDBC

一、JDBC概述

  SUN公司提供的一种数据库访问规则、规范。用于JAVA和各种数据库连接!我们的JAVA程序只需要使用sun公司提供的jdbc驱动就行!


二、JDBC入门案例#

  • 1.准备好jdbc的外部引入的库(网上也有!)。

  • 2.下载好MYSQL5.5 然后下载一个navicat(可视化软件)方便建立数据库等。

  • 3.创建一个student的数据库,然后建立表s_stu,并且往里填充三条数据。

  • 4.然后按照步骤进行编写代码

    • 4.1注册驱动 DriverManager.registerDriver(new Driver());
    • 4.2建立连接 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/student", "root","njdxrjgc7777777.");
    • 4.3创建和数据库打交道的对象 Statement st=conn.createStatement();
    • 4.4执行查询 st.executeQuery(sql);
    • 4.5遍历查询 rs.get()方法
    • 4.6释放 rs.close()

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class JDBC{
public static void main(String[] args) throws SQLException{
//1.注册驱动
DriverManager.registerDriver(new Driver()); //需要一个参数 这个参数是java.sql.jdbc.Driver

//2.建立连接(url协议+数据库,user我的主机账号,password我的主机密码)
java.sql.Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/student", "root","njdxrjgc7777777.");

//3.创建statement,跟数据库打交道,一定需要这个对象
java.sql.Statement st=conn.createStatement();

//4.执行查询
String sql="select * from s_stu";
ResultSet rs=st.executeQuery(sql);

//5.遍历每一条查询
while(rs.next()) //是否可以移动到下一行
{
int id=rs.getInt("id"); //获得id
String name=rs.getString("name"); //获得name
int age=rs.getInt("age"); //获得age
System.out.println("id="+id+"===name"+name+"==age="+age);
}

//6.释放
rs.close();

}
}

查询结果如下:


bootstrap实现网站首页

一、步骤分析

1.引入相关文件
2.分析写一个div布局容器  class=".container"
3.放8行row去放8个模块

二、代码框架搭建

先引入相关的文件之后搭建外部布局容器内部写8个div块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="../css/bootstrap.css" />

<!--先引入JQuery才可以引入Bootstrap-->
<!--<script type="text/javascript" src="../js/jquery-1.11.0.js" ></script>-->

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script type="text/javascript" src="../js/bootstrap.js"></script>

<!--为了保证适当的绘制和触屏缩放,需要在head之内添加viewport元数据标签-->
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<!--外部布局容器-->
<div class="container">
<div class="row">

</div>

<div class="row">

</div>

<div class="row">

</div>

<div class="row">

</div>

<div class="row">

</div>

<div class="row">

</div>

<div class="row">

</div>

<div class="row">

</div>
</div>
</body>
</html>

三、代码分析:

  1. logo部分:三个部分分别使用div标签去放图片和标签(col-md col-sm col-xs 分别是存的大小和区域)。
  2. 导航栏部分:去bootstra里css里面的导航栏部分代码,只需要修改内容文字即可。
  3. 轮播图部分:去bootstra里js插件里面的轮播图部分代码,加入图片就可以了。
  4. 最新图片部分:只需要嵌套一个div加图片然后col-md-12让完整的存放在container区域内。
  5. 商品部分:分为左边大图和右边大图和9个微波炉图片,分别需要规定col的大小,然后添加图片和文字描述(text-align居中)。
  6. 广告部分:只需要添加图片(同4步骤)。
  7. 商品部分:同5部分。
  8. 最后的栏目部分:添加一堆标签(text-align居中)。

四、具体代码:

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="../css/bootstrap.css" />

<!--需要引入JQuery-->
<script type="text/javascript" src="../js/jquery-1.11.0.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script type="text/javascript" src="../js/bootstrap.js"></script>

<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<!--外部布局容器-->
<div class="container">
<!--1.logo部分 三个部分 两个图片一个标签块-->
<div class="row">
<div class="col-md-4 col-sm-6 col-xs-6"> <!--更改大小时候进行隐藏-->
<img src="../img/logo2.png" />
</div>
<div class="col-md-4 hidden-sm hidden-xs ">
<img src="../img/header.png" />
</div>
<div class="col-md-4 col-sm-6 col-xs-6" style="line-height:50px;height: 50px;"> <!-去调整位置和高度--->
<a href="#">登录</a>
<a href="#">注册</a>
<a href="#">购物车</a>
</div>
</div>

<!--2.导航栏部分 去找css里面导航栏的代码用-->
<nav class="navbar navbar-inverse"> <!--navbar-inverse背景色改为黑色-->
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">首页</a> <!--改成首页-->
</div>

<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active">
<a href="#">手机数码 <span class="sr-only">(current)</span></a>
</li>
<li>
<a href="#">电脑办公</a>
</li>
<li>
<a href="#">鞋靴箱包</a>
</li>
<li>
<a href="#">香烟酒水</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">全部分类 <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="#">手机数码</a>
</li>
<li>
<a href="#">电脑办公</a>
</li>
<li>
<a href="#">鞋靴箱包</a>
</li>
<li class="divider"></li>
<li>
<a href="#">香烟酒水</a>
</li>
<li class="divider"></li>
<li>
<a href="#">花生瓜子</a>
</li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right" role="search"> <!--navbar-right将搜索栏放在右边-->
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container-fluid -->
</nav>

<!--3.轮播图 使用js插件找代码-->
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel" data-interval="1000"> <!--data-interval="1000"加自动换时间-->
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
<li data-target="#carousel-example-generic" data-slide-to="1"></li>
<li data-target="#carousel-example-generic" data-slide-to="2"></li>
</ol>

<!-- Wrapper for slides -->
<div class="carousel-inner" role="listbox">
<div class="item active">
<img src="../img/1.jpg" alt="图片加载失败"> <!--加图片-->
<div class="carousel-caption">
...
</div>
</div>
<div class="item">
<img src="../img/2.jpg" alt="图片加载失败"> <!--加图片-->
<div class="carousel-caption">
...
</div>
</div>
<div class="item">
<img src="../img/3.jpg" alt="图片加载失败"> <!--加图片-->
<div class="carousel-caption">
...
</div>
</div>
</div>

<!-- Controls -->
<a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>

<!--4.最新商品 -->
<div class="row">
<div class="col-md-12">
<h3>最新商品<img src="../images/title2.jpg"/></h3>
</div>
</div>

<!--5.商品部分 -->
<div class="row">
<!--左边大图-->
<div class="col-md-2 hidden-sm hidden-xs"> <!--在一定情况下隐藏-->
<img src="../products/hao/big01.jpg" width="100%" height="100%"/>
</div>
<!--右边商品-->
<div class="col-md-10">
<!--右边第一行的大图-->
<div class="col-md-6">
<img src="../products/hao/middle01.jpg" />
</div>

<!--右边的小图-->
<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2 col-sm-4 col-xs-6" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现 然后在一定情况下显示4/6个-->
<img src="../products/hao/small06.jpg"/>
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>
</div>
</div>

<!--6. 广告部分-->
<div class="row">
<div class="col-md-12"> <!--占一行12-->
<img src="../products/hao/ad.jpg" width="100%"/>
</div>
</div>

<!--7.商品部分 -->
<div class="row">
<!--左边大图-->
<div class="col-md-2">
<img src="../products/hao/big01.jpg" width="100%" height="100%"/>
</div>
<!--右边商品-->
<div class="col-md-10">
<!--右边第一行的大图-->
<div class="col-md-6">
<img src="../products/hao/middle01.jpg" />
</div>

<!--右边的小图-->
<div class="col-md-2" style="text-align: center;height: 240px;"> <!--指定高度让第二行的从最左边开始出现-->
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>

<div class="col-md-2" style="text-align: center;height: 240px;">
<img src="../products/hao/small09.jpg" />
<p>微波炉</p>
<p style="color: red;">$998</p>
</div>
</div>
</div>

<!-- footer -->
<div class="row">
<div class="col-md-12">
<img src="../img/footer.jpg" width="100%"/>
</div>
</div>

<div style="text-align: center;">
<a href="#">关于我们</a>
<a href="#">联系我们</a>
<a href="#">招贤纳士</a>
<a href="#">法律声明</a>
<a href="#">友情链接</a>
<a href="#">支付方式</a>
<a href="#">配送方式</a>
<a href="#">服务声明</a>
<a href="#">广告声明</a><br />
Copyright © 2005-2016 传智商城 版权所有
</div>

</div>
</body>
</html>

配合col达到响应式页面如下:

boostrap实现导航条

一、寻找文档

查看的文档:
file:///F:/%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6/%E4%BB%A3%E7%A0%81/%E8%B5%84%E6%96%99/Bootstrap3.3.4%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3/v3.bootcss.com/javascript/index.htm#carousel

拿出里面的模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

<div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
<li data-target="#carousel-example-generic" data-slide-to="1"></li>
<li data-target="#carousel-example-generic" data-slide-to="2"></li>
</ol>

<!-- Wrapper for slides -->
<div class="carousel-inner" role="listbox">
<div class="item active">
<img src="..." alt="...">
<div class="carousel-caption">
...
</div>
</div>
<div class="item">
<img src="..." alt="...">
<div class="carousel-caption">
...
</div>
</div>
...
</div>

<!-- Controls -->
<a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>

更改后最终模板代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title></title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="../css/bootstrap.css" />

<!--需要引入JQuery-->
<script type="text/javascript" src="../js/jquery-1.11.0.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script type="text/javascript" src="../js/bootstrap.js"></script>

<meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
<div class="container">

<nav class="navbar navbar-inverse">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">首页</a>
</div>

<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active">
<a href="#">手机数码 <span class="sr-only">(current)</span></a>
</li>
<li>
<a href="#">电脑办公</a>
</li>
<li>
<a href="#">鞋靴箱包</a>
</li>
<li>
<a href="#">香烟酒水</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">全部分类 <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="#">手机数码</a>
</li>
<li>
<a href="#">电脑办公</a>
</li>
<li>
<a href="#">鞋靴箱包</a>
</li>
<li class="divider"></li>
<li>
<a href="#">香烟酒水</a>
</li>
<li class="divider"></li>
<li>
<a href="#">其它分类</a>
</li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right" role="search">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>

</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container-fluid -->
</nav>

<div>
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel" data-interval="500"> <!--加一个自动更换时间data-interval-->
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
<li data-target="#carousel-example-generic" data-slide-to="1"></li>
<li data-target="#carousel-example-generic" data-slide-to="2"></li>
</ol>

<!-- Wrapper for slides -->
<div class="carousel-inner" role="listbox">
<div class="item active">
<img src="../img/1.jpg" alt="...">
<div class="carousel-caption">
<h3>电脑大促销</h3>
<p>黑马出品电脑黑马出品电脑黑马出品电脑</p>
</div>
</div>
<div class="item">
<img src="../img/2.jpg" alt="...">
<div class="carousel-caption">
<h3>电脑大促销</h3>
<p>黑马出品电脑黑马出品电脑黑马出品电脑</p>
</div>
</div>
<div class="item">
<img src="../img/3.jpg" alt="...">
<div class="carousel-caption">
<h3>电脑大促销</h3>
<p>黑马出品电脑黑马出品电脑黑马出品电脑</p>
</div>
</div>
</div>

<!-- Controls -->
<a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>

</div>

<!--在自己增加三个快的东西 ,使用col-md sm xs去分区域-->

<div class="row">
<div class="col-md-4 col-sm-6 col-xs-4">
<h3>公司简介</h3>
<p>黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员</p>
<a href="http://www.itheima.com" class="btn btn-danger pull-right">了解更多</a>
</div>
<div class="col-md-4 col-sm-6 col-xs-4">
<h3>公司愿景</h3>
<p>黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员</p>
<a href="http://www.itheima.com" class="btn btn-info pull-right">了解更多</a>
</div>
<div class="col-md-4 col-xs-4">
<h3>联系我们</h3>
<p>黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员黑马程序员</p>
<a href="http://www.itheima.com" class="btn btn-primary pull-right">了解更多</a>
</div>
</div>

</div>
</body>

</html>

导航条案例:

JQ实现老黄历

一、使用JQuery发送请求局部刷新页面

  • 数据交换格式(服务器-客户端):

1. json:

1
2
JSON对象:{key1:value}   ---例如:{"username":"zhangsan","password":"134560"}
JSON数组:[{key1:value}{key1:value}{key1:value}]

2. xml:

实现老黄历主要代码如下:

1
2
3
4
5
6
7
 1.使用get方法
$.get(url,function(jsonArr){里面具体变换},json);
2.写好一个数据json文件 用来去调用
var url = "http://127.0.0.1:8848/day05-bootstrap/data.json";
3.寻找ul标签就是使用 ".good ul" //类加载器 标签(后代)
$(".bad ul").append("<li><div class='name'>"+obj.name+"</div><div class='description'>"+obj.bad+"</div></li>")
//class使用外引入的css文件里面的类加载器

具体代码如下:

所引入的css和js文件都存在本代码文件夹内

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="../css/laohuangli.css" />
<script type="text/javascript" src="../js/jquery-1.11.0.js"></script>
<script>
//文档加载事件
$(function(){

//请求链接,动态显示数据ajax
//JQ的get方法(url:待载入的页面,data:待发送key/value值,callback:载入成功回调函数,type:返回内容格式xml/html/script/json/text/_default)
var url = "http://127.0.0.1:8848/day05-bootstrap/data.json"; //获取到那些临时刷新的数据

//ajax 最简单异步请求网络
$.get(url,function(jsonArr){ //存到数组去
var i=Math.floor(Math.random()*3+3); //JS的方法 得到1/2/3这三个整数
while(i>0){ //随机循环取几条数据
//随机去取一条数据
var index=Math.floor(Math.random()*jsonArr.length);
var obj=jsonArr[index];
//适合干嘛
$(".good ul").append("<li><div class='name'>"+obj.name+"</div><div class='description'>"+obj.good+"</div></li>");
i--;
}

var j = Math.floor(Math.random()*3+2) //
while(j > 0){
var index = Math.floor(Math.random()*jsonArr.length)
var obj = jsonArr[index];
//不适合干嘛
$(".bad ul").append("<li><div class='name'>"+obj.name+"</div><div class='description'>"+obj.bad+"</div></li>")
j--;
}
});

});
</script>
</head>
<body>
<div class="container">
<div class="title">
程序员老黄历
</div>
<div class="good">
<div class="title">
<table>
<tr><td>宜</td></tr>
</table>
</div>
<div class="content">
<ul>


</ul>
</div>
<div class="clear"></div>
</div>

<div class="split"></div>

<div class="bad">
<div class="title">
<table>
<tr><td>不宜</td></tr>
</table>
</div>
<div class="content">
<ul>


</ul>
</div>
<div class="clear"></div>
</div>
</div>
</body>
</html>

代码结果如下:


JQ实现表单校验

一、trigger和triggerHandler区别

trigger:触发事件,将光标移入框内(比较好)
triggerHandler:仅仅触发事件所对应的函数

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript" src="../js/jquery-1.11.0.js"></script>

<script>
$(function(){
$("#username").focus(function(){
console.log("text focus被触发了!"); //控制台输出一句话
});

$("#btn1").click(function(){ //第一个按钮的点击事件
//触发一下text的focus
$("#username").trigger("focus");
});

$("#btn2").click(function(){ //第二个按钮的点击事件
//触发一下text的focus
$("#username").triggerHandler("focus");
});

});

</script>
</head>
<body>
用户名:<input type="text" id="username"><br>
<input type="button" value="triggerH触发一下focus" id="btn1">
<input type="button" value="triggerHandler触发一下focus" id="btn2">
</body>
</html>

代码结果如下:


二、JQ方式实现表单检验

步骤分析:

1.导入相关JQ文件
2.文档加载事件:必填项后加一个小红点
3.表单校验确定事件: blur onfoucs onkeyup
4.提交表单:sumbit

具体操作分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1.进行导入相关JQ文件和css文件:
<link rel="stylesheet" type="text/css" href="../css/style.css"/>
<script type="text/javascript" src="../js/jquery-1.11.0.js" ></script>

2.放置好一个按钮和三个input然后去找css文件的high类给input的属性加红色*(利用after方法)
$(".bitian").after("<font class='high'>*</font>");

3.给两个input设置blur事件(keyup.focus事件链式(triggerHandler()方法触发))
$(".bitian").blur(function(){}).focus(function(){}).keyup(function(){});

4.通过is()方法判断是密码还是用户名操作
&(this).is("#username"/"password")

5.判断之后提示使用append()方法输出(想要在*之后输出)
$(this).parent().append("<span class='formtips onError'>密码太短了!</span>");

6.输出之后如果不清空(remove()方法)就一直弹出

$(this).parent().find(".formtips").remove();

7.最后就是整个表单提交(JS是所有的true才能提交),JQ是使用trigger("blur")去判断出错长度,出错少于0就成功
$(".bitian").trigger("blur"); //去blur测试会出现错误次数
var length=$(".onError").length;

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" type="text/css" href="../css/style.css"/>
<script type="text/javascript" src="../js/jquery-1.11.0.js" ></script>
<script>
$(function(){

//在后面加下红点*
$(".bitian").after("<font class='high'>*</font>"); //调用css文件内的high类加载器变红色--在两个input后面加*

//事件绑定
$(".bitian").blur(function(){ //取消焦点事件
var value=this.value;

//清空当前必填项后面的span(不删除之前只要出错就弹出)
$(this).parent().find(".formtips").remove();

//获得当前事件是谁触发
if($(this).is("#username"))
{
//校验用户名
if(value.length<6){
$(this).parent().append("<span class='formtips onError'>用户名太短了!</span>");
}
else{
$(this).parent().append("<span class='formtips onSuccess'>用户名成功了!</span>");
}
}
if($(this).is("#password"))
{
//校验密码
if(value.length<3){
$(this).parent().append("<span class='formtips onError'>密码太短了!</span>");
}
else{
$(this).parent().append("<span class='formtips onSuccess'>密码成功了!</span>");
}
}
}).focus(function(){ //链式
$(this).triggerHandler("blur");
}).keyup(function(){
$(this).triggerHandler("blur");
});

//给表单绑定提交事件
$("form").submit(function(){
//触发必选项的校验逻辑
$(".bitian").trigger("blur"); //去blur测试会出现错误次数
var length=$(".onError").length //去测试这个错误次数的个数
if(length>0){
return false; //如果有错误提示那么就不能提交
}
return true;
});
});

</script>

</head>
<body>
<form action="../index.html" > //跳转到一个页面(自己选)
<div>
用户名:<input type="text" class="bitian" id="username"> /放入同一类
</div>
<div>
密码:<input type="password" class="bitian" id="password">
</div>
<div>
手机号:<input type="tel">
</div>
<div>
<input type="submit">
</div>
</form>
</body>
</html>

代码结果如下:


Bootstrap

一、Bootstrap概述

  是目前受欢迎的前端框架(CSS/HTML框架),基于HTML、CSS、JAVASCRIPT的比较简单灵活。可以直接去调用类加载器!!!很方便!!!

参考文档:
file:///F:/%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6/%E4%BB%A3%E7%A0%81/%E8%B5%84%E6%96%99/Bootstrap3.3.4%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3/v3.bootcss.com/css/index.htm

以后写代码之前一定要引入的文件(head内):

1
2
3
4
5
6
7
8
9
10
11
12

<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="../css/bootstrap.css" />

<!-先引入JQuery才可以引入Bootstrap文件-->
<!--<script type="text/javascript" src="../js/jquery-1.11.0.js" ></script>-->

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script type="text/javascript" src="../js/bootstrap.js"></script>

<!--为了保证适当的绘制和触屏缩放,需要在head之内添加viewport元数据标签-->
<meta name="viewport" content="width=device-width, initial-scale=1">

二、布局容器(.container容器)

1. .container类—用于固定宽度并且支持响应式布局的容器

1
2
3
<div class="container">
代码内容
</div>

2. .container-fluid类—用于100%宽度,占据全部视口(vewport)的容器

1
2
3
<div class="container">
代码内容
</div>

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>

<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="../css/bootstrap.css" />

<!--先引入JQuery才可以引入Bootstrap-->
<!--<script type="text/javascript" src="../js/jquery-1.11.0.js" ></script>-->

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script type="text/javascript" src="../js/bootstrap.js"></script>

<!--为了保证适当的绘制和触屏缩放,需要在head之内添加viewport元数据标签-->
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
<div class="container"> <!--使用外部引入的文件container类会给输出两边留一定的空白处 让页面更好看点-->
我们去吃饭吧!我们去吃饭吧!我们去吃饭吧!我们去吃饭吧!我们
</div>
</body>
</html>

代码结果如下:


三、bootstrap栅格

  Bootstrap提供一套响应式移动设备优先的流式栅格系统,随着屏幕/视角尺寸的增加,一行会分配(最多12列)。

适应手机:.col-xs
适应平板:.col-sm
适应桌面:.col-md

主要是分区域:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>

<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="../css/bootstrap.css" />

<!--先引入JQuery才可以引入Bootstrap-->
<!--<script type="text/javascript" src="../js/jquery-1.11.0.js" ></script>-->

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script type="text/javascript" src="../js/bootstrap.js"></script>

<!--为了保证适当的绘制和触屏缩放,需要在head之内添加viewport元数据标签-->
<meta name="viewport" content="width=device-width, initial-scale=1">

</head>

<body>
<div class="container"> <!--使用外部引入的文件container类会给输出两边留一定的空白处 让页面更好看点-->
<div class="row">
<div class="col-md-1 col-sm-2 col-xs-4">.col-md-1</div>
<div class="col-md-1 col-sm-2 col-xs-4">.col-md-1</div>
<div class="col-md-1 col-sm-2 col-xs-4">.col-md-1</div>
<div class="col-md-1 col-sm-2">.col-md-1</div>
<div class="col-md-1 col-sm-2">.col-md-1</div>
<div class="col-md-1 col-sm-2">.col-md-1</div>

<div class="col-md-1">.col-md-1</div>
<div class="col-md-1">.col-md-1</div>
<div class="col-md-1">.col-md-1</div>
<div class="col-md-1">.col-md-1</div>
<div class="col-md-1">.col-md-1</div>
<div class="col-md-1">.col-md-1</div>
</div>
<div class="row">
<div class="col-md-8">.col-md-8</div>
<div class="col-md-4">.col-md-4</div>
</div>
<div class="row">
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4">.col-md-4</div>
</div>
<div class="row">
<div class="col-md-6">.col-md-6</div>
<div class="col-md-6">.col-md-6</div>
</div>

</div>
</body>
</html>

页面分布格局:


四、表格(class=”table”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="../css/bootstrap.css" /> //调用css文件
</head>
<body >
<table class="table"> //只需要给它一个table类
<tr >
<td>
<input type="checkbox" />
</td>
<td>分类ID</td>
<td>分类名称</td>
<td>分类商品</td>
<td>分类描述</td>
<td>操作</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>1</td>
<td>手机数码</td>
<td>华为,小米,尼康</td>
<td>黑马数码产品质量最好</td>
<td>
<a href="#">修改</a>|<a href="#">删除</a>
</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>2</td>
<td>成人用品</td>
<td>充气的</td>
<td>这里面的充气电动硅胶的</td>
<td><a href="#">修改</a>|<a href="#">删除</a></td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>3</td>
<td>电脑办公</td>
<td>联想,小米</td>
<td>笔记本特卖</td>
<td><a href="#">修改</a>|<a href="#">删除</a></td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>4</td>
<td>馋嘴零食</td>
<td>辣条,麻花,黄瓜</td>
<td>年货</td>
<td><a href="#">修改</a>|<a href="#">删除</a></td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>5</td>
<td>床上用品</td>
<td>床单,被套,四件套</td>
<td>都是套子</td>
<td><a href="#">修改</a>|<a href="#">删除</a></td>
</tr>
</table>
</body>
</html>

使用其中的table:


五、bootstrap组件(font文件夹里面)

,