Java Web项目(一)
框架
java web项目总工分为两部分:客户端(前端)和服务端(后端)
客户端发起请求,服务端接受请求并进行处理
发起请求的方式:from表单、jQuery + ajax
from表单 造成全局的变化,在发起请求时所有的数据都会被修改
jQuery + ajax 可以做到局部更新
tomcat是一个服务器,时刻等待请求到来
关系如图所示
项目的工作流程类似于去饭店吃饭,
url 是请求路径,相当于找指定的饭店,找到指定的服务员
type 是请求参数(有get post 等),相当于指定服务方式
data 是携带的参数,相当于特定要求
success 是成功的回调函数,相当于上菜
服务端
接收参数,相当于接受菜单
逻辑处理,提供对应的服务,相当于后厨的加工
(如果需要)操作数据库,数据库就相当于仓库
返回数据,即上菜
注:所有的信息不是存在后端,而是存在数据库
get和post的区别
1.传参方式不同
post 传参用data域
get 则在url中传参
格式 url:" 对应Servlet类文件名?要传的参数=参数值 "
当参数不止一个时,用& 等连接符
2.发起范围不同
get :只要能写地址的地方都可以发起get请求(包括url 、浏览器的地址栏、前端中的<a href=" "></a>标签.....)
post: 请求发起需要ajax+jquery 或者form表单(现不用)
3.常用作用范围
get常用于查找
post 常用于查找以外的功能,如添加、修改、删除等
servlet
servlet 相当于小服务员,同时处理服务端的多种操作,对少量数据进行处理,数据量太大时效果不好
有软件可将servlet的角色拆分开,分成controller 、 service 、 dao
controller专门接受客户端的信息,和客户端进行交互
service 进行各种各样的逻辑处理
dao 专门操作数据库,做处理后将内容返回service
service再将信息返回controller
controller再返回到客户端
Navicat
Mysql 数据库
Navicat 数据库的可视化工具
表中一般有一个"id" 作为主键,一般默认勾选使用"不是null键",即自动递增
数据库中的表的关系
一对一
该情况下经常把两个表合并成一张表,即将
id | name | age |
---|---|---|
1 | qqq | 26 |
2 | www | 36 |
3 | eee | 27 |
id | name | age |
---|---|---|
1 | aaa | 34 |
2 | sss | 27 |
3 | ddd | 28 |
变为
id | Wname | Wage | Mname | Mage |
---|---|---|---|---|
1 | qqq | 26 | sss | 27 |
2 | eee | 27 | aaa | 34 |
3 | www | 36 | ddd | 28 |
但方法不唯一,包括存外键、新建表格等
外键就是当前表格中的一个字段,但其取值有严格要求,必须来自于对应的另一张表中的主键
一对多
合成一张表时数据冗余
常用方法:把多的表设置外键,(少的表设置外键也会数据冗余)
有时也额外创造一张表存储关系,但是效率不如上述方法高
如:学生表和班级表
id | c_name | 总分 |
---|---|---|
1 | 一班 | 30 |
2 | 二班 | 36 |
3 | 三班 | 27 |
id | name | age | c_id |
---|---|---|---|
1 | aaa | 13 | 1 |
2 | sss | 14 | 3 |
3 | ddd | 15 | 2 |
4 | zzz | 12 | 3 |
5 | xxx | 14 | 1 |
6 | ccc | 15 | 2 |
多对多
无论是两张表合并,还是在一张表上单独加外键,都会造成数据只能使用新建表存外键的方式
例如:学生表和课程表
id | c_name | 总分 |
---|---|---|
1 | java | 30 |
2 | 数据结构 | 36 |
3 | python | 27 |
id | name | age |
---|---|---|
1 | aaa | 13 |
2 | sss | 14 |
3 | ddd | 15 |
4 | zzz | 12 |
5 | xxx | 14 |
6 | ccc | 15 |
s_id | c_id |
---|---|
1 | 3 |
1 | 2 |
3 | 3 |
4 | 1 |
... | ... |
操作数据库
操作数据库需要对应的驱动,
比如: Mysql驱动Mysql数据库
SqlServerl驱动SqlServerl数据库
因此为了简化操作,对驱动进行了规范:JDBC
操作数据库步骤:
1.加载驱动
Class.forName("com,mysql.jdbc.Driver") ----5.版本
Class.forName("com,mysql.cj.jdbc.Driver") ----8.版本
可能会报错,因为没有驱动
解决方法:
<1>异常抛出
但是在调方法时可能再次产生异常,所以可以调方法时继续抛出异常,也可以使用方法二
<2>try....catch....捕获异常
使用该方法时,正常情况下执行try中的内容,一旦有异常时,异常会被捕获并执行catch中的内容
catch(捕获指定异常内容)
eg:catch(ClassNotFoundException e) 指定捕获没有找到class的异常
catch(SQLException e) 指定捕获sql的异常
catch(Exception e) 捕获所有的异常
2.添加用户信息和url
String url="jdbc:mysql://localhost:端口号/需要连接的数据库";
String username ="root"; ---> 账号一般情况下默认为root
String password ="10027018"; ----> 密码自设
3.驱动管理类调用方法进行连接,得到连接对象(一般继续抛出异常)
驱动管理类 -----> DriverManager
调方法 -----> DriverManager.getConnection(url,username,password);
连接类 -----> Connection
4.创建执行sql的对象
其对应的类为Statement
用createStatement()方法
5.执行sql语句
executeQuery(sql) ---->执行查找的方法
executeUpdate(sql) ---->执行修改的方法,会返回受影响的行数
ResultSet ---->结果集 用于处理结果
6.对结果进行处理
获取指定某项下的数据,需要调方法getInt("数据名") Int根据数据类型变化
7.关闭/释放资源
资源名.close()